我正在使用全新安装的 Ubuntu 服务器 24.04.1 LTS。我以 root 身份运行以下命令来设置网络并进行一些实验:
apt install -y netcat-traditional tcpdump inetutils-ping
ip netns add ns1
ip netns add ns2
ip link add my_veth1 type veth peer name my_veth2
ip link set my_veth1 up netns ns1
ip link set my_veth2 up netns ns2
ip -n ns1 address add 1.2.3.4 dev my_veth1
ip -n ns1 route add 2.3.4.0/24 dev my_veth1
ip -n ns2 address add 2.3.4.5 dev my_veth2
然后我在不同的终端运行这些命令:
# Terminal 1
ip netns exec ns1 tcpdump -l -i my_veth1
# Terminal 2
ip netns exec ns2 tcpdump -l -i my_veth2
# Terminal 3
ip netns exec ns1 ping 2.3.4.5
我在终端 1 和 2 上得到了相同的输出:
02:40:27.511438 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
02:40:27.511438 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
02:40:27.511438 ARP, Request who-has 2.3.4.5 tell 1.2.3.4, length 28
...
veth2
具有 IP 地址 2.3.4.5 并正在接收 ARP 请求。为什么它不发送答复?只有当我配置路由表条目时它才会应答:
ip -n ns2 route add 1.2.3.0/24 dev my_veth2
但这不是必需的,因为veth2
应该响应的网络接口的 MAC 地址已经在其响应的请求中编码了。