ifconfig не может установить маршрут, если ip интерфейса является существующим широковещательным адресом

Рассмотрим следующую настройку:

X@Y:~$ sudo ip link add link eth0 name eth0.3 type vlan id 3
X@Y:~$ sudo ip link add link eth0 name eth0.2 type vlan id 2
X@Y:~$ sudo ifconfig eth0.2 192.168.2.1/30
X@Y:~$ sudo ifconfig eth0.3 192.168.2.2/29
X@Y:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
192.168.2.0     0.0.0.0         255.255.255.252 U     0      0        0 eth0.2
192.168.2.0     0.0.0.0         255.255.255.248 U     0      0        0 eth0.3

Как вы можете видеть, хотя они имеют перекрывающиеся подсети, оба маршрута для eth0.2 а также eth0.3 установить. Тем не менее, когда я пытаюсь это:

X@Y:~$ sudo ifconfig eth0.3 192.168.2.3/29
X@Y:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
192.168.2.0     0.0.0.0         255.255.255.252 U     0      0        0 eth0.2

Вы можете видеть, что маршрут для eth0.3 не там. В чем главное отличие? Настроенный eth0.3 ip - широковещательный адрес подсети, настроенной на eth0.2, Хорошо, да, это не так, но интерфейс подключен к сети, единственное, чего не происходит, это добавить маршрут в таблицу маршрутов. И на самом деле, таблица маршрутов даже не заботится об этом широковещательном адресе:

X@Y:~$ sudo route add -net 192.168.2.0/29 dev eth0.3
X@Y:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
192.168.2.0     0.0.0.0         255.255.255.252 U     0      0        0 eth0.2
192.168.2.0     0.0.0.0         255.255.255.248 U     0      0        0 eth0.3
X@Y:~$ sudo ip link del eth0.3
X@Y:~$ sudo ip link del eth0.2

Есть ли способ обойти это? Прежде чем вы заявите, что я сам это выяснил, добавив маршрут впоследствии: в моей настройке фактический ifconfig происходит через скрипт dhclient, который я не могу редактировать, поэтому для добавления маршрута потребуется перехватить dhclient, прочитать IP-адрес откуда-то и выполнить маршрут добавить, что довольно утомительно. Я надеялся, что смогу изменить это поведение с помощью некоторых флагов на интерфейсе?

PS Это, конечно, не реальный дизайн сети, но требуется для настройки тестирования.

1 ответ

Активный / 30 маршрут всегда будет предпочтительнее любого / 29 маршрута. Таким образом, если у вас не установлен маршрут хоста / 32 для 192.168.2.2, таблица маршрутизации будет по-прежнему отправлять трафик на 192.168.2.2 на интерфейс / 30.

Непонятно, был ли когда-либо установлен интерфейс 192.168.2.3, поскольку.3 является широковещательной передачей для 192.168.2.0/30, а пакет, отправленный на 192.168.2.3, имеет специальную функцию: отправляется всем хостам на 192.168.2.0/. 30, чтобы не быть одноадресной к менее определенной сети на другом интерфейсе.

Если бы вместо / 30 и / 29 вы работали с / 29 и / 28, у вас возникла бы проблема с.7.

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