Рассмотрим следующую настройку:
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 Это, конечно, не реальный дизайн сети, но требуется для настройки тестирования.