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.