Veth 和 Tap 误区
veth 和 tap 用途不同,虽然它们都表现成 “一张虚拟网卡”,但设计目的和适用场景不一样:
1. veth 的设计目的
- veth 是 成对存在的。
- A 端收到的包会原封不动地从 B 端出来,就像一根“虚拟网线”。
- 常见用法:连接不同的网络命名空间(比如容器和宿主机,容器和 bridge)。
例子:
容器 netns eth0 (vethA) <---> (vethB) 宿主机上的 bridge
2. tap 的设计目的
- tap 设备本质上是 内核 <-> 用户态程序 的接口。
- tap 收到的包,会交给用户态程序去处理;用户态程序写进去的包,会进入内核协议栈。
常见用法:VPN、虚拟机
- QEMU/KVM 用 tap 给虚拟机当网卡,虚拟机发的二层帧通过 tap 交给宿主机。
- OpenVPN 用 tun/tap 把用户态数据接入内核网络协议栈。
3. 为什么 veth 不能直接替代 tap
- veth 对接的是 另一个 netns / 内核协议栈,它不依赖用户态。
- tap 对接的是 用户态程序,它不能直接拉一个 netns 另一头。
举例:
- 你要连一个容器 → 用 veth pair。
- 你要连一个虚拟机 → 用 tap。
- 你要做 VPN → 用 tun/tap。
一句话总结:
veth 是内核里的虚拟网线,tap 是内核和用户态的虚拟网卡。
为什么连虚拟机用tap,虚拟机没有netns问题吗
1. 虚拟机本身有没有 netns?
- Linux netns 是 Linux 内核里的概念。你
ip netns add ...
创建的是 Linux 内核空间里的网络命名空间。 - 虚拟机 (KVM/QEMU) 其实是一个完整的操作系统,它跑在宿主机进程里,虚拟机内有自己的内核和网络栈,它不会直接用宿主机的 netns。
换句话说,虚拟机内部的“网络栈”是一个独立的世界,它和宿主机的 netns 没有关系。
2. 为什么虚拟机用 tap?
因为 tap 提供的是 二层设备(虚拟网卡)。
- QEMU/虚拟机里的 OS 启动时,它需要看到一个 网卡 (eth0),才能跑 DHCP、ARP、配置 IP。
- QEMU 就会在宿主机里开一个 tap 设备,并把它接到一个 Linux bridge 上(比如 br0)。
- 从虚拟机内部看,tap 对应的就是它的
eth0
,它能收发 以太网帧,所以能跑 ARP、DHCP,这和真实网卡行为一致。
如果你换成 veth:
- veth 是 内核内的点对点管道,它是给 Linux netns 设计的,没法直接让虚拟机识别成自己的
eth0
。 - 虚拟机需要的是真实网卡模拟,而不是一个 Linux 内核内部的管道。
3. 总结区别:
- veth:用在 Linux 容器 或 netns 之间通信。因为容器和宿主机共享同一个内核,只是网络栈隔离。
- tap:用在 虚拟机 场景。因为虚拟机跑的是自己的内核,它需要看到“硬件网卡”,tap 就是这种虚拟网卡的接口。
所以你看到的区别就是:
- 容器用 veth(连 namespace)
- 虚拟机用 tap(连 bridge,模拟真实网卡)
那tap和bridge的区别在哪里?
我们把 tap 和 bridge 放在同一个视角下看,就容易看出区别了:
1. 定位不同
TAP:
- 是一个 虚拟网卡接口,模拟以太网设备(Layer 2)。
- 它的存在目的是 给用户态程序或虚拟机提供一个虚拟的“网线插口”。
- 谁用?虚拟机、VPN 程序、用户态网络协议栈。
Bridge:
- 是一个 内核里的虚拟交换机。
- 它本身不产生流量,只是把接入它的多个接口连接在一起(类似二层交换机)。
- 谁用?多个网卡/虚拟设备要在二层互通时。
2. 举例说明流量路径
情况 A:虚拟机用 TAP
- VM 发出以太网帧 → TAP 接口收到 → 内核 → Bridge → 物理网卡 → 外网。
- TAP 在这里就是 VM 的网卡。
情况 B:容器用 VETH + Bridge
- 容器进程 → veth pair 的一端(在容器 netns) → 另一端在宿主机 netns → Bridge → 物理网卡。
- veth 在这里就是 容器的网卡。
区别
- 虚拟机要模拟一块网卡 → TAP 合适(因为 VM 需要完整二层帧收发)。
- 容器只是个进程隔离,不需要模拟硬件网卡 → veth 更轻量。
- Bridge 两边既可以接 TAP,也可以接 veth、物理网卡、其他 bridge,它只是负责转发。
3. 对比表
特性 | TAP | Bridge |
---|---|---|
类型 | 虚拟网卡接口 | 内核虚拟交换机 |
层级 | 二层(以太网帧) | 二层转发 |
功能 | 给虚拟机/程序提供“网卡” | 把多个接口连成同一二层广播域 |
谁用 | 虚拟机、VPN、用户态网络栈 | 容器、虚拟机、物理网卡互联 |
关系 | 产生流量的源或宿 | 负责在接口间转发 |
所以一句话总结:
- Tap 是端口(虚拟网卡),谁需要插就插它。
- Bridge 是交换机,用来把端口互联。