我有一台帶有兩個乙太網路介面的電腦(運行 Linux)。我想在不涉及另一台電腦的情況下測試它們。
設定:
(192.168.1.5) eth1-------.
Linux PC/device | loopback cable
(192.168.1.6) eth2-------'
我跑
ping -I eth1 192.168.1.6
但沒有回覆。
我不明白問題是什麼。為什麼 Linux 會阻止這個操作?我要怎麼解決這個問題?
答案1
為什麼?
我無法完全解釋。
我要怎麼解決這個問題?
通常Linux 在內部到達本地分配的 IP 位址它確實有效。當一個人確實需要資料包傳輸到外部(例如通過電纜)並返回時,問題似乎就會出現——就像你的情況一樣。
您可以透過使用網路命名空間使其工作。我調整了我的另一個答案滿足您的需求。
筆記:
- 我在 Debian 10 上進行了測試。
- 命令所在的位置
ip …
您可能需要sudo ip …
.為了方便閱讀,我省略了sudo
.在提升的 shell 中工作或(暫時)定義alias ip='sudo ip'
以便能夠輕鬆複製貼上。 - 我假設沒有自動化幹擾,即沒有守護程序會嘗試以自己的方式配置相關介面。
- 要在非預設網路命名空間中運行命令,我使用
ip netns exec …
.可以透過這種方式運行 shell;那麼從 shell 運行的所有內容都將使用網路名稱空間。ip netns exec …
每當我們需要在非預設網路命名空間中運行某些東西時,都會使用這個答案。
像這樣進行:
定義有用的變數。這
ns1
是命名空間的任意名稱;eth1
和eth2
是您要使用的設備。netns=ns1 dev1=eth1 dev2=eth2
建立新的網路命名空間。
ip netns add "$netns"
將設備置於預設命名空間中。
ip link set dev "$dev1" down ip link set dev "$dev2" down
將其中一台裝置新增至新命名空間(它將從預設命名空間中消失)。這裡我選擇移動
$dev2
到新的命名空間。ip link set dev "$dev2" netns "$netns"
分配 IP 位址。
ip address add 192.168.1.5/24 dev "$dev1" ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
確認兩台設備位於其應在的位置,並且具有正確的 IP 位址。
ip address show ip netns exec "$netns" ip address show # examine output
如果尚未完成,請使用電纜實際連接兩個介面。
調出接口。命名空間包含自己的環回設備
lo
。我提出它只是為了以防萬一,因為一般情況下程序可能想要依賴它。ip link set dev "$dev1" up ip netns exec "$netns" ip link set dev "$dev2" up ip netns exec "$netns" ip link set dev lo up
檢查路線。在我的 Debian 10 中,理智的路由會自動出現。這個命令
ip route show
列印(以及其他行)
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
和這個命令
ip netns exec "$netns" ip route show
印刷
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
以一種或另一種方式進行 ping 操作。
ping 192.168.1.6 ip netns exec "$netns" ping 192.168.1.5
您可以使用
-I
,但不是必需的。此位址192.168.1.6
未指派給預設網路命名空間中的任何介面;並且192.168.1.5
未在非預設命名空間中分配。
就是這樣。它應該有效。我的測試表明這些ping
確實使用了電纜。我可以這麼說,因為:
- 斷開電纜會使它們停止流動;作為比較:即使沒有電纜,「內部」ping(從有線介面到自己的 IP 位址)也會流動;
iptraf-ng
監控 ping 介面顯示 ICMP 回顯請求和 ICMP 回顯回應;作為比較:該工具不顯示有線介面的「內部」ping。
基本清理:刪除網路命名空間。
ip netns del "$netns"
這會將第二個裝置移回預設網路命名空間。
我們使用的命令都沒有實現永久性更改,因此如果出現任何問題,只需重新啟動即可。