Routing

多 NIC Linux 系統上的 Ghost ping

  • March 10, 2018

我有一個帶有 3 個 NIC 的 Linux 系統,並且所有 3 個都在同一個子網上。我已經使用 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 的條目,因為它們的電纜已斷開連接?

它不僅與路由(第 3 層)有關,還與ARP(連結第 2 層和第 3 層)有關。Linux 通常會使用相同的 MAC 響應所有 ARP 請求,這意味著對等方的 ARP 記憶體中只有一個 MAC 地址用於 3 個 IP,並且只能訪問一張卡。有時當選的MAC可能會發生變化,從而引起各種麻煩。

有一個可用的功能可以防止這種情況。這是arp_filter設置,但它也需要一些路由規則(每個 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 請求加倍為GARP)以加快恢復速度。啟動時不需要,因為沒有這樣的記憶體。使用 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。
  • WAN

預設路由仍將使用 table 中的“預設”設置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

現在,如果一根網線斷開了,預期的結果就會發生:對應網卡上設置的 IP 將 100% 的時間不可用。

引用自:https://serverfault.com/questions/900385