Linux

物理介面 MAC 而不是 macvlan MAC 作為 ARP 響應發送

  • August 23, 2018

在 Arch Linux ARM (Raspberry Pi) Kernel 4.4.37 上,我創建了一個 macvlan,例如

ip link add link eth0 mac0 type macvlan

macvlan 虛擬網卡隨後出現在列表中,因此我為其分配了一個 IP 地址,並將連結狀態設置為啟動。(順便說一句,我嘗試過使用模式bridgevepaprivate。)

然後我可以從我的 Windows 客戶端 ping IP,但是當我檢查arp -aWindows 中的 ARP 記憶體 ( ) 時,它們顯示的 MAC 地址與主(物理)網路適配器相同,而不是新創建的 macvlan MAC 地址。

我確保清除 ARP 記憶體嘗試客戶端以前沒有見過的 IP 地址等,但它總是顯示錯誤的 MAC。

當我為 macvlan MAC 地址創建到 Windows 客戶端的靜態 ARP 條目並 ping 相關 IP 地址時,tcpdump 顯示來自 macvlan 介面的回應要求,並且在主(物理)介面上沒有顯示任何內容,並且我在我的 Windows 客戶端上收到了 ping 響應(一旦我記得設置了 iptables 規則以允許流量!)

當我清除客戶端上的 ARP 記憶體並再次 ping 時,我仍然會收到 ping 響應,但這次 ARP 條目已恢復為 Linux 機器上主物理網路適配器的條目。

只是想知道我可能做錯了什麼?

為此,我必須在接受的答案中添加一個步驟並設置以下附加變數:

net.ipv4.conf.all.rp_filter=2

我不需要設置arp_ignore為 2,1 似乎工作。我也不需要arp_filter為我的網路設置為 1。

所以對我來說完整的解決方案是:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.rp_filter=2

在這裡找到了我的問題的解決方案

基本上,這裡沒有錯。這就是 Linux 核心在 ARP 解析方面的工作方式——預設情況下,它會回復任何本地地址的 ARP 請求,無論它們來自哪個介面,即使請求的地址位於不同的介面上。

要解決此問題,您需要調整兩個 sysctl 變數:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

您可能需要將 arp_ignore 值更改為 2,並將 arp_filter 設置為 1,具體取決於您的 IP 地址/子網場景。

有關這些變數的可用選項的完整描述,請查看kernel.org 文件

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