Host B <--> Router <--> Host A
Все устройства подключены к коммутатору с настроенными этими VLAN.
Теперь, если я попытаюсь выполнить эхо-запрос хоста A от хоста B, произойдет следующее: хост B сделает запрос ARP, чтобы узнать MAC-адрес маршрутизатора, и отправит запрос Ping на маршрутизатор. Маршрутизатор также выполняет ARP-запрос, чтобы узнать MAC-адрес целевого хоста A, и пересылает Ping-запрос на хост A. Это нормально, и это работает.
Теперь странная часть: хост A, конечно, пытается ответить на Ping, но (!) Он не делает ARP-запрос, чтобы узнать MAC-адрес маршрутизатора, чтобы отправить ему Ping-Reply, чтобы переслать его на Хост B. Вместо этого он отправляет ARP-запрос напрямую с запросом MAC-адреса хоста B. Конечно, это не сработает, в локальной подсети не будет ответа, потому что широковещательный домен ограничен VLAN 1.
Кеш ARP на хосте A (192.168.1.10) выглядит так:
# arp -an
? (192.168.1.1) at 16:bc:aa:f2:bc:44 [ether] on eth0
? (192.168.2.10) at <incomplete> on eth0
Когда я пытаюсь удалить странную попытку разрешения ARP, я получаю это сообщение, а неудачная попытка ARP все еще находится в кеше:
# arp -d 192.168.2.10
SIOCDARP(dontpub): Network is unreachable
Таким образом, (двунаправленная) связь между хостом A и B невозможна. И вместо Ping-Replies хост B получает от маршрутизатора ICMP-Redirect-Request: хост B должен напрямую отправлять пакеты хосту A.
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ab:cd:a9:9a:cc:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ab:cd:a9:9a:cc:dd brd ff:ff:ff:ff:ff:ff
# ip r s
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 40:7d:7a:a3:f5:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.2.10/24 brd 192.168.2.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 47:5e:33:a6:31:5e brd ff:ff:ff:ff:ff:ff
Destination-IP Subnet mask Default gateway Hop count Interface
<public-net> 255.255.255.224 * 0 eth2
<public-net> 255.255.255.224 * 0 eth1
192.168.1.0 255.255.255.0 * 0 eth0
192.168.2.0 255.255.255.0 * 0 eth0
default 0.0.0.0 <public-router> 15 eth1
default 0.0.0.0 <public-router> 40 eth2
default 0.0.0.0 <public-router> 40 eth1
public-net ...... Адрес публичной подсети (интернет-канал)
public-router ... Адрес uplink-router
Маршрутизатор - это Cisco RV320 только с веб-интерфейсом, это все, что я могу получить. PS: Это настройка двойного восходящего канала с балансировкой нагрузки, но это не должно иметь значения для проблемы ARP.
Нашел для меня решение: я поместил Host A и подсеть 192.168.1.0/24 в новую VLAN с ID 10. Теперь все в порядке. Это нормально для моей общей конфигурации, но все же странно, что он не работал с VLAN ID 1. Возможно, проблема в маршрутизаторе, и он обрабатывает VLAN 1 особым образом. Но как это могло повлиять на поведение ARP в Linux? Еще вопрос.
Таблица маршрутизации на маршрутизаторе выглядит некорректно. Похоже, что вы используете обе VLAN без тегов маршрутизатора.
Я не знаю, как коммутатору удается доставлять пакеты от маршрутизатора как к A, так и к B, когда маршрутизатор явно отправляет все пакеты на коммутатор без указания того, к какой VLAN они принадлежат. Переключатель, который я использую, не сможет этого сделать. Но, возможно, вы используете марку коммутатора, которая каким-то образом может правильно угадать, в какую VLAN отправлять пакеты.
Однако с точки зрения маршрутизаторов A и B находятся в одном и том же сегменте Ethernet, что означает, что маршрутизатор, как ожидается, проинструктирует A и B обмениваться данными напрямую, без участия маршрутизатора. И здесь общение нарушается.
Записи в таблице маршрутизации выглядят так:
192.168.1.0 255.255.255.0 * 0 eth0
192.168.2.0 255.255.255.0 * 0 eth0
На самом деле должно было выглядеть так:
192.168.1.0 255.255.255.0 * 0 eth0.1
192.168.2.0 255.255.255.0 * 0 eth0.20
Виртуальные интерфейсы eth0.1
и eth0.20
можно создать с помощью команд:
vconfig add eth0 1
vconfig add eth0 20
Поведение, которое вы наблюдаете с VLAN-1, обычно связано с тем, что этот идентификатор vlan является управляющим vlan на коммутаторе, который не помечен.