У меня есть маршрутизатор Centos, который проделывает колоссальную работу в настройке, подобной этой:
У меня включена переадресация ipv4, чтобы разрешить маршрутизацию между vlan, а затем:
iptables выполняет SNAT, когда какая-либо из сетей eth0 ищет что-то в Интернете, используя диапазон IP-адресов от 10.198.29.138 до 10.198.29.142 в качестве общедоступных IP-адресов. Все отлично работает. Проблема в том, что мне нужен интерфейс VLAN 192.168.200.1 для размещения в eth1. Когда я перемещаю его в ifcfg-eth1.200, я вижу в захвате пакета, что многие клиенты пытаются заполнить свои таблицы ARP, спрашивая, какой MAC-адрес принадлежит 192.168.200.1, но eth1.200 никогда не отвечает! Я вижу, что другой eth0.XXX отвечает на широковещательную рассылку ARP, но не 200. Может быть, это связано с iptables или чем-то еще?
Мои iptables выглядят так:
РЕДАКТИРОВАНИЕ / РЕЗЮМЕ РЕШЕНИЯ БОЛЬШОЕ СПАСИБО ДЭВИДУ ХУДУ ЗА ЕГО КОММЕНТАРИЙ
Я смог поэкспериментировать с собой, устраняя другую проблему, что делает команда sysctl -w net.ipv4.conf.eth0 / 202.rp_filter = 0:
SERVER
<==eth0||eth1==>
MAC FF:11 || MAC FF:22
IP 1.1.1.1 || IP 3.3.3.1
если eth0 получает ARP-запрос для 3.3.3.1, СЕРВЕР по умолчанию не отвечает на него. После отключения фильтра обратного пути СЕРВЕР отвечает на запросы ARP на eth0, говоря «эй, IP 3.3.3.1 находится на MAC FF: 11», тогда как на самом деле он на eth1.
Затем следующий пакет прибывает на eth0, предназначенный для MAC FF: 11 и IP 3.3.3.1, и из-за таблицы маршрутизации все, что возвращается к IP 3.3.3.x, будет выходить из eth1, поэтому мои пакеты терялись в черная дыра, но это уже другая история.
В моем случае у меня примерно так:
SERVER
<==eth0||eth1==>
MAC FF:11 || MAC FF:22
<==eth0.200 || eth1.200==>
IP 3.3.3.1 || IP 1.1.0.1
<==eth0.201 || eth1.201==>
IP 1.1.1.1 || IP 3.3.3.9
<==eth0.202 || eth1.202==>
IP 1.1.2.1 || IP 3.3.3.17
<==eth0.203 || eth1.203==>
IP 1.1.3.1 || IP 3.3.3.25
<==eth0.204 || eth1.204==>
IP 1.1.4.1 || IP 3.3.3.33
так до eth0.213. Проблема в том, что, как вы можете видеть, сеть 1.1.0.0 находится на eth1, а 3.3.3.0 - на eth0, а остальные сети инвертированы.
Я надеюсь из того, что я обнаружил позже с помощью предложенной команды sysctl, что если RPF отключен, SERVER наконец-то ответит на те пакеты ARP, запрашивающие MAC 1.1.0.1 на eth1.200, но, к сожалению, я не смогу подтвердить.
Я действительно могу подтвердить, что эту команду можно запустить только на затронутых субинтерфейсах, и они немедленно применит изменения.
Linux предназначен для ответа на запросы ARP на любом интерфейсе. Предполагается, что хост владеет IP-адресом, а не конкретным интерфейсом. То, что вы видите, называется ARP Flux.
Если ваши интерфейсы существуют в одном и том же широковещательном домене уровня 2, вы это увидите. Вы упомянули, что используете VLAN, что должно делать это неверно, но это зависит от того, где VLAN маркируется (ОС, коммутатор и т. Д.).
Вы можете изменить это поведение в Linux, используя sysctl
arp_ignore - ЦЕЛОЕ
Определите различные режимы отправки ответов в ответ на полученные запросы ARP, которые разрешают локальные целевые IP-адреса:
0 - (дефолт): ответ для любого локального целевого IP-адреса, настроенного на любом интерфейсе
1 - отвечать только в том случае, если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе
2 - отвечать, только если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе, и оба с IP-адресом отправителя являются частью одной подсети на этом интерфейсе
3 - не отвечать для локальных адресов, настроенных с помощью узла области видимости, отвечают только разрешения для глобальных адресов и адресов ссылок
Изменить: перечитав ваш вопрос, похоже, вам может потребоваться отключить фильтр обратного пути на каждой сетевой карте.
sysctl -w net.ipv4.conf.eth0/102.rp_filter=0
sysctl -w net.ipv4.conf.eth0/103.rp_filter=0