TAP 设备与 vnet 接口是什么
TAP 是 Linux 内核提供的虚拟二层网卡,配合 /dev/net/tun 字符设备工作:用户态程序(典型是 QEMU)打开该设备后,内核就出现一块对应的虚拟网卡,程序把收到的以太网帧写进去,就等于把包送进内核协议栈。QEMU 为虚机创建的 TAP 在 libvirt 环境里常命名为 vnetN(手工创建时常用 tapN),再由桥接或 NAT 规则接入宿主网络。理解这层关系是排查虚机网络问题的基础。
基本信息
| 形态 | /dev/net/tun 字符设备加内核 TAP 网卡,二层转发 |
|---|---|
| 命名习惯 | libvirt 自动创建时常用 vnetN,手工创建时常用 tapN |
| 接入方式 | 桥接到 br0 等网桥,或由 NAT 与防火墙规则处理 |
| 权限要求 | 创建 TAP 与改网桥需要 root 或相应能力 |
| 查看命令 | ip -br link、bridge link、virsh domiflist |
| 对应关系 | 一块虚机网卡对应一个 vnet 接口,可在域定义里核对 |
| 卸载 | 虚机关机后 vnet 通常自动销毁,桥接口长期存在 |
典型使用场景
- 排查虚机网络不通:确认 vnet 是否已创建并正确桥接
- 抓包定位丢包:在虚机网卡与宿主上联口两侧同时抓,判断丢在哪段
- 核对地址绑定:确认虚机网卡 MAC 与 vnet 的对应关系,避免接错网桥
- 桥接改造为 NAT 或反向切换,调整虚机出网方式
- 性能诊断:观察 vnet 与物理口的收发计数差异,判断是否存在丢包
- 多网卡虚机排障:确认每块网卡各自对应哪个 vnet
查看 vnet 与桥接关系
查看 vnet 与桥接关系
sudo virsh domiflist vm1 # 列出虚机网卡、对应接口名与网桥
ip -br link show vnet0 # 看接口是否 UP,以及 MAC 地址
bridge link show vnet0 2>/dev/null || echo 'not bridged' # 是否挂在网桥上
ip -s link show vnet0 # 收发计数与错误计数,观察是否持续增长
cat /proc/net/dev | grep -E 'vnet|br0' # 另一次读取计数的入口
sudo tcpdump -i vnet0 -nn -c 20 # 在虚机侧接口抓包,与宿主侧结果对比计数与现象读法
| 现象 | 含义 | 排查方向 |
|---|---|---|
| 虚机内有 vnet 但无流量 | 网桥或路由未正确接入 | 核对桥接成员与网桥地址 |
| vnet 计数增长但业务不通 | 包已出虚机但未通过宿主转发 | 看宿主上联口与转发表、NAT 与防火墙规则 |
| 宿主侧丢包计数持续增长 | 队列或带宽瓶颈 | 检查接口队列长度与流量峰值 |
| 两端计数都不增长 | 虚机内部未发出流量 | 回到 guest 内查协议栈与路由 |
| MAC 与预期不符 | 接口与虚机对应关系搞错 | 用 virsh domiflist 与域定义交叉核对 |
vnetN 与虚机网卡一一对应;排查丢包时同时看 vnet 计数与宿主上联口统计,只看一侧容易得出错误结论。
调整宿主网桥配置属于高风险操作:远程连接可能随之中断,动手前先准备好带外管理或本地控制台,并保留一份可回滚的旧配置。