跳转到内容

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 addr 或 ip 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_enabled 与 dhcp_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.1 的 tun0)。这提供了真正的 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需要