Linux

ip link down 和physical link缺席的區別

  • November 24, 2020

在 Linux 中,後置條件和真正的鏈路缺失(例如交換機的埠燒毀或有人絆倒電線)之間ip link down是否有任何區別。 我所說的差異是指系統中可以用來區分這兩種情況的一些標誌。 例如,在這兩種情況下,路由表是否相同?會或其他東西顯示相同的東西嗎?是否有一些工具/實用程序可以區分這些條件?

ethtool

管理上打開但斷開連接或管理上關閉的介面之間存在差異。

斷開連接

介面獲得運營商關閉狀態。它的正確處理可能取決於介面的驅動程序和核心版本。通常它與ip link show. 例如,使用虛擬乙太網veth介面:

# ip link add name vetha up type veth peer name vethb
# ip link show type veth
2: vethb@vetha: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 02:a0:3b:9a:ad:4d brd ff:ff:ff:ff:ff:ff
3: vetha@vethb: <NO-CARRIER,BROADCAST,MULTICAST,UP,M-DOWN> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
   link/ether 36:e3:62:1b:a8:1f brd ff:ff:ff:ff:ff:ff

vetha本身在管理上是 UP,顯示NO-CARRIER和等效的操作狀態 LOWERLAYERDOWN標誌:它已斷開連接。

也存在等效/sys/條目:

# cat /sys/class/net/vetha/carrier /sys/class/net/vetha/operstate
0
lowerlayerdown

在通常的設置中,對於管理的介面,運營商和操作狀態匹配(NO-CARRIER <=> LOWERLAYERDOWN或 LOWER_UP <=> UP)。例如,當使用 IEEE 802.1X 身份驗證時,一個例外情況(本核心文件中描述了操作狀態的高級細節:操作狀態但本解釋不需要它)。

ethtool查詢較低級別的 API 以檢索相同的運營商狀態。

沒有運營商不會阻止任何第 3 層設置保持有效。發生這種情況時,核心不會更改地址或路由。只是最終介面不會發出應該發出的數據包,當然也不會得到回复。因此,例如嘗試連接到另一個 IPv4 地址遲早會再次觸發一個 ARP 請求,該請求將失敗,並且應用程序將收到“沒有到主機的路由”。已建立的 TCP 連接只會競標它們的時間並保持建立狀態。

行政性下降

上面的 vethboperstate DOWN 並且不顯示任何運營商狀態(因為它必須啟動才能檢測到這一點。物理乙太網介面當然表現相同)。

當介面關閉時ip link set ... downethtool只會說也沒有連結,因此不能可靠地用於此(它肯定也會顯示一些未知條目,但有可靠的方案嗎?)。

這次這將對第 3 層網路設置產生影響。核心將拒絕使用此介面添加路由,並將刪除與其相關的任何先前路由:

  • 添加地址時添加的自動 ( proto kernel) LAN 路由
  • 在任何路由表(不僅是路由表)中添加的任何其他路由(例如:預設路由)直接取決於介面(scope link)或其他先前刪除的路由(可能是當時scope global)。由於這些不會在界面恢復時重新出現(ip link set ... up),所以它們會失去,直到使用者空間工具將它們添加回來。

使用者空間互動

使用 NetworkManager 等最新工具時,可能會感到困惑,並認為斷開連接類似於介面關閉。這是因為 NM 會監控連結並在此類事件發生時執行操作。為了了解該ip monitor工具可用於從腳本進行監控,但它目前沒有穩定/可解析的輸出(沒有可用的 JSON 輸出),因此它的使用受到限制。

因此,當電線斷開時,NM 很可能會認為它不再使用目前配置,除非特定設置阻止它:然後它會自行刪除地址和路由。當線路重新連接時,NM 將再次應用其配置:添加回地址和路由(如果相關,使用 DHCP)。這看起來一樣,但不是。一直以來,界面都保持不變*,*否則當連接恢復時,NM 甚至都不可能收到警告。

概括

  • 很容易區分這兩種情況:ip link show將顯示NO-CARRIER+LOWERLAYERDOWN用於斷開連接的介面,以及DOWN用於管理關閉的介面。
  • 以管理方式設置介面關閉(和啟動)可能會失去路由
  • 失去運營商並恢復它不會破壞網路設置。如果延遲足夠短,它甚至不應該中斷正在進行的網路連接
  • 但管理網路的應用程序可能會做出反應並更改網路設置,有時會導致類似於管理故障的結果
  • 您可以使用命令ip monitor link來接收有關以管理方式設置的介面關閉/啟動或運營商更改的事件,或者ip monitor接收此時或不久之後將發生的所有多個相關事件(包括地址或路由更改)。
  • 大多數ip命令(但不是ip monitor)都有一個 JSON 輸出可ip -json ...用於幫助腳本(以及jq)。

範例(從第一個veth範例繼續):

vethb仍然關閉:

# ip -j link show dev vethb | jq '.[].operstate'
"DOWN"

# ip -j link show dev vetha | jq '.[].operstate'
"LOWERLAYERDOWN"

設置vethb,它現在在兩者上都有一個載體:

# ip link set vethb up
# ip -j link show dev vetha | jq '.[].operstate'
"UP"

這講述了 3 種通常的狀態:管理上的downlowerlayerdown(即:啟動但斷開連接)或up(即:操作)。

引用自:https://unix.stackexchange.com/questions/619068