使用场景¶
常见 R-VPN 部署的实用指南。
选择您的模式¶
R-VPN 支持两种运行模式:
| 使用场景 | 推荐模式 |
|---|---|
| 应用级代理(浏览器、单个应用) | SOCKS5 |
| 全设备 VPN(所有流量) | TUN |
| 移动端(iOS、Android) | TUN(内置) |
| 连接到远程网络,如同在 LAN 上 | TUN |
| 分流隧道:部分流量 VPN,部分直连 | 任意,配合 split_tunnel 配置 |
两种模式都使用相同的 X3DH + Double Ratchet 加密。区别在于流量如何到达 VPN。
远程桌面访问¶
从家中连接到工作电脑,如同在同一办公室网络中。使用 RDP、VNC、SSH 或任何远程访问工具,而不将端口暴露给公共互联网。
解决的问题¶
- RDP/VNC 暴露在互联网上是常见的攻击向量
- 企业防火墙经常阻止 RDP 端口
- 您需要访问办公室打印机、文件共享和内部工具
设置¶
1. 服务器配置
服务器必须在您的办公室网络上,启用 TUN 模式并配置 NAT:
[server]
bind_address = "0.0.0.0:443"
tls_cert_file = "/etc/letsencrypt/live/your-office-server.com/fullchain.pem"
tls_key_file = "/etc/letsencrypt/live/your-office-server.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity.key"
websocket_path = "/api/v1/ws"
[server.network]
nat_enabled = true
dhcp_range = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]
2. 客户端配置
仅将通过 VPN 路由您的办公室网络子网。不要路由所有流量:
server_address = "wss://your-office-server.com/api/v1/ws"
identity_key_file = "~/.config/rvpn/identity.key"
prekey_bundle = "~/.config/rvpn/prekey-bundle.json"
[tun]
enabled = true
routes = ["10.100.0.0/16"] # 您的办公室网络子网
mtu = 1420
这仅将发往 10.100.0.0/16(您的办公室网络)的流量通过 VPN 路由。其他所有流量(浏览、流媒体)使用您的正常家庭连接。
3. 验证连接
# 强制 curl 通过 TUN 接口(macOS/Linux 上是 tun0,iOS 上是 utun#)
curl --interface tun0 https://ifconfig.me
# 应该返回办公室网络 IP(您的 VPN 隧道 IP)
# 如果路由正常工作,常规 curl 也应该工作,不需要 --interface
# 应该能访问办公室服务器
ping 10.100.0.50
通过隧道可以访问的内容¶
- RDP:
10.100.0.50:3389 - VNC:
10.100.0.51:5900 - SSH:
ssh user@10.100.0.52 - SMB 文件共享:
\\10.100.0.53\share - 内部 Web 应用:
http://10.100.0.54:8080
私有网络互联¶
将跨不同位置的多个服务器连接成一个安全私有网络。所有服务器和客户端都看起来在同一 LAN 上,无论物理位置如何。
解决的问题¶
- 在不同城市之间连接办公室,无需专线
- 将云 VM 视为在同一网络上
- 运行需要 LAN 级网络发现的集群软件
架构¶
办公室 A (10.100.0.0/24) 云区域 (10.200.0.0/24)
| |
rvpn-server-TUN rvpn-server-TUN
(10.100.0.1) (10.200.0.1)
\ /
\ /
\---------------------------/
|
rvpn 客户端在各自分别的
DHCP 范围内获取 IP,
可以访问所有子网
服务器设置(每个位置)¶
每个位置以 TUN 模式运行一个 rvpn-server。每个站点的 dhcp_range 必须不同:
办公室 A server.toml:
[server]
bind_address = "0.0.0.0:443"
tls_cert_file = "/etc/letsencrypt/live/office-a.example.com/fullchain.pem"
tls_key_file = "/etc/letsencrypt/live/office-a.example.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity_office_a.key"
websocket_path = "/api/v1/ws"
[server.network]
nat_enabled = true
dhcp_range = "10.100.0.0/24"
dns_servers = ["10.100.0.1"]
云区域 server.toml:
多子网访问的客户端路由¶
要访问两个子网,客户端需要两个路由:
如果您需要全隧道(所有流量通过 VPN),只需使用 routes = ["0.0.0.0/0"]。
私有 DNS 用于名称解析¶
要跨所有位置使用主机名而不是 IP,请配置私有 DNS 服务器:
[server.network]
nat_enabled = true
dhcp_range = "10.100.0.0/24"
dns_servers = ["10.100.0.1"] # 您的私有 DNS 服务器
将您的私有 DNS 指向 10.100.0.1。添加主机条目:
开发环境¶
远程访问开发服务器、数据库和微服务,如同它们在本地运行。在家中或旅行时很有用。
解决的问题¶
- 开发环境在私有网络上,无法从外部访问
- 您需要测试调用 localhost 的 Webhook
- 您想使用本地开发 URL 而不更改它们
场景 1:访问所有开发服务¶
通过 VPN 路由您的整个开发网络:
server_address = "wss://your-dev-server.com/api/v1/ws"
identity_key_file = "~/.config/rvpn/identity.key"
prekey_bundle = "~/.config/rvpn/prekey-bundle.json"
[socks5]
listen_address = "127.0.0.1:1080"
[dns_proxy]
enabled = true
listen_address = "127.0.0.1:53"
将系统 DNS 配置为 127.0.0.1:53。现在 dev.internalcompany.com 可以正确解析,所有开发流量都通过 VPN。
场景 2:仅访问特定开发服务¶
使用带有特定路由的 TUN 模式,避免拖慢整个连接:
数据库访问¶
对于直接数据库连接,使用 SOCKS5 代理:
# MySQL
mysql -h 10.50.0.20 -P 3306 --protocol=TCP
# PostgreSQL
psql -h 10.50.0.21 -p 5432
# MongoDB
mongosh "mongodb://10.50.0.22:27017"
配置您的数据库 GUI(DBeaver、TablePlus、DataGrip)通过 127.0.0.1:1080 的 SOCKS5 连接。
使用 Webhook 的本地开发¶
如果您的开发服务器从远程 API 回调 localhost:3000,VPN 隧道让远程 API 到达您的本地机器:
- 您的开发机器以 TUN 模式连接
- 远程服务调用您服务器的公网 IP
- 服务器通过 VPN 将请求隧道到您的开发机器
- 您的本地服务通过隧道响应
多云部署¶
将跨 AWS、GCP、Azure 或其他云提供商的服务器连接成一个私有网络,而无需使用云提供商的 VPN 或将服务暴露给公共互联网。
解决的问题¶
- 跨云数据库,无公共端点
- 不同云区域中服务之间的私有通信
- 无需云提供商特定的 VPN 解决方案
- 无论云提供商如何,网络拓扑保持一致
架构¶
AWS us-east-1 (10.0.0.0/24) GCP europe-west1 (10.1.0.0/24)
| |
rvpn-server-TUN rvpn-server-TUN
(10.0.0.1) (10.1.0.1)
| |
+-------- rvpn tunnel --------+
|
客户端在各自分别的
DHCP 范围内获取 IP,
可以访问所有子网
每个云的服务配置¶
AWS server.toml:
[server]
bind_address = "0.0.0.0:443"
tls_cert_file = "/etc/rvpn/certs/cert.pem"
tls_key_file = "/etc/rvpn/certs/key.pem"
identity_key_file = "/etc/rvpn/server_identity.key"
websocket_path = "/api/v1/ws"
[server.network]
nat_enabled = false # NAT 禁用 — 我们需要直接路由
dhcp_range = "10.0.0.0/24"
dns_servers = ["10.0.0.53"] # 此位置的内部 DNS
GCP server.toml:
安全组和防火墙¶
每个云提供商的防火墙必须允许:
- 从 VPN 隧道 IP 范围的入站 TCP 端口 443
- 对于跨位置通信,允许其他位置的 VPN IP 范围
对于 AWS 安全组:
客户端配置¶
启用的使用场景¶
- 跨云数据库复制:MySQL at
10.0.0.30:3306到 PostgreSQL at10.1.0.30:5432 - 私有容器注册表:无论在哪里运行,都是
registry.internal:5000 - 内部 API:
api.internal:8080,无公共端点 - 备份复制:服务器之间的 rsync,不通过公共互联网
分流隧道指南¶
分流隧道让您决定哪些流量通过 VPN,哪些使用您的正常互联网连接。
何时使用分流隧道¶
使用分流隧道:
| 场景 | 配置 |
|---|---|
| 流媒体服务(Netflix、Spotify) | 绕过国家或特定 IP |
| 游戏 | 绕过游戏服务器 IP 以降低延迟 |
| 本地网络设备 | 绕过家庭/办公室 LAN 子网 |
| 银行应用 | 根据安全策略绕过或隧道 |
| 开发服务器 | 仅隧道您的开发网络 |
避免使用分流隧道:
| 场景 | 建议 |
|---|---|
| 不受信任的公共 Wi-Fi | 全隧道 |
| 访问敏感账户 | 全隧道 |
| 在工作中绕过内容过滤器 | 全隧道(可能违反政策) |
理解绕过逻辑¶
绕过在加密之前检查。匹配的流量永远不会进入 VPN 隧道。
国家绕过¶
这会绕过发往这些国家注册的 IP 地址的流量。在以下情况下有用:
- 您在境外旅行,想要访问国内内容而不减速
- 流媒体服务阻止外国 IP
限制:国家绕过使用 APNIC IP 范围数据。大型 CDN 可能从多个国家的 IP 提供内容。
网络绕过(CIDR)¶
无论国家如何,绕过特定 IP 范围:
典型的绕过网络:
- 192.168.0.0/16 - 家庭/办公室 LAN
- 10.0.0.0/8 - 私有网络
- 172.16.0.0/12 - Docker、VPN、其他私有子网
基于域名的绕过¶
绕过发往特定域名的流量:
bypass-domains.txt:
域名绕过使用 DNS 解析:域名在本地解析(不通过 VPN),结果 IP 绕过隧道。
基于域名的隧道(强制 VPN)¶
即使某些域名本来会绕过,也强制特定域名通过 VPN:
这在以下情况下有用: - 您的 ISP 节流特定服务 - 您想强制流媒体通过 VPN 以保护隐私
拦截广告¶
在 DNS 层面拦截已知广告和追踪器域名。被拦截的域名立即返回 NXDOMAIN。与绕过规则配合工作:被绕过的域名在本地解析,不进行广告拦截。
组合规则¶
规则按此顺序评估:
tunnel_networks/tunnel_domains(强制通过 VPN)bypass_networks/bypass_domains/builtin_bypass_countries(强制直连)- 默认(TUN 模式为全隧道,SOCKS5 模式为代理)
测试分流隧道配置¶
# 检查您的出口 IP(如果隧道化,应该是 VPN 服务器)
curl https://api.ipify.org
# 检查特定 IP
curl --socks5 127.0.0.1:1080 https://api.ipify.org
# 测试通过隧道的 DNS 解析
dig @127.0.0.1 example.com
# 跟踪路由
traceroute 8.8.8.8
安全注意事项¶
何时使用全隧道(无分流隧道):
- 在不受信任的公共网络上(咖啡店、酒店、机场 Wi-Fi)
- 需要最大隐私时
- 当绕过规则可能意外排除敏感流量时
分流隧道的风险:
绕过 VPN 的流量对您的 ISP 和本地网络运营商可见。如果您绕过银行网站,您的 ISP 可以看到您访问了它们。考虑这对您的威胁模型是否可接受。
国家绕过的风险:
流媒体服务可能通过其他方式(支付货币、账户历史、GPS 位置)检测 VPN 使用情况。国家绕过使流量看起来像国内流量,但不会改变这些其他信号。