Назад | Перейти на главную страницу

Linux отправляет запросы ARP узлам в других подсетях?

Настроить

Host B <--> Router <--> Host A

Все устройства подключены к коммутатору с настроенными этими VLAN.

Пинг-тест

Теперь, если я попытаюсь выполнить эхо-запрос хоста A от хоста B, произойдет следующее: хост B сделает запрос ARP, чтобы узнать MAC-адрес маршрутизатора, и отправит запрос Ping на маршрутизатор. Маршрутизатор также выполняет ARP-запрос, чтобы узнать MAC-адрес целевого хоста A, и пересылает Ping-запрос на хост A. Это нормально, и это работает.

Запросы ARP для другой подсети ??

Теперь странная часть: хост 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

ICMP-перенаправления от маршрутизатора

Таким образом, (двунаправленная) связь между хостом A и B невозможна. И вместо Ping-Replies хост B получает от маршрутизатора ICMP-Redirect-Request: хост B должен напрямую отправлять пакеты хосту A.

Мои вопросы

  1. Что заставляет хост B пытаться отправить ответ, разрешая ARP хост из другой подсети? Почему маршрутизатор не отправляет Ping-Reply?
  2. Есть идеи, какую роль играет перенаправление ICMP?

Приложение

Хост А

# 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

Хост B

# 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

Маршрутизатор

Routing table:
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 на коммутаторе, который не помечен.