什么是 tun 设备?有什么用?

tun 设备是一种虚拟网络设备,它工作在网络层(OSI 第 3 层)。tun 设备处理的是 IP 数据包。它看到的是剥离了数据链路层(如以太网帧头)的原始 IP 包。
与之相对的是 tap 设备,后者工作在数据链路层(OSI 第 2 层),处理完整的以太网帧(包含 MAC 地址)。
tun 设备可以理解为虚拟网卡,没有 MAC 地址,主要用于 VPN 程序。在 Windows 下设备表现如下:

在网络连接中可以看到对应的虚拟网卡

在 linux 下一旦创建并配置好(分配 IP 地址、设置路由)tun 设备,tun 设备就会被内核视为一个普通的网络接口。
tun 设备的主要用途就是VPN(虚拟专用网络),像 OpenVPN, WireGuard, StrongSwan (IPsec) 、easytier 等 VPN 客户端/服务器都依赖 tun 设备。
内核的防火墙规则(如 iptables/nftables)可以应用到 tun 上,在写 iptables 策略时不用单独考虑 tun 设备,可以把其当成普通网口。
tun 设备是纯软件模拟的,没有关联的物理硬件。它不处理物理层(Layer 1)和数据链路层(Layer 2)的细节(如 MAC 地址、ARP、CSMA/CD)。用户空间程序看到/操作的就是纯粹的 IP 包。
linux 下查看 tun 设备:
ip tuntap
ip addr show dev tun0
linux 下 tun 设备的管理
创建
# 创建名为 tun0 的 tun 设备
sudo ip tuntap add mode tun dev tun0
# 或指定用户和组(供非 root 程序使用)
sudo ip tuntap add mode tun user [username] group [groupname] dev tun0
分配 IP 地址
# 为 tun0 分配 IP 地址(点对点模式)
sudo ip addr add 10.8.0.1 peer 10.8.0.2 dev tun0
# 或普通单播地址
sudo ip addr add 192.168.100.1/24 dev tun0
激活设备
sudo ip link set tun0 up
添加路由
# 示例:将所有到 10.8.0.0/24 的流量路由到 tun0
sudo ip route add 10.8.0.0/24 dev tun0
# 或设置默认网关(谨慎!)
sudo ip route add default via 10.8.0.1 dev tun0
销毁 tun 设备
sudo ip link delete tun0
典型工作流示例(手动创建 VPN 隧道)
# 1. 创建设备
sudo ip tuntap add mode tun user vpn dev tun0
# 2. 配置 IP
sudo ip addr add 10.8.0.1 peer 10.8.0.2 dev tun0
sudo ip link set tun0 up
# 3. 设置路由
sudo ip route add 192.168.50.0/24 via 10.8.0.2
# 4. 配置防火墙
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
# 5. 用户空间程序读写 /dev/net/tun
# (例如自定义 VPN 程序读写数据包)
# 6. 销毁
sudo ip link del tun0
在使用 easytier 创建 P2P 网络的过程中会涉及到 tun 设备,以上过程会由 VPN 客户端自动完成。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



