跳转至

服务器配置

服务器从 TOML 文件(默认:server.toml)读取其配置。

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

最小配置

[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"

完整示例

[server]
bind_address      = "0.0.0.0:443"
tls_cert_file     = "/etc/letsencrypt/live/example.com/fullchain.pem"
tls_key_file      = "/etc/letsencrypt/live/example.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity.key"
websocket_path    = "/api/v1/ws"
http_port         = 80

[server.network]
nat_enabled = true
dhcp_range  = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]

[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000

[server.tun]
enabled = true
tun_ip = "10.200.0.1/24"
mtu = 1420
interface_name = "tun0"

密钥管理

生成密钥

在设置新服务器时运行这些命令一次:

cd /etc/rvpn

# 生成服务器的长期身份密钥
rvpn-server keygen

# 生成预密钥包(供客户端用于身份验证)
rvpn-server prekey-bundle

这会生成:

  • server_identity.key — 服务器的 Ed25519 身份密钥对。备份并保持私密。
  • prekey-bundle.json — 公共预密钥包。分发给客户端。
  • prekey-bundle.private.json — 私有签名预密钥材料。保持私密。

轮换预密钥

预密钥每 7 天自动轮换(可通过 prekey_rotation_hours 配置)。预密钥轮换时客户端不需要更新的预密钥包——仅在服务器的 identity key 更改时才需要。


TLS 证书续期

Let's Encrypt 证书每 90 天过期。Certbot 会自动安装续期 cron 任务。

续期后,重新加载 R-VPN 以获取新证书:

sudo systemctl reload rvpn-server
# 或者如果 reload 不支持:
sudo systemctl restart rvpn-server

要实现自动化,请添加部署钩子:

# /etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh
#!/bin/bash
systemctl reload rvpn-server 2>/dev/null || systemctl restart rvpn-server
chmod +x /etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh


诱饵网站(可选)

要使服务器看起来像普通 HTTPS 网站以应对随意探测,请将 decoy_root 指向包含静态 HTML 文件的目录:

[server]
decoy_root = "/var/www/html"

任何非有效 R-VPN WebSocket 升级请求都将收到诱饵网站。


无 TLS 运行(反向代理模式)

如果您在 Caddy、nginx 或 HAProxy 后面运行,请省略证书/密钥文件并绑定到本地端口:

[server]
bind_address      = "127.0.0.1:8443"
websocket_path    = "/api/v1/ws"
# 不需要 tls_cert_file / tls_key_file — TLS 在代理层终止

请参阅反向代理设置获取完整的 Caddy、nginx 和 HAProxy 配置,包括诱饵网站设置和多服务器负载均衡。


速率限制

服务器对每个客户端 IP 的传入连接进行速率限制,以防止滥用。

[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000
  • max_connections_per_ip — 来自单个 IP 地址的最大并发连接数。
  • max_handshakes_per_minute — 每个 IP 每分钟最大新握手尝试次数。

SOCKS5 客户端需要更高的限制

[!WARNING] 在旧版(非多路复用)SOCKS5 模式下,协议为**每个 TCP 流打开一个 WebSocket 连接**。一个现代浏览器页面可以轻松打开 20–50 个并发连接(HTML、CSS、JS、图片、API 调用)。如果速率限制过低,连接将被静默丢弃,页面将无法加载。

为旧版 SOCKS5 客户端提供服务时,请将 max_connections_per_ip 设置为**至少 500**,max_handshakes_per_minute 设置为**至少 2000**。根据每个用户的预期并发连接数适当调高。

[!NOTE] 多路复用 SOCKS5 模式(单个 WebSocket,多个流)是现代客户端的默认模式。由于所有流共享一个连接,它完全消除了速率限制问题。在客户端配置中设置 multiplex = true 以使用它。

当连接被限速时,服务器会在调试级别记录 Rate limited: <IP> 并关闭连接而不返回错误响应。


所有选项

请参阅服务器配置参考获取每个可用设置的完整列表。