跳转至

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 addrip 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

firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="vtnet0"  # 您的公共接口

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 — 为客户端流量启用服务器端 NAT
  • dhcp_range — 分配给已连接客户端的 IP 范围
  • dns_servers — 通过 DHCP 交给客户端的 DNS 服务器

以 TUN 模式运行服务器

直接执行

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

作为 systemd 服务

服务运行相同的二进制文件,不区分模式。确保 server.toml 具有如上所示的 TUN 模式设置。

sudo systemctl restart rvpn-server

验证步骤

检查服务器日志:

sudo journalctl -u rvpn-server -f

查找显示 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):

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 查询正确解析

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

sudo ss -tlnp | grep 443
sudo ip addr show tun0  # 如果接口存在

故障排除

客户端无法连接

  • 验证防火墙中端口 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.1tun0)。这提供真正的 TUN 到 TUN 隧道:

组件 描述
服务器 TUN IP 为 10.200.0.1/24tun0
客户端 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