Jump to content
Калькуляторы

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

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

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

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

типа такого?

$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 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

 

Share this post


Link to post
Share on other sites
типа такого?

$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 можно

 

Share this post


Link to post
Share on other sites

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

Это в ebtables.

Share this post


Link to post
Share on other sites
типа такого?

$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 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера.

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

Share this post


Link to post
Share on other sites
в точку, что называется снимаю шляпу, незнал что так с iptables можно
Это в ebtables.

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

Edited by Beginner

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

Beginner

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

 

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

 

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

 

Share this post


Link to post
Share on other sites
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

 

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

Edited by Beginner

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А вот у меня почему то не получилось на 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 тегом или нет ?

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
http://ebtables.sourceforge.net/examples/b...tml#ex_nobridge

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Странно

 

~ # 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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Share this post


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

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

Edited by Beginner

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Только есть один минус. Если абоненту выдано 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

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

В чем засада?

Share this post


Link to post
Share on other sites

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

В чем засада?

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

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

Share this post


Link to post
Share on other sites

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

В чем засада?

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this