跳转至

故障排除指南

常见 R-VPN 问题的解决方案。


连接问题

"连接失败"或超时

**症状:**客户端挂在 Connecting to wss://... 最终超时。

检查:

  1. 服务器端口可访问:

    # 从另一台机器
    nc -zv your-server.com 443
    curl -I https://your-server.com/api/v1/ws
    

  2. 防火墙允许端口 443:

    sudo ufw status  # UFW
    sudo iptables -L -n | grep 443  # iptables
    

  3. TLS 证书有效:

    openssl s_client -connect your-server.com:443 -servername your-server.com </dev/null 2>/dev/null | openssl x509 -noout -dates
    

  4. WebSocket 路径正确。客户端连接到 {websocket_path}(例如 /api/v1/ws)。如果您的服务器使用不同路径,请更新 client.toml。


"TLS 握手失败"

**症状:**客户端显示 TLS handshake failedcertificate verify failed

原因和解决方案:

  1. Let's Encrypt 证书未续期:

    sudo certbot certificates
    sudo systemctl reload rvpn-server
    

  2. server_address 中的主机名错误:

    # 主机名必须与证书匹配
    server_address = "wss://your-server.com/api/v1/ws"  # 证书必须是 your-server.com
    

  3. SNI 不匹配:

    # 如果通过 CDN 或 IP 连接
    server_address = "wss://10.0.0.1/api/v1/ws"
    sni_hostname   = "your-server.com"  # 证书主机名
    

  4. iOS:沙箱证书验证问题(旧版本): 确保在更新后重建了 Rust 库。在 iOS 上,证书验证通过 SecTrustEvaluateWithError 使用系统信任存储。


立即 "连接被拒绝"

**症状:**客户端立即失败,显示 Connection refused

检查:

# 服务器正在运行吗?
sudo systemctl status rvpn-server

# 它在正确的端口上监听吗?
sudo ss -tlnp | grep 443

# 您能本地连接吗?
curl -I http://127.0.0.1:8443/api/v1/ws


"X3DH 握手失败"

**症状:**连接开始但在加密设置期间失败。

原因:

  1. 预密钥包不匹配: 客户端和服务器必须使用相同的预密钥包。如果服务器轮换了密钥而客户端有旧包,这可能会失败。

    # 在服务器上:重新生成预密钥包
    rvpn-server prekey-bundle
    # 将新的 prekey-bundle.json 分发给客户端
    

  2. 身份密钥已更改: 如果服务器身份密钥被重新生成,所有客户端都需要新的预密钥包。


"太多连接"或超出速率限制

**症状:**连接成功后一段时间出现 Connection refusedRate limited

检查服务器速率限制:

[server.rate_limit]
max_connections_per_ip    = 5
max_handshakes_per_minute = 10

每个客户端连接占用一个插槽。如果您有许多设备,请增加这些值。


TUN 模式问题

客户端连接但没有互联网访问

检查 1:服务器上的 IP 转发:

sysctl net.ipv4.ip_forward
# 必须返回:net.ipv4.ip_forward = 1

如果未启用:

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf

检查 2:服务器上的 NAT 规则:

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

您应该看到 MASQUERADE 规则和 FORWARD ACCEPT 规则。

如果缺失:

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

检查 3:服务器安全组/防火墙允许出站: 服务器必须能够发起到任何 IP 的任何端口的出站连接,NAT 才能工作。

检查 4:server.toml 中启用了 NAT:

[server.network]
nat_enabled = true

检查 5:客户端路由:

# 在客户端上,检查路由表
ip route show  # Linux
route -n get 0.0.0.0  # macOS

# 默认路由应该指向隧道接口


流量发出但没有返回

**症状:**您可以 ping 外部 IP 但没有响应。服务器日志显示帧被中继但没有 "Relay completed"。

**根本原因:**SOCKS5 响应在隧道就绪之前发送。

**修复:**这是旧版本中的一个错误。重建并重新部署:

cd rvpn-ios && ./build_rust.sh

检查服务器日志:

INFO  rvpn_server: Listening on 0.0.0.0:443
INFO  rvpn_server: WebSocket path: /api/v1/ws
INFO  rvpn_server: TUN mode enabled

如果 TUN 模式未启用,TUN 模式下的客户端将无法正常连接。


服务器上未创建 TUN 接口

检查:

sudo ip addr show tun0
sudo ip link show tun0

如果接口不存在: 1. 验证 [server.tun]enabled = true 2. 检查服务器日志中接口创建期间的错误 3. 尝试不同的接口名称以避免命名冲突


客户端无法 ping 服务器 TUN IP

检查:

# 在服务器上
ping 10.200.0.1  # 从服务器自身通过 tun0 ping

# 在客户端上
ping 10.200.0.1  # 客户端应该能够到达服务器的 TUN IP

如果客户端无法到达 10.200.0.1,隧道未正确建立。


SOCKS5 模式问题

应用未通过代理路由

检查 1:代理正在运行:

curl --socks5 127.0.0.1:1080 https://api.ipify.org

如果这返回您的 VPN 服务器 IP,代理正在工作。

检查 2:系统代理设置: 确保您的系统或应用配置为使用 127.0.0.1:1080 作为 SOCKS5 代理。

检查 3:浏览器代理设置: Chrome 和 Edge 使用系统代理设置。Firefox 有自己的代理设置。

检查 4:应用特定问题: 某些应用不支持 SOCKS5(仅支持 HTTP 代理)。使用 SOCKS5 到 HTTP 代理适配器或切换到 TUN 模式。


SOCKS5 模式下的 DNS 泄漏

**症状:**DNS 泄漏测试显示您的 ISP DNS,而不是 VPN DNS。

**修复:**启用 DNS 代理:

[dns_proxy]
enabled        = true
listen_address = "127.0.0.1:53"

将您的系统 DNS 配置为 127.0.0.1。请参阅防止 DNS 泄漏获取详细设置。

Chrome 特定问题:**Chrome 默认使用自己的安全 DNS 解析器,这会绕过系统 DNS 和 VPN 隧道。 - 在桌面/安卓上:前往 设置 → 隐私和安全 → 安全 → 使用安全 DNS 并关闭它。 - 清除 Chrome 的 DNS 缓存:访问 chrome://net-internals/#dns 并点击 **清除主机缓存。 - 在 iOS 上:强制关闭 Chrome 或清除浏览数据以刷新其缓存。


多路复用模式问题

**症状:**某些应用或网站无法加载、超时或行为不一致,而代理似乎正在运行。

**修复:**多路复用模式在所有流之间共享单个 WebSocket 隧道。如果某个网站或应用与此行为不兼容,请暂时切换到旧版(非多路复用)模式:

[socks5]
multiplex = false

重要:**旧版模式为**每个 TCP 流打开一个 WebSocket 连接。繁忙的浏览器很容易耗尽服务器的 max_connections_per_ip 限制。如果您计划定期使用旧版模式,请要求服务器管理员提高限制:

[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000

连接速度慢

可能原因:

  1. **高延迟:**VPN 服务器地理位置遥远
  2. **服务器过载:**一个服务器上的连接太多
  3. **带宽限制:**服务器的上游饱和
  4. **MTU 问题:**高延迟链路上的数据包分片

解决方案:

  1. 在 client.toml 中降低 MTU:

    [tun]
    mtu = 1280
    

  2. 尝试更靠近您位置的不同服务器

  3. 检查服务器负载:uptimehtop
  4. 如果不需要,禁用 IPv6:
    [network]
    ipv6_enabled = false
    prefer_ipv4  = true
    

iOS 应用问题

"启动 VPN 失败"

检查: 1. 服务器地址包含 wss://(不是 https://) 2. 身份密钥已生成(设置 -> 身份) 3. 预密钥包已导入 4. 服务器正在运行且可访问

重建 Rust 库:

cd rvpn-ios && ./build_rust.sh


连接频繁断开

可能原因:

  1. 网络不稳定(Wi-Fi 到蜂窝切换)
  2. iOS 在后台挂起应用
  3. VPN 配置文件被撤销

解决方案: 1. 在 iOS 设置 -> VPN 中启用"始终在线 VPN" 2. 检查 iOS 更新 3. 重建并重新安装应用


未分配 IP

**原因:**服务器的 DHCP 池耗尽。

**修复:**在服务器上增加 DHCP 范围:

[server.network]
dhcp_range = "10.200.0.0/22"  # /22 提供 1022 个 IP,而不是 254

或断开未使用的客户端。


分流隧道问题

绕过流量仍通过 VPN

检查:

[split_tunnel]
enabled = true  # 必须为 true 才能使任何绕过生效
builtin_bypass_countries = ["CN"]

验证规则已加载: 客户端日志在启动时应显示绕过规则:

INFO  rvpn_client: Split tunnel enabled, X networks bypassed

检查路由表:

ip route show  # Linux
route -n get 0.0.0.0  # macOS

确保被绕过的网络不在 VPN 路由表中。


流媒体服务仍被屏蔽

原因: 1. 流媒体服务可能使用 GPS/地区信号,而不仅仅是 IP 2. 账户支付货币和历史影响内容 3. CDN IP 可能与国家绕过数据不匹配

解决方案: 1. 清除浏览器/应用 cookies 和缓存 2. 使用浏览器扩展伪造时区和地区 3. 可能需要全隧道模式(不绕过任何内容)


性能问题

VPN 延迟高

检查到服务器的延迟:

ping your-server.com

如果即使到服务器的延迟也很高,那是地理距离的问题,不是 VPN。

优化: 1. 使用更靠近您位置的服务器 2. 如果在卫星或高延迟链路上,降低 MTU:

[tun]
mtu = 1280

吞吐量低

检查: 1. 服务器带宽:到服务器的 iperf3 测试 2. 客户端硬件:加密对旧设备是 CPU 密集型的 3. 网络拥塞

优化:

[performance]
worker_threads        = 4
crypto_worker_count   = 4
recv_buffer_size      = 262144
send_buffer_size      = 262144


获取更多信息

启用调试日志

获取详细客户端日志:

RUST_LOG=debug rvpn -c ~/.config/rvpn/client.toml

获取服务器日志:

RUST_LOG=debug sudo rvpn-server -c /etc/rvpn/server.toml

检查系统日志

# systemd journal
sudo journalctl -u rvpn-server -f

# 内核日志(用于 TUN 接口问题)
dmesg | grep tun

验证网络路径

# 跟踪到服务器的路径
traceroute your-server.com

# 从服务器跟踪到目标的路径
# (在服务器上)sudo tcpdump -i tun0 -n

常见日志消息

日志消息 含义
Listening on 0.0.0.0:443 服务器启动成功
WebSocket path: /api/v1/ws WebSocket 端点已配置
TUN mode enabled 服务器 TUN 接口活动
X3DH handshake complete 加密已建立
NAT enabled 服务器将伪装客户端流量
Relay completed 一个数据中继会话完成
Too many connections 超出速率限制