Firecracker VM中veth与tap接口的关联及作用技术问询
Firecracker VM 网络配置:tap与veth接口关联分析
环境信息
CNI配置文件 /etc/cni/conf.d/fcnet.conflist
{ "name": "fcnet", "cniVersion": "1.0.0", "plugins": [ { "type": "ptp", "ipMasq": true, "ipam": { "type": "host-local", "subnet": "10.0.0.0/18", "resolvConf": "/etc/resolv.conf" } }, { "type": "tc-redirect-tap" } ] }
主机侧接口信息(ip a)
74: veth8d52e569@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 0e:0c:9c:36:83:54 brd ff:ff:ff:ff:ff:ff link-netns e5d1188b-598a-409d-a125-844d0558f21e inet 10.0.0.1/32 scope global veth8d52e569 valid_lft forever preferred_lft forever inet6 fe80::b408:58ff:fe66:e16d/64 scope link valid_lft forever preferred_lft forever
网络命名空间内接口信息(sudo ip netns exec <ns-id> ip link show)
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: veth0@if74: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 6a:c1:a5:c8:f9:6c brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 6e:92:e2:26:e8:e2 brd ff:ff:ff:ff:ff:ff
VM内部接口信息(ip a)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 6a:c1:a5:c8:f9:6c brd ff:ff:ff:ff:ff:ff inet 10.0.0.29/18 brd 10.0.63.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::68c1:a5ff:fec8:f96c/64 scope link valid_lft forever preferred_lft forever
Firecracker启动日志
INFO[0000] Attaching NIC tap0 (hwaddr 6a:c1:a5:c8:f9:6c) at index 1
问题解答
1. tap0与veth0的关联方式:TC流量重定向
看不到网桥或iptables规则,是因为这里使用了**tc-redirect-tap CNI插件**,它通过Linux流量控制(TC)的redirect动作实现tap0与veth0的双向流量转发,无需依赖网桥。
具体逻辑:
- 插件会在命名空间内的tap0和veth0接口上配置TC过滤规则,将tap0收到的流量重定向到veth0,再通过veth对的主机侧接口(veth8d52e569)转发至主机网络;
- 反向同理,veth0收到的流量会被重定向到tap0,再传入VM内部。
可通过以下命令验证TC规则:
sudo ip netns exec e5d1188b-598a-409d-a125-844d0558f21e tc filter show dev tap0 ingress sudo ip netns exec e5d1188b-598a-409d-a125-844d0558f21e tc filter show dev veth0 ingress
输出中会包含redirect to dev <目标接口>的规则,明确两者的关联关系。
2. tap0的作用及与VM内eth0的关联
tap0的作用
tap0是用户态虚拟网络接口,作为Firecracker VM与主机网络栈的桥梁:
- 接收VM内核发送的以太网帧,传递给主机侧进行网络处理;
- 接收主机侧发来的帧,转发至VM内核。
与VM内eth0的关联
Firecracker启动时,会将tap0直接绑定到VM的虚拟PCI NIC设备(日志中"Attaching NIC tap0"即为该操作)。VM启动后,内核识别到该虚拟NIC,自动创建对应的eth0接口,两者的MAC地址完全一致(VM内eth0的MAC6a:c1:a5:c8:f9:6c与Firecracker日志中tap0的hwaddr完全匹配)。
这种关联是内核级直接映射:VM内eth0发送的所有帧都会进入tap0的接收队列,tap0收到的帧也会直接传递给VM内的eth0。
3. 查看关联关系的方法
查看tap0与veth0的TC关联
使用TC命令查看接口上的过滤规则:
# 查看tap0的入向过滤规则 sudo ip netns exec <你的命名空间ID> tc filter show dev tap0 ingress # 查看veth0的入向过滤规则 sudo ip netns exec <你的命名空间ID> tc filter show dev veth0 ingress
规则中的redirect to dev <接口名>就是两者的关联依据。
查看tap0与VM内eth0的关联
有三种验证方式:
- MAC地址匹配:Firecracker日志中tap0的hwaddr与VM内eth0的MAC完全一致,这是最直接的关联证据;
- Firecracker API查询:若通过API启动Firecracker,调用
GET /network-interfaces接口,返回信息会明确显示tap设备路径与VM内NIC的对应关系; - 进程关联查询:在主机上查看tap0的所属进程:
sudo lsof | grep tap0
输出会显示tap0被Firecracker进程打开,间接证明该tap0与对应VM的eth0关联。
内容的提问来源于stack exchange,提问作者Betflop
相关产品推荐
相关产品推荐

