在多网卡 Linux 系统上进行 Ghost ping

在多网卡 Linux 系统上进行 Ghost ping

我有一个 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% 不可用。

相关内容