我有一个 Linux 系统,有 3 个 NIC,并且所有 3 个 NIC 都位于同一子网中。我已使用 3 个表在系统上设置了策略路由,其中包含 ip 规则和 ip 路由。这些是 3 个 NIC 的 IP。
ETH0:192.168.1.10
ETH1:192.168.1.11
ETH2:192.168.1.12
我观察到的一件事是,如果断开了 ETH1 和 ETH2 的电缆,则从通过交换机连接到 ETH0 的 PC 对其 IP 进行 ping 操作有时会成功。
我理解这是 IP 位于同一子网的结果(虽然,当我使用 IP 规则时,难道不应该避免这种情况吗?)但我不明白的是交换机如何能够成功地将发往属于 ETH1 或 ETH2 的 IP 的数据包路由到发往 ETH0 的 IP?换句话说,交换机如何将发往 192.169.1.12 的数据包发送到 192.168.1.10?它的内部路由表是否只包含 192.168.1.10 的条目,而没有其他 2 个 IP 的条目,因为它们的电缆断开了?
答案1
这不仅与路由(第 3 层)有关,还与地址解析协议(链接第 2 层和第 3 层)。Linux 通常会用相同的 MAC 来回答所有 ARP 请求,这意味着对等方的 ARP 缓存中只有一个 MAC 地址用于 3 个 IP,并且只能到达一张卡。有时,选定的 MAC 可能会发生变化,从而导致各种麻烦。
有一个功能可以防止这种情况发生。那就是arp_过滤器设置,但它还需要一些路由规则(每个 IP 和/或每个接口)。仅使用arp_filter
或仅使用路由表可能会产生比根本不使用它们更糟糕的结果。两者需要一起。因为 OP 没有显示使用了哪些路由策略,所以我在下面提供了一个完整的解决方案,考虑到没有实施任何特殊路由策略。路由表(100、101、102)的值是随机选择的。
局域网
先试一下:
ip route get 192.168.1.1 from 192.168.1.10 ip route get 192.168.1.1 from 192.168.1.11 ip route get 192.168.1.1 from 192.168.1.12
注意结果:所有人都使用相同的卡(这并不意味着总是这样)。
在同一个 LAN 中的对等服务器上,尽可能快:ping -c1 192.168.1.10 & ping -c1 192.168.1.11 & ping -c1 192.168.1.12 ip neigh show to 192.168.1.10 ip neigh show to 192.168.1.11 ip neigh show to 192.168.1.12
最肯定的是,所有 3 个 IP 都解析为同一个 MAC,因此卡:唯一一个将从该对等方接收流量的卡。
更改设置(警告:存在连接丢失的风险):
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_filter echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_filter echo 1 > /proc/sys/net/ipv4/conf/eth2/arp_filter ip route add 192.168.1.0/24 dev eth0 table 100 ip route add 192.168.1.0/24 dev eth1 table 101 ip route add 192.168.1.0/24 dev eth2 table 102 ip rule add from 192.168.1.10 lookup 100 ip rule add from 192.168.1.11 lookup 101 ip rule add from 192.168.1.12 lookup 102
刷新对等体的 ARP 缓存(DAD 请求加倍)区域空气质量评估计划) 以在需要时加快恢复速度。启动时不需要,因为没有这样的缓存。使用 iputils 的 arping,而不是独立的 arping 工具(RHEL:
iputils
,Debian:,iputils-arping
而不是arping
软件包),因为语法不同。arping -c5 -s 192.168.1.10 -D 192.168.1.10 -I eth0 & arping -c5 -s 192.168.1.11 -D 192.168.1.11 -I eth1 & arping -c5 -s 192.168.1.12 -D 192.168.1.12 -I eth2 &
重新进行前面的检查并进行比较:一切都应该如预期的那样,并且对等服务器上的邻居表应该每个 IP 显示一个不同的 MAC,与正确的卡的 MAC 匹配。
广域网
默认路由仍将使用表中的“默认”设置
main
,最有可能使用 eth0。此路由必须在每个表上重复。假设默认路由器是 192.168.1.1(否则,调整),则将是:ip route add default via 192.168.1.1 dev eth0 table 100 ip route add default via 192.168.1.1 dev eth1 table 101 ip route add default via 192.168.1.1 dev eth2 table 102
现在,如果断开一根电缆,就会发生预期的结果:相应 NIC 上设置的 IP 将 100% 不可用。