Debian

如何通過 veth 設備對連接兩個 netcat 實例?

  • December 19, 2020

我想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,請創建網路命名空間。

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