TUN 模式(全隧道 VPN)
TUN 模式提供全隧道 VPN 体验,所有客户端流量都通过服务器路由。这与 SOCKS5 中继模式不同,后者需要针对每个应用配置 SOCKS5。
TUN 模式 vs SOCKS5 模式
Section titled “TUN 模式 vs SOCKS5 模式”| 特性 | TUN 模式 | SOCKS5 模式 |
|---|---|---|
| 流量路由 | 全隧道,所有应用 | 按应用,需要 SOCKS5 配置 |
| 配置复杂度 | 服务器端 NAT 配置 | 客户端按应用配置 |
| 性能 | 内核级数据包处理 | 应用层中继 |
| 使用场景 | 完全隐私、全部流量 | 特定应用的隧道 |
在 TUN 模式下,客户端创建一个虚拟 TUN 接口,并将所有流量都通过它路由。服务器接收这些数据包并进行 NAT 转发到互联网,类似于传统 VPN。
NAT 配置要求
Section titled “NAT 配置要求”TUN 模式要求服务器充当客户端流量的 NAT 网关。服务器必须启用 IP 转发,并正确配置 NAT 规则。
启用 IP 转发:
# Temporary (resets on reboot)sudo sysctl -w net.ipv4.ip_forward=1
# Permanentecho "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.confsudo sysctl -p使用 iptables 配置 NAT:
# Assuming your public interface is eth0# -s should match [server.network].dhcp_range in server.tomlsudo iptables -t nat -A POSTROUTING -s 10.200.0.0/24 -o eth0 -j MASQUERADEsudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPTsudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT改用 nftables:
sudo nft add table ip natsudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }sudo nft add rule ip nat postrouting oifname "eth0" masqueradesudo nft add chain ip filter forward { type filter hook forward priority 0 \; }sudo nft add rule ip filter forward iifname "tun0" oifname "eth0" acceptsudo nft add rule ip filter forward iifname "eth0" oifname "tun0" ct state related,established accept将 eth0 替换为你实际的网络接口名(使用 ip addr 或 ip link 查看)。
macOS 原生不支持服务器端的 TUN 模式。macOS 服务器请使用 SOCKS5 模式,或在配置了适当 NAT 的 FreeBSD/Linux 虚拟机中运行 rvpn-server。
FreeBSD
Section titled “FreeBSD”启用 IP 转发:
# Temporarysudo sysctl -w net.inet.ip.forwarding=1
# Permanent in /etc/rc.confecho 'gateway_enable="YES"' | sudo tee -a /etc/rc.conf使用 ipfw 配置 NAT:
sudo sysctl -w net.inet.ip.fw.enable=1sudo natd -s -m -u -dynamic -i nat0
# Or using ipfw rules directlysudo ipfw add 100 nat 1 all from any to any via tun0如需完整的 ipfw/natd 配置,添加到 /etc/rc.conf:
firewall_enable="YES"firewall_type="OPEN"natd_enable="YES"natd_interface="vtnet0" # your public interfaceTUN 模式的服务器配置
Section titled “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 = truedhcp_range = "10.200.0.0/24"
[server.tun]enabled = truetun_ip = "10.200.0.1/24"mtu = 1420dns_servers = ["1.1.1.1", "8.8.8.8"]TUN 模式的关键设置:
websocket_path— TUN 模式客户端要到达/api/v1/ws/tun的 TUN 端点,本项必须为/api/v1/ws[server.network].nat_enabled与dhcp_range— 用于检查 iptables NAT 规则的启动提示字段。NAT 本身由运维人员编写(iptables/pf);请参阅 服务器安装 指南。[server.tun].tun_ip— 客户端 IP 从中分配的子网。如果10.200.0.0/24与你的局域网冲突,请更改。[server.tun].dns_servers— 通过隧道推送给客户端的 DNS 解析器
以 TUN 模式运行服务器
Section titled “以 TUN 模式运行服务器”sudo rvpn-server -c /etc/rvpn/server.toml作为 systemd 服务
Section titled “作为 systemd 服务”无论何种模式,服务运行的都是同一个二进制文件。请确保 server.toml 中的 TUN 模式设置如上所示。
sudo systemctl restart rvpn-server检查服务器日志:
sudo journalctl -u rvpn-server -f查找显示 WebSocket 路径和 TUN 处理程序的记录:
INFO Starting rVPN Server on 0.0.0.0:443INFO Server listening on wss://0.0.0.0:443INFO WebSocket endpoint (mobile TUN): /api/v1/ws/tunINFO TUN server started on 10.200.0.1/24验证 NAT 规则处于激活状态 (Linux):
sudo iptables -t nat -L POSTROUTING -vsudo iptables -L FORWARD -v测试连通性:
以 TUN 模式连接客户端并验证:
- 客户端在
dhcp_range中获得 IP(例如10.200.0.x) - 客户端可以 ping 外部 IP(例如
8.8.8.8) - 客户端 DNS 查询能正常解析
检查服务器上的活跃连接:
sudo ss -tlnp | grep 443sudo ip addr show tun0 # if interface exists客户端无法连接
Section titled “客户端无法连接”- 确认防火墙已开放端口 443
- 检查
websocket_path是/api/v1/ws(客户端会自动追加/tun) - 查看服务器日志了解 TLS 或 WebSocket 升级错误
流量能出去但没有返回
Section titled “流量能出去但没有返回”- 确认 IP 转发已启用:
sysctl net.ipv4.ip_forward - 检查 NAT 规则:
iptables -t nat -L POSTROUTING - 确保服务器的安全组/防火墙允许在所有端口上的出站流量
客户端无法访问互联网
Section titled “客户端无法访问互联网”- 确认 server.toml 中
nat_enabled = true - 验证 DHCP 范围与现有网络不冲突
- 检查
dns_servers是否能从服务器访问
服务器上的 TUN 接口
Section titled “服务器上的 TUN 接口”启用 TUN 模式时,服务器会创建真实的 TUN 接口(例如 IP 为 10.200.0.1 的 tun0)。这提供了真正的 TUN 到 TUN 隧道:
| 组件 | 描述 |
|---|---|
| 服务器 TUN | tun0,IP 为 10.200.0.1/24 |
| 客户端 TUN | 具有来自 10.200.0.x IP 的虚拟接口 |
| 路由 | 内核通过 TUN 接口路由数据包 |
服务器的 TUN 接口负责:
- 将从客户端接收的数据包写入内核
- 从内核读取响应数据包
- 将响应转发回相应的客户端
反向代理注意事项
Section titled “反向代理注意事项”在反向代理(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 | 需要 |