跳转到内容

服务器配置

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

Terminal window
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"

配置新服务器时运行一次以下命令:

Terminal window
cd /etc/rvpn
# Generate the server's long-term identity key
rvpn-server keygen
# Generate the prekey bundle (used by clients to authenticate)
rvpn-server prekey-bundle

会生成:

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

当前服务器不会自动轮换预共享密钥——需要轮换时请手动运行 rvpn-server prekey-bundle 重新生成预共享密钥包。当服务器一次性预共享密钥被消耗时,客户端不需要更新的预共享密钥包;只有当服务器身份密钥变化时,它们才需要新的密钥包。

现有客户端会在首次连接时固定服务器身份密钥(见 服务器身份固定)。要在不影响这些客户端的 前提下轮换身份密钥,请用旧身份对新 bundle 签名,让客户端能够校验链的 连续性:

Terminal window
cd /etc/rvpn
# 保留旧身份足够长的时间用于签署轮换
mv server_identity.key old_identity.key
# 生成新身份
rvpn-server keygen --output server_identity.key
# 发布由 old_identity.key 签名的 v2 bundle
rvpn-server prekey-bundle \
--identity server_identity.key \
--output prekey-bundle.json \
--rotate-from old_identity.key \
--from-version 1

--rotate-from--from-version 必须同时使用。像往常一样把新的 prekey-bundle.json 分发给客户端——已固定的客户端会静默更新,新客户端 则在首次使用时固定新密钥。发布完成后归档 old_identity.key,以便日后 仍能从该版本签署下一次轮换。


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

续期后,请重启 rVPN 以加载新证书:

Terminal window
sudo systemctl restart rvpn-server

如需自动化,可添加部署钩子:

/etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh
#!/bin/bash
systemctl restart rvpn-server
Terminal window
chmod +x /etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh

对于任何非 WebSocket 请求,服务器都会自动返回一个硬编码的类 nginx 风格 404 页面。从外部看,这就像一台未配置的 Web 服务器,而非 VPN 端点。若需完全自定义的诱饵站点,请在反向代理处终止 TLS,并只将 /api/* 转发到 rVPN——请参阅 反向代理设置 中的 Caddy、nginx 和 HAProxy 方案,它们均在根路径提供真实的诱饵网站。


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

[server]
bind_address = "127.0.0.1:8443"
websocket_path = "/api/v1/ws"
# No tls_cert_file / tls_key_file — TLS terminated at the proxy

参见 反向代理设置 了解完整的 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 每分钟允许的新握手尝试次数。

[!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 即可启用。

当连接被限速时,服务器在 debug 级别记录 Rate limited: <IP>,并在无错误响应的情况下关闭连接。


完整可用配置清单请参阅 服务器配置参考