Debian
如何通過 veth 設備對連接兩個 netcat 實例?
我想
netcat
通過 veth(4) 設備對連接到實例。
ip
因此,我使用如下方式創建了 veth 對:ip link add eth0 type veth peer name eth1 ip addr add 10.0.0.1/24 dev eth0 ip addr add 10.0.0.2/24 dev eth1 ip addr show eth0 13: eth0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 8a:74:8f:e7:dd:cd brd ff:ff:ff:ff:ff:ff ip addr show eth1 14: eth1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether a2:7e:07:be:9a:e2 brd ff:ff:ff:ff:ff:ff
在上面,我需要為 veth 設備分配一個 IP 地址,因為
netcat
它只會監聽 IP 地址,而不是原始網路設備。但是,在
netcat
終端中的 eth0 上啟動偵聽器並嘗試從另一個終端連接到它後,我在第一個終端中沒有收到任何連接:netcat -n -vvvv -l -s 10.0.0.1 -p 8080 netcat -n -vvv 10.0.0.1 8080 # timeout netcat -n -vvv 10.0.0.2 8080 # timeout
查看路由表,似乎
ip
為 veth 對自動創建了規則:ip route default via 10.211.55.1 dev enp0s5 proto static metric 100 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1 10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.2 ...
我究竟做錯了什麼?
我看到它們應該放在不同的網路命名空間中,但是當兩個 veth 對都分配了 IP 地址時,你能告訴我為什麼它不能在單個命名空間中工作嗎?
以下事情可能都會出錯:
- 偵聽地址的應用程序將處理該地址的任何傳入數據包,無論它來自何處。因此數據包可能來自任一端,甚至來自完全不同的網路介面(例如
eth0
)。- 如果 Linux 核心檢測到一個本地的目標地址,它會將其作為本地數據包處理,因此它永遠不會通過 veth-pair。
- 如果 Linux 核心數據包檢測到具有非本地本地源地址的傳入數據包(即,通過 veth-pair),它認為這是一個路由錯誤,因為在正常情況下,這意味著網路中某處存在路由循環. 為避免網路氾濫,此數據包將被丟棄。
eth0
如果您的電腦有兩個 LAN 網路介面 (和eth1
),並且您使用 LAN 電纜連接它們,也會發生同樣的事情。因此,如果您想使用 veth-pairs,請創建網路命名空間。