1. 虚拟网络设备概述

1.1 什么是虚拟网络设备

虚拟网络设备是 Linux 内核中通过软件模拟的网络接口,它们不直接对应物理硬件,而是作为内核网络协议栈与用户态程序之间的桥梁。与物理网卡(如 eth0)不同,虚拟网络设备的数据收发完全由软件逻辑驱动,而非硬件中断。

核心定位:虚拟网络设备是内核网络协议栈的“软件端点”,允许用户态程序直接注入或捕获网络数据包。

Linux 内核支持多种虚拟网络设备类型,其中 TUN 和 TAP 是最基础、最灵活的两种。它们工作在 OSI 模型的第三层(网络层)和第二层(数据链路层),分别处理 IP 数据包和以太网帧。

虚拟网络设备在内核协议栈中的位置 用户态应用程序(VPN 客户端 / QEMU / 隧道程序) 系统调用层(read / write / ioctl / select / epoll) TUN / TAP 虚拟设备驱动(字符设备) 内核网络协议栈(TCP/IP 协议栈 / 桥接 / 路由 / Netfilter) 数据包处理、路由决策、防火墙过滤 ① 用户态程序通过字符设备接口与内核交互

1.2 TUN 与 TAP 的区别

TUN 和 TAP 虽然共享相同的驱动框架,但处理的数据单元层级不同,这决定了它们各自适用的场景。

对比维度 TUN 设备 TAP 设备
OSI 层级 第三层(网络层) 第二层(数据链路层)
数据单元 IP 数据包(不含以太网头) 以太网帧(含 MAC 头)
设备节点 /dev/net/tun(标志 IFF_TUN) /dev/net/tun(标志 IFF_TAP)
MTU 默认值 1500(可配置) 1500(可配置)
典型用途 VPN(OpenVPN、WireGuard)、IP 隧道 虚拟机网络(QEMU/KVM)、网桥、二层隧道
协议处理 只处理 IP 协议(IPv4/IPv6) 处理所有以太网协议(ARP、IP、IPv6 等)
桥接能力 不支持直接桥接 支持通过 Linux 网桥接入二层网络
记忆口诀:TUN 处理“IP 包”(三层),TAP 处理“以太网帧”(二层)。TUN 更轻量,TAP 更完整。
TUN 与 TAP 数据包处理对比 TUN 设备(三层) 用户态程序(VPN 隧道) IP 数据包(无 MAC 头) 内核 IP 协议栈(路由查找) 只处理 IP 协议,不关心 MAC 地址 适合点对点隧道、VPN 场景 TAP 设备(二层) 用户态程序(QEMU 模拟器) 以太网帧(含 MAC 头 + 数据) 内核桥接 / 以太网协议栈 处理完整以太网帧,支持 ARP、IP 等 适合虚拟机、网桥、二层隧道场景

1.3 应用场景

1.3.1 VPN(虚拟专用网络)

VPN 是 TUN 设备最经典的应用场景。VPN 客户端在用户态创建 TUN 设备,将虚拟 IP 地址绑定到该设备上。当系统需要访问远程网络时,IP 数据包通过路由表被导向 TUN 设备,用户态程序读取这些数据包,加密后通过物理网络发送到 VPN 服务器。

关键流程:
  1. 用户态程序创建 TUN 设备,配置虚拟 IP(如 10.8.0.2)
  2. 修改路由表,将目标网络流量指向 TUN 设备
  3. 内核将 IP 数据包写入 TUN 设备字符接口
  4. 用户态程序读取数据包,加密并封装为 UDP/TCP 报文
  5. 加密后的报文通过物理网卡发送到 VPN 服务器

1.3.2 隧道(Tunnel)

隧道技术利用 TUN/TAP 设备在不同网络之间建立虚拟链路。常见的隧道类型包括:

  • IP 隧道(TUN): 将 IP 数据包封装在另一个 IP 数据包中传输,如 IPIP、GRE 隧道
  • 以太网隧道(TAP): 将二层以太网帧通过三层网络传输,实现远程二层网络互联
  • 用户态隧道: 应用程序通过 TUN/TAP 设备实现自定义隧道协议,如 OpenVPN 的 UDP 隧道

1.3.3 虚拟化(Virtualization)

在虚拟化场景中,TAP 设备是连接宿主机与虚拟机网络的关键组件。以 QEMU/KVM 为例:

组件 角色 说明
QEMU 进程 用户态模拟器 创建 TAP 设备,模拟虚拟网卡(如 virtio-net)
TAP 设备 虚拟网络接口 接收虚拟机发出的以太网帧,传递给宿主机网络栈
Linux 网桥 二层交换 将 TAP 设备桥接到物理网络或虚拟网络
物理网卡 硬件接口 将桥接后的数据包发送到外部网络
虚拟化场景:TAP 设备连接虚拟机与宿主机网络 虚拟机 Guest OS 虚拟网卡(virtio) QEMU 进程 用户态模拟器 TAP 设备 tap0(内核虚拟接口) Linux 网桥(br0) 二层交换:tap0 ↔ eth0 物理网卡(eth0)→ 外部网络 数据流:虚拟机 → QEMU → TAP → 网桥 → 物理网卡
性能注意事项:在虚拟化场景中,TAP 设备的数据路径涉及多次上下文切换(用户态 ↔ 内核态),高吞吐场景下可能成为瓶颈。现代方案使用 vhost-net、vDPA 等加速技术来绕过部分用户态处理。

1.4 本章小结

  • 虚拟网络设备是内核软件模拟的网络接口,TUN/TAP 是最核心的两种类型
  • TUN 处理三层 IP 数据包,适合 VPN、IP 隧道等场景
  • TAP 处理二层以太网帧,适合虚拟机、网桥、二层隧道等场景
  • 用户态程序通过 /dev/net/tun 字符设备与内核交互,使用 read/write 系统调用收发数据
  • 理解 TUN/TAP 的层级差异是正确选择设备类型的前提