Veth、Tap、bridge关系梳理

半兽人 发表于: 2025-08-27   最后更新时间: 2025-08-27 10:34:01  
{{totalSubscript}} 订阅, 91 游览

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的区别在哪里?

我们把 tapbridge 放在同一个视角下看,就容易看出区别了:

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 是交换机,用来把端口互联。
更新于 2025-08-27

查看Linux更多相关的文章或提一个关于Linux的问题,也可以与我们一起分享文章