Linux

同一個介面上的兩個IP地址,找出哪個在使用

  • March 17, 2022

我有一個嵌入式 Linux 系統,它設置為對 eth0 使用 DHCP,但也有一個連結本地 IP 地址配置為備用 (eth0:1),以防萬一沒有從 DHCP 獲得 IP 地址。

有沒有一種簡單的方法可以從 shell 腳本檢查正在使用的 IP 地址?

我得到的最接近的是:

$ ip route get 1
1.0.0.0 via 192.168.0.100 dev eth0  src 192.168.0.133
   cache
$ ifconfig eth0 0.0.0.0   # Simulate no IP obtained from DHCP
$ ip route get 1                                                       
1.0.0.0 via 192.168.0.100 dev eth0  src 169.254.197.131   
   cache

這可以正確辨識正在使用的 IP 地址(‘src’ 欄位)。但是,這僅在配置了預設網關時才有效,如果由於某種原因 DHCP 不可用,則不會出現這種情況。

即使沒有配置預設網關,我如何才能找出正在使用的 IP 地址?

即使沒有配置預設網關,該命令ip route get ADDRESS *也能正常工作。*例如,如果在 eth0: 上配置了以下地址10.0.7.139/24169.254.1.2/16並且刪除了預設路由,則

$ ip route get 10.0.7.222
10.0.7.222 dev eth0 src 10.0.7.139 
   cache

$ ip route get 169.254.55
169.254.55.0 dev eth0 src 169.254.1.2 
   cache

$ ip route get 1
RTNETLINK answers: Network is unreachable

最後一個答案是正確的:如果不存在到地址為 1.xxx 的任何主機,則無法到達該主機。不是ip route get命令不起作用,而是網路配置錯誤。

請注意,“連結本地”僅表示僅在連接到的乙太網連結 eth0 上使用的地址。它不應該用於“傳出”連接。

編輯:澄清下面添加的評論。

路由表,並且只有路由表,決定了數據包如何開始到達目的地的旅程。發送 IP 數據包時總是會涉及到路由,即使目的地在本地鏈路上,甚至是本地主機上。路由表項還包含一個源地址,匹配路由的這個地址被選為傳輸數據包的源IP地址。

可能有多個 IP 地址分配給同一個介面,即使來自同一個地址範圍,但只有其中一個(主地址)列在匹配的路由表條目中。

因此ip route get(或間接ip route)為您的問題提供了明確的答案。從ip-route手冊頁:“此命令獲取到目的地的單一路由,並完全按照核心看到的方式列印其內容。”

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