在构建虚拟网络或实现VPN时,TUN和TAP是两个常被提及的虚拟网络设备。它们看似相似,却在网络协议栈的不同层级发挥作用。本文将深入解析它们的工作原理、应用场景及配置方法。
1. 什么是TUN和TAP?
TUN(Network TUNnel)
- 层级:工作于网络层(OSI第三层)
- 数据单元:处理IP数据包
- 特性:模拟点对点设备,无
MAC
地址 - 典型用途:
VPN
(如OpenVPN
)、IP
隧道
TAP(Network TAP)
- 层级:工作于数据链路层(OSI第二层)
- 数据单元:处理以太网帧
- 特性:模拟以太网接口,拥有
MAC
地址 - 典型用途:虚拟机网络(如
QEMU/KVM
)、二层VPN
2. 核心区别对比
特性 | TUN | TAP |
---|---|---|
工作层级 | 第三层(IP 层) |
第二层(数据链路层) |
处理内容 | 仅IP数据包(如 TCP/UDP ) |
完整以太网帧(含 MAC 地址、ARP 等) |
设备类型 | 点对点设备(如tun0 ) |
以太网设备(如tap0 ) |
广播支持 | 不支持 | 支持(可处理 ARP 、DHCP 广播) |
典型场景 | VPN 隧道、路由控制 |
虚拟机网卡、网桥、二层网络嗅探 |
3. 工作流程解析
TUN设备的工作流程
- 发送数据
应用程序生成IP
包 → 内核路由到TUN
设备 → 用户程序从TUN
读取 → 加密后通过物理网卡发送 - 接收数据
物理网卡接收加密数据 → 用户程序解密 → 写回TUN
设备 → 内核处理IP
包
TAP设备的工作流程
- 发送数据
虚拟机生成以太网帧 → 内核转发到TAP
设备 → 用户程序读取帧 → 通过物理网卡发送 - 接收数据
物理网卡接收帧 → 用户程序写回TAP
设备 → 内核视为本地流量 → 传递给虚拟机
4. 实际应用场景
TUN的典型应用
- VPN隧道搭建
OpenVPN
默认使用TUN
模式,将用户流量封装为IP
包,通过SSL/TLS
加密传输。 - 跨网络路由控制
自定义路由规则,实现流量分流(如国内直连/境外走代理)。 - 网络诊断工具
抓取特定IP
流量进行分析,无需处理底层以太网帧。
TAP的典型应用
- 虚拟机网络连接
QEMU/KVM
通过TAP设备将虚拟机接入宿主机网桥,实现NAT
或桥接模式。 - 二层VPN(L2TP)
构建虚拟局域网,使远程设备像处于同一物理网络。 - 网络协议开发
测试ARP
、STP
等二层协议,或实现自定义以太网帧转发逻辑。
5. Linux下的配置示例
创建TUN设备
1 | # 创建TUN设备并配置IP |
创建TAP设备
1 | # 创建TAP设备并加入网桥 |
6. 实战:用socat测试TUN设备通信
实验目标
通过socat工具在两个终端之间通过TUN设备发送ICMP(ping)数据包。
步骤1:创建并配置TUN设备
1 | # 终端A:创建tun0 |
步骤2:使用socat建立隧道
1 | # 终端A:将tun0的数据转发到UDP端口5000 |
步骤3:测试通信
1 | # 终端A ping终端B |
实验原理
- socat将TUN设备与UDP套接字绑定,实现IP包的双向转发
- 内核将ping请求路由到tun0
- socat读取tun0的IP包,通过UDP发送到对端
- 对端socat将UDP数据写回tun1,完成通信闭环
7. 编程交互示例
1 |
|
8. 如何选择TUN/TAP?
选择TUN当:
✅ 仅需处理IP流量
✅ 避免二层协议开销(如ARP广播)
✅ 构建VPN或IP隧道
选择TAP当:
✅ 需要MAC地址和以太网功能
✅ 连接虚拟机或容器网络
✅ 处理非IP协议(如IPX)
9. 注意事项
- 权限问题:操作
/dev/net/tun
需root
权限或CAP_NET_ADMIN
能力 - 性能优化:使用零拷贝技术(如
sendfile
)提升吞吐量 - 安全风险:暴露
TAP
设备可能让攻击者接入二层网络