我在 Ubuntu 16.04 中创建了一个 veth 设备对,如下所示:
$ sudo ip link add veth1 type veth peer name veth2
$ sudo ip link set dev veth1 up
$ sudo ip link set dev veth2 up
$ sudo ip address add 10.0.10.50/24 dev veth1
$ sudo ip address add 10.0.10.51/24 dev veth2
veth 设备对在同一个命名空间中。我正在尝试测试从一个 veth 设备到另一个设备的 ping。所以我尝试ping如下:
$ ping -I veth1 10.0.10.51
PING 10.0.10.51 (10.0.10.51) from 10.0.10.50 veth1: 56(84) bytes of data.
From 10.0.10.50 icmp_seq=1 Destination Host Unreachable
From 10.0.10.50 icmp_seq=2 Destination Host Unreachable
From 10.0.10.50 icmp_seq=3 Destination Host Unreachable
当我检查 veth2 的 Wireshark 跟踪时,ARP 请求没有得到任何响应(对于 veth1 也观察到类似的跟踪):
Broadcast ARP 42 Who has 10.0.10.51? Tell 10.0.10.50
我想问为什么 veth2 与 veth1 在同一个命名空间时不能响应 ICMP 请求?
更新:如果我按如下方式尝试 ping,那么我会收到 ICMP 响应,但 wireshark 没有显示 veth1 和 veth2 设备的踪迹。
$ ping -I 10.0.10.50 10.0.10.51
PING 10.0.10.51 (10.0.10.51) from 10.0.10.50 : 56(84) bytes of data.
64 bytes from 10.0.10.51: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.10.51: icmp_seq=2 ttl=64 time=0.022 ms
有人可以解释两个 ping 测试的结果差异吗?
部分答案:
对于第二个变体,执行一个
tcpdump -ni lo
(或使用 Wireshark),您将看到通信发生在环回接口上。这是因为内核注意到这两个地址都是本地地址,因此无论这些地址分配给哪个接口,都使用环回接口。对于第一个变体,我不确定为什么广播没有得到应答,但一般来说,内核认为从一个接口发出并出现在另一个接口上的通信是路由错误,并抑制它。广播可能会通过,因为它是广播。
通过相当大的努力,您可以对其进行调整以允许回旋镖 ping,但这通常不是特别有用。
虚拟 eth 对只有在您使用它们连接不同的网络命名空间时才有意义。按照您设置它们的方式,它们与在同一 LAN 网段上拥有两个不同的物理以太网卡一样无用。