TUN 模式(全隧道 VPN)¶
TUN 模式提供全隧道 VPN 体验,所有客户端流量都通过服务器路由。这与 SOCKS5 中继模式不同,SOCKS5 中继模式需要每个应用程序单独配置 SOCKS5。
TUN 模式与 SOCKS5 模式¶
| 功能 | TUN 模式 | SOCKS5 模式 |
|---|---|---|
| 流量路由 | 全隧道,所有应用 | 按应用,需要 SOCKS5 配置 |
| 设置复杂度 | 服务器端 NAT 配置 | 客户端应用配置 |
| 性能 | 内核级数据包处理 | 应用级中继 |
| 使用场景 | 完全隐私,所有流量 | 应用级隧道 |
在 TUN 模式下,客户端创建虚拟 TUN 接口并将所有流量通过它路由。服务器接收这些数据包并将它们 NAT 到互联网,类似于传统 VPN。
NAT 配置要求¶
TUN 模式需要服务器充当客户端流量的 NAT 网关。服务器必须启用 IP 转发并配置适当的 NAT 规则。
Linux¶
启用 IP 转发:
# 临时(重启后重置)
sudo sysctl -w net.ipv4.ip_forward=1
# 永久
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
使用 iptables 配置 NAT:
# 假设您的公共接口是 eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
或者使用 nftables:
sudo nft add table ip nat
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
sudo nft add rule ip nat postrouting oifname "eth0" masquerade
sudo nft add chain ip filter forward { type filter hook forward priority 0 \; }
sudo nft add rule ip filter forward iifname "tun0" oifname "eth0" accept
sudo nft add rule ip filter forward iifname "eth0" oifname "tun0" ct state related,established accept
将 eth0 替换为您实际的网络接口名称(使用 ip addr 或 ip link 检查)。
macOS¶
macOS 不原生支持服务器端 TUN 模式。对于 macOS 服务器,请使用 SOCKS5 模式或在配置了适当 NAT 的 FreeBSD/Linux VM 中运行 rvpn-server。
FreeBSD¶
启用 IP 转发:
# 临时
sudo sysctl -w net.inet.ip.forwarding=1
# 在 /etc/rc.conf 中永久设置
echo 'gateway_enable="YES"' | sudo tee -a /etc/rc.conf
使用 ipfw 配置 NAT:
sudo sysctl -w net.inet.ip.fw.enable=1
sudo natd -s -m -u -dynamic -i nat0
# 或者直接使用 ipfw 规则
sudo ipfw add 100 nat 1 all from any to any via tun0
有关完整的 ipfw/natd 设置,请添加到 /etc/rc.conf:
TUN 模式的服务器配置¶
[server]
bind_address = "0.0.0.0:443"
tls_cert_file = "/etc/letsencrypt/live/your-domain.com/fullchain.pem"
tls_key_file = "/etc/letsencrypt/live/your-domain.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity.key"
websocket_path = "/api/v1/ws"
[server.network]
nat_enabled = true
dhcp_range = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]
TUN 模式的关键设置:
websocket_path— 必须为/api/v1/ws,以便 TUN 模式客户端能够访问/api/v1/ws/tun端点nat_enabled— 为客户端流量启用服务器端 NATdhcp_range— 分配给已连接客户端的 IP 范围dns_servers— 通过 DHCP 交给客户端的 DNS 服务器
以 TUN 模式运行服务器¶
直接执行¶
作为 systemd 服务¶
服务运行相同的二进制文件,不区分模式。确保 server.toml 具有如上所示的 TUN 模式设置。
验证步骤¶
检查服务器日志:
查找显示 WebSocket 路径和 TUN 处理器的条目:
INFO rvpn_server: Listening on 0.0.0.0:443
INFO rvpn_server: WebSocket path: /api/v1/ws
INFO rvpn_server: TUN mode enabled
验证 NAT 规则是否处于活动状态(Linux):
测试连接:
以 TUN 模式连接客户端并验证:
1. 客户端在 dhcp_range 中接收 IP(例如 10.200.0.x)
2. 客户端可以 ping 外部 IP(例如 8.8.8.8)
3. 客户端 DNS 查询正确解析
检查服务器上的活动连接:
故障排除¶
客户端无法连接¶
- 验证防火墙中端口 443 处于开放状态
- 检查
websocket_path是/api/v1/ws(客户端自动附加/tun) - 查看服务器日志中的 TLS 或 WebSocket 升级错误
流量发出但没有返回¶
- 验证 IP 转发已启用:
sysctl net.ipv4.ip_forward - 检查 NAT 规则:
iptables -t nat -L POSTROUTING - 确保服务器的安全组/防火墙允许所有端口的出站流量
客户端没有互联网访问¶
- 确认 server.toml 中
nat_enabled = true - 验证 DHCP 范围与现有网络不冲突
- 检查
dns_servers可以从服务器访问
服务器上的 TUN 接口¶
服务器在 TUN 模式启用时创建真实的 TUN 接口(例如,IP 为 10.200.0.1 的 tun0)。这提供真正的 TUN 到 TUN 隧道:
| 组件 | 描述 |
|---|---|
| 服务器 TUN | IP 为 10.200.0.1/24 的 tun0 |
| 客户端 TUN | 从 10.200.0.x 获取 IP 的虚拟接口 |
| 路由 | 内核通过 TUN 接口路由数据包 |
服务器的 TUN 接口处理: - 将从客户端接收的数据包写入内核 - 从内核读取响应数据包 - 将响应中继回相应的客户端
反向代理注意事项¶
在反向代理(Caddy、nginx、HAProxy)后面运行时,确保代理将 /api/v1/ws/tun 转发到服务器。TUN 模式的代理配置与 SOCKS5 模式相同——两者都使用相同的 WebSocket 基础路径。
请参阅反向代理设置获取完整的代理配置。
快速参考¶
| 项目 | 值 |
|---|---|
| WebSocket 路径 | /api/v1/ws |
| TUN 端点 | /api/v1/ws/tun |
| 默认端口 | 443 |
| DHCP 范围默认值 | 10.200.0.0/24 |
| 需要 NAT | 是 |