当 Linux 机器有两个 NIC,并且都连接到同一个子网时,有没有办法判断哪一个被用作默认网关?
答案1
有几个条件。
- 两个 IP 地址都在同一个子网(正如您之前提到的)
- 正在生成的套接字尚未通过程序明确绑定到特定的源 IP。
- 没有根据各种其他条件(fwmark、dsmark 等)切换行为的高级路由规则。
- 目标是同一子网。
在这种情况下,将查询路由表,因此在我的示例中,我在同一子网上有两个 IP
# ip addr ls | grep inet
inet 192.168.122.224/24 brd 192.168.122.255 scope global eth0
inet 192.168.122.160/24 brd 192.168.122.255 scope global eth1
选择哪一个?嗯,答案主要取决于路线。所以如果我们检查一下……
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.224
192.168.122.0/24 dev eth1 proto kernel scope link src 192.168.122.160
当然,如果我有目的地的默认路由,那将是我要去的地方,而且会非常明显。通常,相同的路由表不会接受目标网络的重复规则。
该src
字段指示为该子网选择哪个 IP 地址。但是,等等——这里有个问题。我有两个路由,每个设备一个,都指定了源!该怎么办?
路线中的其他因素可能会对其中一个因素产生影响,metric
例如preference
。
嗯,简单来说,如果其他方法都失败,且两个规则相同,则内核只会选择列表中第一个。如果您有偏好,则选择那个。
如果您想要做出偏好,您需要向路线添加规则(例如我的情况),如下所示:
ip route add 192.168.122.0/24 dev eth0 src 192.168.122.224 metric 2
ip route add 192.168.122.0/24 dev eth1 src 192.168.122.160 metric 1
这将改变主机的路由规则。执行此操作后,您可能需要清除 arp 缓存。