Ubuntu Linux - несколько сетевых адаптеров, одна и та же локальная сеть... Ответы ARP всегда выходят из одной сетевой карты

У нас есть интернет-сервис AT&T U-Verse, который имеет чрезвычайно тупой шлюз DSL.

У нас есть 5 IP-адресов (маска сети 248), но шлюз не может делать ничего, кроме сопоставления одного IP-адреса -> одного MAC-адреса.

У нас есть один брандмауэр, и мы перенаправляем различные комбинации IP/ портов в разные места внутри DMZ.

Наше решение до сих пор состоит в том, чтобы иметь виртуальную машину VMWare на брандмауэре с 4 дополнительными сетевыми картами, чтобы получить остальные 4 IP-адреса... однако у нас есть проблема.

Шлюз в основном выполняет пинг ARP, чтобы узнать, отвечает ли IP ожидаемый MAC. С 4 сетевыми картами, расположенными в одной локальной сети, linux отвечает на запросы ARP для ВСЕХ IP-адресов, используя один интерфейс. Это не то, что ожидает шлюз, и это портит 3 другие сетевые карты. Шлюз отказывается маршрутизировать входящий трафик для IP-адресов, где результаты пинга ARP не являются ожидаемыми MAC.

Как мы можем получить ответы ARP для IP-адреса eth0, чтобы выйти из eth0, IP-адреса eth1 для выхода из eth1 и т. Д.?

РЕДАКТИРОВАТЬ

Ответ Кристофера Кэшелла не работает в этой ситуации. Я очень надеялся прочитать это, но... Нет.

РЕДАКТИРОВАТЬ 2

Решено! Смотрите мой ответ ниже.

5 ответов

Решение

Хорошо, вот решение. Во-первых, резюме:

Вот мой основной сетевой план:

 eth0 10.10.10.2 netmask 255.255.255.248
 eth1 10.10.10.3 netmask 255.255.255.248
 eth2 10.10.10.4 netmask 255.255.255.248
 eth3 10.10.10.5 netmask 255.255.255.248

Все интерфейсы перекрываются. Это технически неправильно и является источником всех моих бед... но я должен сделать это из-за этих тупых жилых ворот.

Во-первых, широковещательные запросы ARP идут на все это. Поскольку все 4 IP-адреса являются действительными локальными адресами, все 4 интерфейса будут пытаться ответить.

1) установить arptables. Добавьте это куда-нибудь во время загрузки (/etc/rc.local здесь):

arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP

Это предотвратит попадание трансляций в неправильный интерфейс. Таким образом, правильный интерфейс теперь будет единственным ответчиком.

Этого само по себе недостаточно. Следующий бит - это проблема таблицы ARP. Запрашивающий ПК, вероятно, уже имеет запись в таблице ARP, и поэтому Linux будет использовать интерфейс, связанный с этим. До тех пор, пока не истечет срок действия этой записи таблицы ARP, она будет пытаться отправлять ответы ARP, используя интерфейс этой записи, а не тот, который связан с запросом ARP.

Опция sysctl rp_filter, по-видимому, отклоняет исходящие пакеты ответа ARP, если они находятся на неправильном интерфейсе. Так...

2) Отключить rp_filter.

В Debian/Ubuntu это означает комментирование двух строк rp_filter в /etc/sysctl.d/10-network-security.conf.

Эта опция была включена по причине... а именно, чтобы помочь предотвратить атаки спуфинга между интерфейсами. Я прочитал, что он подтверждает, что пакет является законным для интерфейса, в который он входит или выходит (путем замены MAC-адресов и IP-адресов и проверки, все ли еще маршрутизируется через тот же интерфейс). Так что обычно было бы плохой идеей отключить его. В моем случае все интерфейсы находятся в одной сети... так что проверка на самом деле не имеет значения.

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

Выбранное вами решение работает, но есть альтернативы, которые не включают arptables. (Изначально Кристофер Кэшелл был на правильном пути, но он был не в курсе.)

Короче говоря, вы хотите установить эти параметры:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Они должны быть доступны при запуске современного ядра Linux серии 2.6. Проверьте и убедитесь, что в вашей системе существуют / proc / sys / net / ipv4 / conf // arp_announce и / proc / sys / net / ipv4 / conf // arp_ignore.

Параметр arp_filter работает только в том случае, если ваши различные IP-адреса совместно используют сегмент локальной сети, но используют другую IP-подсеть. Если они тоже используют подсеть IP, вам нужно использовать arp_ignore и arp_announce, как указано выше.

(Полагаю, вам также может понадобиться установить для arp_filter значение 0).

Это связано с тем, как Linux обрабатывает IP-адреса и сетевые карты. По сути, он обрабатывает IP-адрес так, как будто он принадлежит блоку, а не только конкретному NIC. В результате вы можете получать ответы ARP с IP-адресов на интерфейсах, которые вы не ожидаете.

Решение является опцией sysctl. Насколько я помню, вы ищете:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1

Это решит проблему для вас. Просто добавьте их в /etc/sysctl.conf и запустите 'sysctl -p'(или запустите каждую строку в качестве аргумента'sysctl -w".

Это заставит Linux отвечать только на запросы ARP на интерфейсе, которому фактически назначен IP-адрес.

Принятый ответ в сочетании с этим: http://www.linuxquestions.org/questions/linux-networking-3/multiple-interfaces-all-traffic-flows-through-just-one-538701/

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

Можете ли вы соединить шлюз и иметь брандмауэр для обработки IP-адресов?

Другие вопросы по тегам