Перейти к содержимому
Калькуляторы

Local proxy ARP на Linux как сделать ?

По мотивам этой статьи

VLAN на пользователя: архитектура и альтернативы

захотелось провести небольшой эксперимент.

 

только вместо L3 свича Linux box, как сделать Proxy ARP между сегментами понятно,

 

а как скзать что пришедший ARP запрос на интерфейс нужно отправлять обратно в сегмент ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Стандартными средствами, насколько я знаю - никак. Либо писать демона, который будет отвечать на нужные ARP-запросы, либо патчить ядро. При этом ни в коем случае нельзя отвечать на запросы "who-has 0.0.0.0" и gratuitous ARP-запросы, где target IP == source IP. В противном случае у пользователя вылезет "Конфликт IP-адресов".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

типа такого?

$EBTABLES -t nat -N reply_ir_arp
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4 --limit 2/second --log --log-prefix "ARR " --log-level 7 --log-arp -j CONTINUE
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4  -j arpreply --arpreply-mac QQ:WW:EE:RR:TT:YY # MAC интерфейса

$EBTABLES -t nat -N spoof_ir_nets_br1
$EBTABLES -t nat -A spoof_ir_nets_br1 -p arp --arp-ptype IPv4 --arp-ip-src x.x.x.208/28 --arp-ip-dst x.x.x.208/28 -j reply_ir_arp

$EBTABLES -t nat -N input_from_br1
$EBTABLES -t nat -A input_from_br1 -p arp --arp-ptype IPv4 --arp-opcode 1 ! --arp-gratuitous -j spoof_ir_nets_br1

$EBTABLES -t nat -A PREROUTING --logical-in br1 -j input_from_br1

##################

$EBTABLES -A FORWARD --logical-in br1 --logical-out br1 -j DROP

 

Только есть один минус. Если абоненту выдано 2 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

типа такого?

$EBTABLES -t nat -N reply_ir_arp
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4 --limit 2/second --log --log-prefix "ARR " --log-level 7 --log-arp -j CONTINUE
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4  -j arpreply --arpreply-mac QQ:WW:EE:RR:TT:YY # MAC интерфейса

$EBTABLES -t nat -N spoof_ir_nets_br1
$EBTABLES -t nat -A spoof_ir_nets_br1 -p arp --arp-ptype IPv4 --arp-ip-src x.x.x.208/28 --arp-ip-dst x.x.x.208/28 -j reply_ir_arp

$EBTABLES -t nat -N input_from_br1
$EBTABLES -t nat -A input_from_br1 -p arp --arp-ptype IPv4 --arp-opcode 1 ! --arp-gratuitous -j spoof_ir_nets_br1

$EBTABLES -t nat -A PREROUTING --logical-in br1 -j input_from_br1

##################

$EBTABLES -A FORWARD --logical-in br1 --logical-out br1 -j DROP

 

Только есть один минус. Если абоненту выдано 2 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

в точку, что называется снимаю шляпу, незнал что так с iptables можно

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в точку, что называется снимаю шляпу, незнал что так с iptables можно

Это в ebtables.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

типа такого?

$EBTABLES -t nat -N reply_ir_arp
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4 --limit 2/second --log --log-prefix "ARR " --log-level 7 --log-arp -j CONTINUE
$EBTABLES -t nat -A reply_ir_arp -p arp --arp-ptype IPv4  -j arpreply --arpreply-mac QQ:WW:EE:RR:TT:YY # MAC интерфейса

$EBTABLES -t nat -N spoof_ir_nets_br1
$EBTABLES -t nat -A spoof_ir_nets_br1 -p arp --arp-ptype IPv4 --arp-ip-src x.x.x.208/28 --arp-ip-dst x.x.x.208/28 -j reply_ir_arp

$EBTABLES -t nat -N input_from_br1
$EBTABLES -t nat -A input_from_br1 -p arp --arp-ptype IPv4 --arp-opcode 1 ! --arp-gratuitous -j spoof_ir_nets_br1

$EBTABLES -t nat -A PREROUTING --logical-in br1 -j input_from_br1

##################

$EBTABLES -A FORWARD --logical-in br1 --logical-out br1 -j DROP

 

Только есть один минус. Если абоненту выдано 2 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

Это на каждом интерфейсе надо проделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в точку, что называется снимаю шляпу, незнал что так с iptables можно
Это в ebtables.

спасибо, хорошее название :),

и хороший пакет я уже посмотрел документацию по нему

 

Это на каждом интерфейсе надо проделать?
насколько я понял из описания только на том где нужен local proxy
Изменено пользователем packetizer

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это я не разобравшись запостил. Немного поигрался, на одном интерфейсе получилось сделать правда с некоторым использованием бубна. Но это от того что в первый раз. Еще поиграюсь попробовав что обязательно в найденой последовательности стучания в бубен, а что нет и уже решу как проще прикрутить.

Остался вопрос с производительностью этого решения

Изменено пользователем Beginner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ebtables -A FORWARD --logical-in br1 --logical-out br1 -j DROP

 

Это правило, насколько я понял, запрещает коммутировать пакеты между интерфейсами входящими в br1?

А если там только 1 eth интерфейс, то его можно опустить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Beginner

если там один интерфейс, то правила можно переписать на 1 интерфейс и обойтись без брижда.

 

Производительность должна быть "обычной".

 

Кстати, забыл еще один момент - надо отключить "Send ICMP redirects" на интерфейсе.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Beginner

если там один интерфейс, то правила можно переписать на 1 интерфейс и обойтись без брижда.

 

Производительность должна быть "обычной".

 

Кстати, забыл еще один момент - надо отключить "Send ICMP redirects" на интерфейсе.

А вот у меня почему то не получилось на 1 интерфейсе. Прикручивал напрямую к eth.xx - не заработало. Включил eth0.xx в brxx - не заработало. Перенес IP-адрес с eth0.xx на brxx - заработало.

 

Пробовал на Debian

Linux router 2.6.26-2-amd64 #1 SMP Wed Aug 19 22:33:18 UTC 2009 x86_64 GNU/Linux

 

Буду стучать в бубен дальше :)

Изменено пользователем Beginner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть подозрение что broute заворачивает весь трафик в routing и в bridge-процесс ничего не попадает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А вот у меня почему то не получилось на 1 интерфейсе. Прикручивал напрямую к eth.xx - не заработало. Включил eth0.xx в brxx - не заработало. Перенес IP-адрес с eth0.xx на brxx - заработало.

 

Пробовал на Debian

Linux router 2.6.26-2-amd64 #1 SMP Wed Aug 19 22:33:18 UTC 2009 x86_64 GNU/Linux

 

Буду стучать в бубен дальше :)

а у вас свич который собирает в Sub вланы в Super влан

отдает Super c тегом или нет ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я пока на отдельной витруальной сети экспериментирую. В ней клиенты просто изолированы друг от друга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://ebtables.sourceforge.net/examples/b...tml#ex_nobridge

Я правильно понял, что поднимать бридж все равно придется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://ebtables.sourceforge.net/examples/b...tml#ex_nobridge

Я правильно понял, что поднимать бридж все равно придется?

Да, ebtables на не-bridge интерфейсах, к сожалению, не работает.

Кстати, если бы кто-нибудь показал, как его этому научить, было бы здорово.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хм, действительно, похоже, без бриджа не работает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Странно

 

~ # ping 10.6.66.3

PING 10.6.66.3 (10.6.66.3) 56(84) bytes of data.

From 10.6.66.1: icmp_seq=1 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=2 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=3 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=4 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=5 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=6 Redirect Host(New nexthop: 10.6.66.3)

From 10.6.66.1: icmp_seq=8 Redirect Host(New nexthop: 10.6.66.3)

64 bytes from 10.6.66.3: icmp_seq=10 ttl=63 time=0.372 ms

From 10.6.66.1: icmp_seq=11 Redirect Host(New nexthop: 10.6.66.3)

64 bytes from 10.6.66.3: icmp_seq=11 ttl=63 time=0.330 ms

64 bytes from 10.6.66.3: icmp_seq=12 ttl=63 time=0.538 ms

64 bytes from 10.6.66.3: icmp_seq=13 ttl=63 time=0.494 ms

64 bytes from 10.6.66.3: icmp_seq=14 ttl=63 time=0.449 ms

64 bytes from 10.6.66.3: icmp_seq=15 ttl=63 time=0.412 ms

 

хотя

~# cat /proc/sys/net/ipv4/conf/br1/send_redirects

0

~# cat /proc/sys/net/ipv4/conf/eth0.666/send_redirects

0

~# brctl show

bridge name bridge id STP enabled interfaces

br1 8000.00093d1326f9 no eth0.666

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если поднять бридж на чистом, а не vlan'истом интерфейсе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Beginner, /proc/sys/net/ipv4/conf/{all,default}/send_redirects не пробовали крутить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Beginner, /proc/sys/net/ipv4/conf/{all,default}/send_redirects не пробовали крутить?

Вроде помогло. Значит на всех выключить, а если понадобится, то включать на отдельных?

Изменено пользователем Beginner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Beginner, видимо так. Если честно, до конца не понимаю логику работы all и default.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Только есть один минус. Если абоненту выдано 2 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

Ап :)

Подскажите, как разрулить проблему описанную выше?

Есть несколько вланов объединенных в бридж.

Пытался маркировать arp request в ячейке INPUT, а на выходе в ячейке OUTPUT фильтровать по маркировке.

Я так понимаю, что мне надо маркировать только арп реквесты на входе, а на выходе дропать реплай маркированные.

Делаю так:

ebtables -I INPUT -i vlan100 -p ARP --arp-opcode Request -j mark --set-mark 100

ebtables -A OUTPUT -o vlan100 -p ARP --arp-opcode Reply --mark 100 -j DROP

В инпут попадает, а вот в аутпут нет.

В чем засада?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В инпут попадает, а вот в аутпут нет.

В чем засада?

А где вообще сказано, что ebtables умеет определять связь между входящими-исходящими пакетами

и автоматически назначать метку с одного пакета на другой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В инпут попадает, а вот в аутпут нет.

В чем засада?

А где вообще сказано, что ebtables умеет определять связь между входящими-исходящими пакетами

и автоматически назначать метку с одного пакета на другой?

Согласен, затупил.

Возможно есть другое решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.