在 Linux 系统中,TAP 是一种虚拟网络设备,属于 TUN/TAP 虚拟网络设备驱动的一部分。它主要用于在用户空间和内核网络协议栈之间传递 以太网帧(Layer 2),常用于实现虚拟化网络、VPN、虚拟机网络连接等场景。
工作层级
用户空间交互
/dev/net/tun
)与用户空间程序(如 OpenVPN、QEMU、WireGuard)通信,用户程序可以读写原始的以太网帧。典型用途
# 加载 tun/tap 内核模块(通常已默认加载)
sudo modprobe tun
# 创建名为 tap0 的 TAP 设备
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
ip link show tap0
输出类似:
5: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
# 创建网桥并添加 tap0
sudo ip link add name br0 type bridge
sudo ip link set tap0 master br0
sudo ip link set br0 up
sudo ip link delete tap0
特性 | TAP | TUN |
---|---|---|
工作层级 | 数据链路层(L2) | 网络层(L3) |
数据格式 | 以太网帧(含 MAC) | IP 数据包(无 MAC) |
典型用途 | 虚拟机网络、VPN 桥接 | VPN 路由、IP 隧道 |
QEMU/KVM 虚拟机
qemu-system-x86_64 -netdev tap,id=net0,ifname=tap0,script=no -device virtio-net-pci,netdev=net0
tap0
与宿主机通信。OpenVPN 桥接模式
openvpn --mktun --dev tap0
brctl addif br0 tap0
自定义网络工具
用户程序可以通过读写 /dev/net/tun
直接处理原始以太网帧,实现自定义协议或网络嗅探。
权限问题
/dev/net/tun
的读写权限(通常需要 tun
组或 root)。设备未生效
bash
lsmod | grep tun
bash
modprobe tun
性能调优
txqueuelen
)或使用多队列(如 multi_queue
选项)。通过 TAP 设备,Linux 可以实现高度灵活的用户态网络功能,是虚拟化和网络安全工具的重要基础组件。