找出使用的客戶端 IP
我有一個 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.x
Linux 將選擇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
警告:我沒有機會測試上述內容。