服务器设置¶
本指南介绍如何设置 R-VPN 服务器。
前提条件¶
- 具有公网 IP 的 Linux 服务器
- 指向服务器的域名(例如
vpn.example.com) - Root 或 sudo 访问权限
- 开放 443 端口(HTTPS)
安装¶
1. 安装二进制文件¶
下载适合您平台的服务器二进制文件:
# 下载服务器二进制文件(根据需要调整 URL/版本)
curl -L -o rvpn-server https://github.com/r-vpn/rvpn/releases/latest/download/rvpn-server-linux-x86_64
# 添加执行权限
chmod +x rvpn-server
# 安装到系统路径
sudo mv rvpn-server /usr/local/bin/
# 验证安装
rvpn-server --help
2. 创建目录¶
创建配置、数据和日志所需的目录:
# 配置目录
sudo mkdir -p /etc/rvpn
# 数据目录(用于持久化状态)
sudo mkdir -p /var/lib/rvpn
# 日志目录
sudo mkdir -p /var/log/rvpn
# 设置权限
sudo chmod 755 /etc/rvpn /var/lib/rvpn /var/log/rvpn
3. 生成服务器密钥¶
生成服务器身份密钥:
# 生成身份密钥(在当前目录创建 server_identity.key)
cd /etc/rvpn
sudo rvpn-server keygen
# 设置安全权限
sudo chmod 600 /etc/rvpn/server_identity.key
这将创建用于认证和 X3DH 密钥交换的 Ed25519 身份密钥对。
4. 生成预密钥包¶
为客户端生成 X3DH 预密钥包:
# 从身份密钥生成预密钥包
sudo rvpn-server prekey-bundle \
--identity /etc/rvpn/server_identity.key \
--output /var/lib/rvpn/prekey-bundle.json
# 设置权限(预密钥包是公开的,但不应被修改)
sudo chmod 644 /var/lib/rvpn/prekey-bundle.json
预密钥包包含:
- identity_key - 服务器的 Ed25519 公钥(用于认证)
- identity_x25519_key - 从身份密钥派生的 X25519 公钥
- signed_prekey - 用于 X3DH 的 X25519 公钥(定期轮换)
- prekey_signature - 证明预密钥真实性的签名
- one_time_prekey - 可选:用于增强安全性的一次性预密钥
同时也会创建私有包(prekey-bundle.private.json)- 请妥善保管,不要分发。
5. 配置 TLS 证书¶
R-VPN 需要 TLS 1.3 证书。推荐使用 Let's Encrypt:
使用 Let's Encrypt(推荐)¶
# 安装 certbot
sudo apt update
sudo apt install certbot
# 获取证书(独立模式)
sudo certbot certonly --standalone -d vpn.example.com
# 复制证书到 R-VPN 目录
sudo cp /etc/letsencrypt/live/vpn.example.com/fullchain.pem /etc/rvpn/cert.pem
sudo cp /etc/letsencrypt/live/vpn.example.com/privkey.pem /etc/rvpn/key.pem
# 设置权限
sudo chmod 600 /etc/rvpn/key.pem
sudo chmod 644 /etc/rvpn/cert.pem
# 设置自动续期钩子
echo '#!/bin/bash
cp /etc/letsencrypt/live/vpn.example.com/fullchain.pem /etc/rvpn/cert.pem
cp /etc/letsencrypt/live/vpn.example.com/privkey.pem /etc/rvpn/key.pem
chmod 600 /etc/rvpn/key.pem
chmod 644 /etc/rvpn/cert.pem
systemctl restart rvpn-server' | sudo tee /etc/letsencrypt/renewal-hooks/deploy/rvpn-server
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/rvpn-server
使用现有证书¶
如果您有其他提供商的证书:
# 复制您的证书和密钥
sudo cp /path/to/your/cert.pem /etc/rvpn/cert.pem
sudo cp /path/to/your/key.pem /etc/rvpn/key.pem
# 设置权限
sudo chmod 600 /etc/rvpn/key.pem
sudo chmod 644 /etc/rvpn/cert.pem
配置¶
创建 /etc/rvpn/server.toml:
[server]
# 绑定地址(默认 443 端口用于隐蔽)
bind_address = "0.0.0.0:443"
# TLS 证书
tls_cert_file = "/etc/rvpn/cert.pem"
tls_key_file = "/etc/rvpn/key.pem"
# 服务器身份
identity_key_file = "/etc/rvpn/server_identity.key"
# 预密钥包文件(用于重启间保持密钥一致)
prekey_bundle_file = "/var/lib/rvpn/prekey-bundle.json"
# X3DH 预密钥设置
prekey_rotation_hours = 168 # 每周轮换
one_time_prekey_count = 100 # 维护 100 个 OTPK
# WebSocket 路径(VPN 连接的隐藏端点)
websocket_path = "/connect"
# HTTP 端口用于 ACME 挑战和重定向(可选)
http_port = 80
redirect_http_to_https = true
# 可选:伪装网站根目录(向非 VPN 访问者提供正常网站)
# decoy_root = "/var/www/html"
[server.rate_limit]
max_connections_per_ip = 5
max_handshakes_per_minute = 10
[server.network]
nat_enabled = true
dhcp_range = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]
配置选项¶
| 选项 | 默认值 | 描述 |
|---|---|---|
bind_address |
0.0.0.0:443 |
绑定的地址和端口 |
tls_cert_file |
certs/cert.pem |
TLS 证书路径 |
tls_key_file |
certs/key.pem |
TLS 私钥路径 |
identity_key_file |
server_identity.key |
服务器身份密钥路径 |
prekey_bundle_file |
- | 预密钥包路径(用于密钥一致性) |
websocket_path |
/connect |
WebSocket 端点路径 |
http_port |
- | ACME/重定向的 HTTP 端口(未设置则禁用) |
redirect_http_to_https |
true |
将 HTTP 重定向到 HTTPS |
decoy_root |
- | 伪装网站文件路径 |
prekey_rotation_hours |
168 |
预密钥轮换间隔(小时) |
one_time_prekey_count |
100 |
维护的一次性预密钥数量 |
运行服务器¶
手动启动(测试)¶
# 使用配置文件运行
sudo rvpn-server --config /etc/rvpn/server.toml
# 使用详细日志运行
sudo rvpn-server --config /etc/rvpn/server.toml -v
# 使用自定义绑定地址运行
sudo rvpn-server --config /etc/rvpn/server.toml --bind 0.0.0.0:8443
Systemd 服务(生产环境)¶
创建 /etc/systemd/system/rvpn-server.service:
[Unit]
Description=R-VPN Server
After=network.target
Wants=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/rvpn-server --config /etc/rvpn/server.toml
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=rvpn-server
# 安全加固(可选,根据需要调整)
NoNewPrivileges=false
ProtectSystem=false
ProtectHome=false
[Install]
WantedBy=multi-user.target
启用并启动服务:
# 重新加载 systemd
sudo systemctl daemon-reload
# 设置开机启动
sudo systemctl enable rvpn-server
# 启动服务
sudo systemctl start rvpn-server
# 检查状态
sudo systemctl status rvpn-server
# 查看日志
sudo journalctl -u rvpn-server -f
防火墙配置¶
使用 UFW(Ubuntu/Debian)¶
# 允许 HTTPS 端口
sudo ufw allow 443/tcp
# 允许 HTTP 用于 ACME/重定向(可选)
sudo ufw allow 80/tcp
# 启用防火墙
sudo ufw enable
# 检查状态
sudo ufw status
使用 iptables¶
# 允许 HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 HTTP 用于 ACME/重定向(可选)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 保存规则(Debian/Ubuntu)
sudo apt install iptables-persistent
sudo netfilter-persistent save
# 保存规则(RHEL/CentOS)
sudo service iptables save
使用 firewalld¶
# 添加 HTTPS 服务
sudo firewall-cmd --permanent --add-service=https
# 添加 HTTP 服务(可选)
sudo firewall-cmd --permanent --add-service=http
# 重新加载防火墙
sudo firewall-cmd --reload
安全功能¶
内置速率限制¶
服务器包含内置速率限制以防止滥用:
- 连接速率限制:限制每个 IP 的失败握手次数(默认:每分钟 10 次失败)
- 扫描器保护:自动分类并静默丢弃扫描器/探测尝试
- 连接限制:可配置的每个 IP 最大连接数
仅 TLS 1.3¶
R-VPN 对所有连接强制使用 TLS 1.3。旧版 TLS 版本将被拒绝。
日志轮换¶
设置日志轮换以防止磁盘空间问题:
创建 /etc/logrotate.d/rvpn:
/var/log/rvpn/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
systemctl reload rvpn-server 2>/dev/null || true
endscript
}
测试¶
检查服务器状态¶
# 检查服务是否运行
sudo systemctl status rvpn-server
# 检查日志
sudo journalctl -u rvpn-server -f
# 检查监听端口
sudo ss -tlnp | grep 443
# 或
sudo netstat -tlnp | grep 443
测试 WebSocket 端点¶
# 测试 WebSocket 连接(需要 wscat 或类似工具)
npm install -g wscat
wscat -c wss://vpn.example.com/connect
# 或使用 curl 测试 HTTPS
curl -I https://vpn.example.com/
使用客户端测试¶
从客户端机器:
# 下载预密钥包
curl -o prekey-bundle.json https://vpn.example.com/prekey-bundle.json
# 使用客户端连接
rvpn --server wss://vpn.example.com/connect --config client.toml
向客户端分发预密钥包¶
客户端需要预密钥包来建立加密连接。分发方式:
选项 1:HTTPS 下载(推荐)¶
在您的服务器上托管预密钥包:
# 复制预密钥包到网站目录
sudo mkdir -p /var/www/html
sudo cp /var/lib/rvpn/prekey-bundle.json /var/www/html/
sudo chmod 644 /var/www/html/prekey-bundle.json
客户端下载:
选项 2:带外分发¶
选项 3:嵌入客户端包¶
将预密钥包包含在您的客户端配置包中。
故障排除¶
服务器无法启动¶
# 检查端口冲突
sudo ss -tlnp | grep 443
# 检查配置文件语法
cat /etc/rvpn/server.toml
# 检查文件权限
ls -la /etc/rvpn/
ls -la /var/lib/rvpn/
TLS 证书问题¶
# 验证证书
openssl x509 -in /etc/rvpn/cert.pem -text -noout
# 检查证书有效期
openssl x509 -in /etc/rvpn/cert.pem -noout -dates
# 测试 TLS 连接
openssl s_client -connect vpn.example.com:443 -tls1_3
连接问题¶
# 检查防火墙
sudo iptables -L -n | grep 443
# 检查服务器是否在监听
sudo ss -tlnp | grep rvpn
# 启用详细日志
sudo rvpn-server --config /etc/rvpn/server.toml -vv