跳转至

服务器设置

本指南介绍如何设置 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

客户端下载:

curl -o prekey-bundle.json https://vpn.example.com/prekey-bundle.json

选项 2:带外分发

# 安全复制到客户端
scp /var/lib/rvpn/prekey-bundle.json user@client:/path/to/

选项 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

下一步