Linux

無論 arp_filter 設置如何,多 NIC Linux 機器的 NIC 都在響應彼此的 ARP

  • February 14, 2013

我有一台執行 2.4.37 核心的舊 Linux 機器。機器中有兩個 NIC 卡,它們都位於同一網路上,具有不同的 IP。對於某些測試,我們希望每個 IP 的流量都通過該 NIC 路由,但實際發生的是兩個 IP 的所有流量都通過其中一個乙太網設備路由,而另一個未使用。如果我在網路上使用另一台帶有空 ARP 記憶體的機器並 ping 兩個 IP,然後檢查 ARP 記憶體,我會看到它具有兩個 IP 下兩個 NIC 之一的 MAC。基本上,Linux 機器允許兩個 NIC 相互響應 ARP 請求——這是預設行為。但是,我為兩個 NIC 都啟用了 arp_filter,這應該可以消除這種情況,但似乎沒有效果。我也試過禁用 rp_filter,但這似乎也沒有效果。這是我的相關 sysctl 條目:

net.ipv4.conf.eth1.arp_filter = 1
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 1
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 1
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.default.arp_filter = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.rp_filter = 0

我在Google上找到了大量與有同樣問題的人的連結,但是一旦他們設置了 arp_filter=1 問題就消失了,但對我來說不是。

編輯:我也一直在玩各種 arp_ignore 和 arp_announce 設置,但無論我做什麼,我都不能讓每個介面只響應自己 IP 的 ARP

使用 Linux 的 IP 層網路管理指南

一種防止 ARP 通量的方法涉及使用net/ipv4/conf/$DEV/arp_filter. 簡而言之,使用 arp_filter 會導致接收方(在下面的例子中,真實伺服器)執行路由查找以確定發送回复的介面,而不是預設行為(如上所示),從所有乙太網回复接收請求的介面。

如果到目的地的唯一路由是通過其中一個網卡,arp_filter 解決方案可能會產生意想不到的影響。

因此 arp_filter 通過查詢路由表來確定應該使用哪個介面將數據包發送到請求主機。如果您的路由表有一個像這樣的預設路由:

default dev eth0 src 192.168.0.10

那麼它將總是在 eth0 上發送 ARP 回复,無論 eth0 是否具有匹配的 IP。

一種可能的解決方案(我還沒有測試過)是設置源策略路由,它根據源 IP 選擇傳出介面:

echo 10 eth0 >> /etc/iproute2/rt_tables
echo 11 eth1 >> /etc/iproute2/rt_tables
ip route add 192.168.0.0/24 dev eth0 table eth0
ip route add 192.168.0.0/24 dev eth1 table eth1
ip rule add from 192.168.0.10 lookup eth0
ip rule add from 192.168.0.11 lookup eth1

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