我想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 对,请创建网络命名空间。