考虑以下设置:
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 路由。因此,除非您已为 192.168.2.2 设置了 /32 主机路由,否则路由表仍会将流量发送到 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 的问题。