Linux:是什麼導致靜態 ARP 條目在鏈路斷開時刷新
這是一個關於Debian Buster(核心 4.19.0-18)和Debian Bullseye(核心 5.10.0-9)之間網路行為差異的問題。在 Buster 上,如果介面上的連結斷開,代理 arp 條目將繼續存在。在 Bullseye 上,他們沒有。
情況:在特定介面上創建靜態代理 ARP 條目:
ip neigh add proxy 1.2.3.5 dev eth0
我可以驗證該條目是否存在:
ip neigh show proxy
現在,如果該介面上的連結斷開並再次恢復,則在 Buster 上,代理 arp 條目仍然存在,在 Bullseye 上它們消失了。
我想知道這種差異背後的原因。它是核心功能嗎?udev 是這樣做的嗎?是否有一個 sysctl 設置來管理這個?
有人能指出我正確的方向嗎?如果您知道如何在 Bullseye / 核心 5.10 上創建靜態 ARP 條目,那就更好了。
請注意,我使用的是 sysvinit,而不是 systemd。謝謝!
以下是與此問題相關的更改歷史記錄:
net:驅逐運營商關閉的鄰居條目
在 netdev -next 樹上送出:這負責在鏈路使運營商關閉時刪除鄰居條目,並在送出消息中提供基本原理。
核心 v4.19 發布。
這仍然不包括來自 netdev -next 分支的送出。
Davem 的合併請求(包括先前的鄰居更改)被合併到 linux master 中,因此一旦發布就包含在 linux v4.20中。
快進……
net: arp: 引入
arp_evict_nocarrier
sysctl 參數此更改引入了一個新的 sysctl 參數
arp_evict_nocarrier
. 當設置(預設)時,ARP 記憶體將在NOCARRIER
事件中被清除。此新選項已預設為“1”,以保持現有行為。$$ … $$
因此,您可能必須等待靶心反向移植中的核心 >= 5.16 才能通過執行 then 來恢復舊行為,例如:
sysctl -w net.ipv4.conf.eth0.arp_evict_nocarrier=0
或等待稍後的一些調整使代理條目表現得像永久條目(使特定程式碼不受運營商停機事件的影響)。
關於第二個問題“如何創建靜態 ARP 條目”,這裡是在介面eth0上添加 MAC 地址為 12:34:56:78:9a:bc 的 192.0.2.2 的靜態條目的方法,使用
replace
關鍵字而不是add
關鍵字這可能會隨機返回一個RTNETLINK answers: File exists error
(或change
會遭受相反的影響):ip neigh replace 192.0.2.2 dev eth0 lladdr 12:34:56:78:9a:bc nud permanent