Linux

找出使用的客戶端 IP

  • February 14, 2021

我有一個 linux 機器,由於奇怪的原因,在同一個物理網路介面上有兩個 IP 地址,並且兩個 IP 在同一個子網中。該機器可以通過兩個 IP 訪問,並且一切似乎都正常工作。

直到我發現這台機器需要使用 NAS 服務。而且這個NAS已經被IP鎖定了。由於添加了第二個 IP,似乎無法再掛載 NAS 共享。一個明顯的解決方法是刪除 IP 限製或添加第二個 IP。

我的問題是:如果一台機器有多個 IP,它將使用哪一個來發送流量?或者換句話說,如果這台雙 IP 機器充當客戶端,伺服器會看到什麼客戶端 IP?

編輯:我現在了解到一些客戶端應用程序可以指定用於傳出流量的介面。這對我來說是新的。所以我的客戶是

  • NFS 掛載 ( mount -t nfs ...)
  • ping

如何指定傳出流量的 IP?如果客戶端應用程序不指定,作業系統如何選擇?用於傳出流量的作業系統選擇是否可以偏向一個、另一個或兩個介面?

當任何客戶端嘗試啟動連接時,它可以指定自己的客戶端 IP,也可以使用地址INADDR_ANY(AKA: 0.0.0.0) 作為源地址。如果使用 INADDR_ANY,那麼當客戶端呼叫connect()時,Linux 會自動選擇一個地址- 請參見man 7 ip


最簡單的解決方法是告訴您的客戶端選擇哪個 IP。

安裝後,mount -t nfs ...您只需設置clientaddr選項(參見man 5 nfs)。如果您想要的 IP 是 10.20.30.41,您只需添加以下選項:

... -o clientaddr=10.20.30.41 ...`

或者,如果您已經有一個,-o那麼您只需用逗號分隔您的其他選項。改變

... -o foo=bar

... -o foo=bar,clientaddr=10.20.30.41

**如果您無法使用 INADDR_ANY 阻止您的客戶端,**那麼…

從我讀到的,源地址是由src路由表上的地址設置的。見man 8 ip route

因此,Linux 會檢查您嘗試連接的遠端 (NAS) IP,然後在其路由表中查找地址。它選擇在src那裡指定的地址。

在終端,您可以查看您的路由表ip route並獲得如下資訊:

default via 192.168.1.254 dev wlan0 proto dhcp src 192.168.1.143 metric 600 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.19.0.0/16 dev br-ff4f53a0f3b5 proto kernel scope link src 172.19.0.1 
172.22.0.0/16 dev br-66358811b693 proto kernel scope link src 172.22.0.1 linkdown 
172.29.0.0/16 dev br-ce3d9cbbad0b proto kernel scope link src 172.29.0.1 linkdown 
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.143 
192.168.1.254 dev wlan0 proto dhcp scope link src 192.168.1.143 metric 600 

在這裡您可以看到,如果您嘗試連接任何東西,172.17.x.xLinux 將選擇172.17.0.1作為源地址。同樣,公共網際網路上的任何東西都將通過“預設路由”,因此它會選擇192.168.1.143.

ip route add ...您可以使用和修改您ip route change ...的路由表ip route del ...

我建議您對路由表進行最小的更改以避免其他問題。您為單個 IP 創建一個路由,它將優先於整個子網的路由。例如,如果 LAN 為 10.20.30.0/24,則係統的輔助 IP 地址為 10.20.30.22,也在介面eth0上,並且該 LAN 中的 NAS 也在使用 10.20.30.31:

ip route add 10.20.30.31/32 dev eth0 src 10.20.30.22

或者如果 NAS 在另一個網路中,地址為 172.20.30.31,可通過網關 10.20.30.1 訪問:

ip route add 172.20.30.31/32 via 10.20.30.1 src 10.20.30.22

警告:我沒有機會測試上述內容。

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