packetizer Posted January 5, 2010 Posted January 5, 2010 По мотивам этой статьи VLAN на пользователя: архитектура и альтернативы захотелось провести небольшой эксперимент. только вместо L3 свича Linux box, как сделать Proxy ARP между сегментами понятно, а как скзать что пришедший ARP запрос на интерфейс нужно отправлять обратно в сегмент ? Вставить ник Quote
Умник Posted January 5, 2010 Posted January 5, 2010 Стандартными средствами, насколько я знаю - никак. Либо писать демона, который будет отвечать на нужные ARP-запросы, либо патчить ядро. При этом ни в коем случае нельзя отвечать на запросы "who-has 0.0.0.0" и gratuitous ARP-запросы, где target IP == source IP. В противном случае у пользователя вылезет "Конфликт IP-адресов". Вставить ник Quote
vitalyb Posted January 5, 2010 Posted January 5, 2010 типа такого? $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 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера. Вставить ник Quote
packetizer Posted January 5, 2010 Author Posted January 5, 2010 типа такого? $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 можно Вставить ник Quote
Abram Posted January 5, 2010 Posted January 5, 2010 в точку, что называется снимаю шляпу, незнал что так с iptables можно Это в ebtables. Вставить ник Quote
Beginner Posted January 6, 2010 Posted January 6, 2010 типа такого? $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 адреса из одной подсети на два компа дома подключенных "через свитч", например, трафик между этими компами рискует пойти через провайдера. Это на каждом интерфейсе надо проделать? Вставить ник Quote
packetizer Posted January 7, 2010 Author Posted January 7, 2010 (edited) в точку, что называется снимаю шляпу, незнал что так с iptables можноЭто в ebtables. спасибо, хорошее название :), и хороший пакет я уже посмотрел документацию по нему Это на каждом интерфейсе надо проделать?насколько я понял из описания только на том где нужен local proxy Edited January 7, 2010 by packetizer Вставить ник Quote
Beginner Posted January 7, 2010 Posted January 7, 2010 (edited) Это я не разобравшись запостил. Немного поигрался, на одном интерфейсе получилось сделать правда с некоторым использованием бубна. Но это от того что в первый раз. Еще поиграюсь попробовав что обязательно в найденой последовательности стучания в бубен, а что нет и уже решу как проще прикрутить. Остался вопрос с производительностью этого решения Edited January 7, 2010 by Beginner Вставить ник Quote
Beginner Posted January 7, 2010 Posted January 7, 2010 ebtables -A FORWARD --logical-in br1 --logical-out br1 -j DROP Это правило, насколько я понял, запрещает коммутировать пакеты между интерфейсами входящими в br1? А если там только 1 eth интерфейс, то его можно опустить? Вставить ник Quote
vitalyb Posted January 7, 2010 Posted January 7, 2010 Beginner если там один интерфейс, то правила можно переписать на 1 интерфейс и обойтись без брижда. Производительность должна быть "обычной". Кстати, забыл еще один момент - надо отключить "Send ICMP redirects" на интерфейсе. Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 (edited) 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 January 8, 2010 by Beginner Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 Есть подозрение что broute заворачивает весь трафик в routing и в bridge-процесс ничего не попадает Вставить ник Quote
packetizer Posted January 8, 2010 Author Posted January 8, 2010 А вот у меня почему то не получилось на 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 тегом или нет ? Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 Я пока на отдельной витруальной сети экспериментирую. В ней клиенты просто изолированы друг от друга. Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 http://ebtables.sourceforge.net/examples/b...tml#ex_nobridge Я правильно понял, что поднимать бридж все равно придется? Вставить ник Quote
Ilya Evseev Posted January 8, 2010 Posted January 8, 2010 http://ebtables.sourceforge.net/examples/b...tml#ex_nobridgeЯ правильно понял, что поднимать бридж все равно придется? Да, ebtables на не-bridge интерфейсах, к сожалению, не работает.Кстати, если бы кто-нибудь показал, как его этому научить, было бы здорово. Вставить ник Quote
vitalyb Posted January 8, 2010 Posted January 8, 2010 Хм, действительно, похоже, без бриджа не работает... Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 Странно ~ # 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 Вставить ник Quote
voron Posted January 8, 2010 Posted January 8, 2010 А если поднять бридж на чистом, а не vlan'истом интерфейсе? Вставить ник Quote
Умник Posted January 8, 2010 Posted January 8, 2010 Beginner, /proc/sys/net/ipv4/conf/{all,default}/send_redirects не пробовали крутить? Вставить ник Quote
Beginner Posted January 8, 2010 Posted January 8, 2010 (edited) Beginner, /proc/sys/net/ipv4/conf/{all,default}/send_redirects не пробовали крутить? Вроде помогло. Значит на всех выключить, а если понадобится, то включать на отдельных? Edited January 8, 2010 by Beginner Вставить ник Quote
Умник Posted January 8, 2010 Posted January 8, 2010 Beginner, видимо так. Если честно, до конца не понимаю логику работы all и default. Вставить ник Quote
adminkg Posted March 31, 2012 Posted March 31, 2012 Только есть один минус. Если абоненту выдано 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 В инпут попадает, а вот в аутпут нет. В чем засада? Вставить ник Quote
Ilya Evseev Posted April 2, 2012 Posted April 2, 2012 В инпут попадает, а вот в аутпут нет. В чем засада? А где вообще сказано, что ebtables умеет определять связь между входящими-исходящими пакетами и автоматически назначать метку с одного пакета на другой? Вставить ник Quote
adminkg Posted April 3, 2012 Posted April 3, 2012 В инпут попадает, а вот в аутпут нет. В чем засада? А где вообще сказано, что ebtables умеет определять связь между входящими-исходящими пакетами и автоматически назначать метку с одного пакета на другой? Согласен, затупил. Возможно есть другое решение? Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.