当我有一个带有两个 NIC 的 Linux 机器并且它们位于同一个子网中时,哪个 NIC 会连接到互联网?

当我有一个带有两个 NIC 的 Linux 机器并且它们位于同一个子网中时,哪个 NIC 会连接到互联网?

当 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 缓存。

相关内容