如何通过 veth 设备对连接两个 netcat 实例?

如何通过 veth 设备对连接两个 netcat 实例?

我想netcat通过 veth(4) 设备对连接到 的实例。

因此,我使用如下方式创建 veth 对ip

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
...

我究竟做错了什么?

答案1

我发现它们应该放在不同的网络命名空间中,但是当两个 veth 对都分配了 IP 地址时,您能告诉我为什么它不能在单个命名空间中工作吗?

以下情况可能都会出错:

  • 监听地址的应用程序将处理任何此地址的传入数据包,无论它来自何处。因此数据包可能来自任一端,甚至来自完全不同的网络接口(例如eth0)。
  • 如果 Linux 内核检测到本地的目标地址,它会将其作为本地数据包处理,因此它永远不会通过 veth-pair。
  • 如果 Linux 内核数据包检测到传入数据包的本地源地址不是本地的(即通过 veth-pair 来的),它会认为这是路由错误,因为在正常情况下,这意味着网络中的某个地方存在路由循环。为了避免网络泛洪,该数据包将被丢弃。

eth0如果您的计算机有两个 LAN 网络接口(和eth1),并且您使用 LAN 电缆连接它们,也会发生同样的情况。

因此,如果您想使用 veth 对,请创建网络命名空间。

相关内容