1. 虚拟网络设备概述
1.1 什么是虚拟网络设备
虚拟网络设备是 Linux 内核中通过软件模拟的网络接口,它们不直接对应物理硬件,而是作为内核网络协议栈与用户态程序之间的桥梁。与物理网卡(如 eth0)不同,虚拟网络设备的数据收发完全由软件逻辑驱动,而非硬件中断。
核心定位:虚拟网络设备是内核网络协议栈的“软件端点”,允许用户态程序直接注入或捕获网络数据包。
Linux 内核支持多种虚拟网络设备类型,其中 TUN 和 TAP 是最基础、最灵活的两种。它们工作在 OSI 模型的第三层(网络层)和第二层(数据链路层),分别处理 IP 数据包和以太网帧。
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 更完整。
1.3 应用场景
1.3.1 VPN(虚拟专用网络)
VPN 是 TUN 设备最经典的应用场景。VPN 客户端在用户态创建 TUN 设备,将虚拟 IP 地址绑定到该设备上。当系统需要访问远程网络时,IP 数据包通过路由表被导向 TUN 设备,用户态程序读取这些数据包,加密后通过物理网络发送到 VPN 服务器。
关键流程:
- 用户态程序创建 TUN 设备,配置虚拟 IP(如 10.8.0.2)
- 修改路由表,将目标网络流量指向 TUN 设备
- 内核将 IP 数据包写入 TUN 设备字符接口
- 用户态程序读取数据包,加密并封装为 UDP/TCP 报文
- 加密后的报文通过物理网卡发送到 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 设备的数据路径涉及多次上下文切换(用户态 ↔ 内核态),高吞吐场景下可能成为瓶颈。现代方案使用 vhost-net、vDPA 等加速技术来绕过部分用户态处理。
1.4 本章小结
- 虚拟网络设备是内核软件模拟的网络接口,TUN/TAP 是最核心的两种类型
- TUN 处理三层 IP 数据包,适合 VPN、IP 隧道等场景
- TAP 处理二层以太网帧,适合虚拟机、网桥、二层隧道等场景
- 用户态程序通过
/dev/net/tun字符设备与内核交互,使用read/write系统调用收发数据 - 理解 TUN/TAP 的层级差异是正确选择设备类型的前提