容器里的 eth0 在宿主机上对应什么?veth 是什么?这篇从 /sys/class/net 的 ifindex 与 iflink 出发,找到容器网卡在虚拟机里的另一端,验证两端流量一致,再手动造一对 veth。
容器里 eth0:ifindex = 11,iflink = 2364(iflink 是对端设备的编号) 容器里 ip link:eth0@if2364: 虚拟机里 ifindex = 2364 的设备:veth8554796 ifindex=2364 iflink=11 它的类型:veth;它挂在哪个网桥上(master):docker0 容器主进程在虚拟机里的 PID 98747:它的 net 命名空间 = net:[4026534595]
每个 veth 设备的 iflink 是对端的 ifindex。容器 eth0 的 iflink 是 2364,虚拟机里 ifindex 为 2364 的是 veth8554796,它的 iflink 又指回 11。这个 veth 挂在 docker0 网桥下(master)。
容器 eth0 发送增量 10504 字节;虚拟机 veth8554796 接收增量 10504 字节(ping 10 个 1000 字节负载的包,两个增量相同)
容器的 tx_bytes 和虚拟机端的 rx_bytes 增量完全一样,因为它们是同一根线的两头。
v0:ifindex=12 iflink=11;v1:ifindex=11 iflink=12 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.059/0.085/0.133 ms blue (id: 1) 10.77.0.0/24 dev v1 proto kernel scope link src 10.77.0.2
用 iproute2 在特权容器里建了命名空间 blue 和一对 veth,配上地址后互相 ping 通。这些都在那个特权容器自己的网络命名空间里,容器退出后一并消失,没有碰虚拟机的网络。iproute2 是我在镜像里 apk add 装的(busybox 的 ip 不支持把 veth 一端放进命名空间)。