跳转到内容

TUN 模式(全隧道 VPN)

TUN 模式提供全隧道 VPN 体验,所有客户端流量都通过服务器路由。这与 SOCKS5 中继模式不同,后者需要针对每个应用配置 SOCKS5。


特性TUN 模式SOCKS5 模式
流量路由全隧道,所有应用按应用,需要 SOCKS5 配置
配置复杂度服务器端 NAT 配置客户端按应用配置
性能内核级数据包处理应用层中继
使用场景完全隐私、全部流量特定应用的隧道

在 TUN 模式下,客户端创建一个虚拟 TUN 接口,并将所有流量都通过它路由。服务器接收这些数据包并进行 NAT 转发到互联网,类似于传统 VPN。


TUN 模式要求服务器充当客户端流量的 NAT 网关。服务器必须启用 IP 转发,并正确配置 NAT 规则。

启用 IP 转发:

Terminal window
# Temporary (resets on reboot)
sudo sysctl -w net.ipv4.ip_forward=1
# Permanent
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

使用 iptables 配置 NAT:

Terminal window
# Assuming your public interface is eth0
# -s should match [server.network].dhcp_range in server.toml
sudo iptables -t nat -A POSTROUTING -s 10.200.0.0/24 -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:

Terminal window
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 addrip link 查看)。

macOS 原生不支持服务器端的 TUN 模式。macOS 服务器请使用 SOCKS5 模式,或在配置了适当 NAT 的 FreeBSD/Linux 虚拟机中运行 rvpn-server。

启用 IP 转发:

Terminal window
# Temporary
sudo sysctl -w net.inet.ip.forwarding=1
# Permanent in /etc/rc.conf
echo 'gateway_enable="YES"' | sudo tee -a /etc/rc.conf

使用 ipfw 配置 NAT:

Terminal window
sudo sysctl -w net.inet.ip.fw.enable=1
sudo natd -s -m -u -dynamic -i nat0
# Or using ipfw rules directly
sudo ipfw add 100 nat 1 all from any to any via tun0

如需完整的 ipfw/natd 配置,添加到 /etc/rc.conf

Terminal window
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="vtnet0" # your public interface

[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"
[server.tun]
enabled = true
tun_ip = "10.200.0.1/24"
mtu = 1420
dns_servers = ["1.1.1.1", "8.8.8.8"]

TUN 模式的关键设置:

  • websocket_path — TUN 模式客户端要到达 /api/v1/ws/tun 的 TUN 端点,本项必须为 /api/v1/ws
  • [server.network].nat_enableddhcp_range — 用于检查 iptables NAT 规则的启动提示字段。NAT 本身由运维人员编写(iptables/pf);请参阅 服务器安装 指南。
  • [server.tun].tun_ip — 客户端 IP 从中分配的子网。如果 10.200.0.0/24 与你的局域网冲突,请更改。
  • [server.tun].dns_servers — 通过隧道推送给客户端的 DNS 解析器

Terminal window
sudo rvpn-server -c /etc/rvpn/server.toml

无论何种模式,服务运行的都是同一个二进制文件。请确保 server.toml 中的 TUN 模式设置如上所示。

Terminal window
sudo systemctl restart rvpn-server

检查服务器日志:

Terminal window
sudo journalctl -u rvpn-server -f

查找显示 WebSocket 路径和 TUN 处理程序的记录:

INFO Starting rVPN Server on 0.0.0.0:443
INFO Server listening on wss://0.0.0.0:443
INFO WebSocket endpoint (mobile TUN): /api/v1/ws/tun
INFO TUN server started on 10.200.0.1/24

验证 NAT 规则处于激活状态 (Linux):

Terminal window
sudo iptables -t nat -L POSTROUTING -v
sudo iptables -L FORWARD -v

测试连通性:

以 TUN 模式连接客户端并验证:

  1. 客户端在 dhcp_range 中获得 IP(例如 10.200.0.x
  2. 客户端可以 ping 外部 IP(例如 8.8.8.8
  3. 客户端 DNS 查询能正常解析

检查服务器上的活跃连接:

Terminal window
sudo ss -tlnp | grep 443
sudo ip addr show tun0 # if interface exists

  • 确认防火墙已开放端口 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 接口(例如 IP 为 10.200.0.1tun0)。这提供了真正的 TUN 到 TUN 隧道:

组件描述
服务器 TUNtun0,IP 为 10.200.0.1/24
客户端 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需要