跳转至

使用场景

常见 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:

[server.network]
nat_enabled = true
dhcp_range  = "10.200.0.0/24"
dns_servers = ["10.200.0.1"]

多子网访问的客户端路由

要访问两个子网,客户端需要两个路由:

[tun]
enabled = true
routes  = ["10.100.0.0/16", "10.200.0.0/16"]   # 覆盖办公室和云子网
mtu     = 1420

如果您需要全隧道(所有流量通过 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。添加主机条目:

db01.office.internal    10.100.0.10
db02.office.internal    10.200.0.10

开发环境

远程访问开发服务器、数据库和微服务,如同它们在本地运行。在家中或旅行时很有用。

解决的问题

  • 开发环境在私有网络上,无法从外部访问
  • 您需要测试调用 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 模式,避免拖慢整个连接:

[tun]
enabled = true
routes  = [
    "10.50.0.0/24",    # 开发网络
    "192.168.1.0/24",  # 家庭网络(保持直连)
]
mtu     = 1420

数据库访问

对于直接数据库连接,使用 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 到达您的本地机器:

  1. 您的开发机器以 TUN 模式连接
  2. 远程服务调用您服务器的公网 IP
  3. 服务器通过 VPN 将请求隧道到您的开发机器
  4. 您的本地服务通过隧道响应

多云部署

将跨 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:

[server.network]
nat_enabled = false
dhcp_range  = "10.1.0.0/24"
dns_servers = ["10.1.0.53"]

安全组和防火墙

每个云提供商的防火墙必须允许:

  • 从 VPN 隧道 IP 范围的入站 TCP 端口 443
  • 对于跨位置通信,允许其他位置的 VPN IP 范围

对于 AWS 安全组:

入站:TCP 443 从 10.0.0.0/16(VPN IP 范围)
入站:TCP 443 从 10.1.0.0/16(其他云 VPN 范围)

客户端配置

[tun]
enabled = true
routes  = ["10.0.0.0/8"]   # 所有私有云范围
mtu     = 1420

启用的使用场景

  • 跨云数据库复制:MySQL at 10.0.0.30:3306 到 PostgreSQL at 10.1.0.30:5432
  • 私有容器注册表:无论在哪里运行,都是 registry.internal:5000
  • 内部 API:api.internal:8080,无公共端点
  • 备份复制:服务器之间的 rsync,不通过公共互联网

分流隧道指南

分流隧道让您决定哪些流量通过 VPN,哪些使用您的正常互联网连接。

何时使用分流隧道

使用分流隧道:

场景 配置
流媒体服务(Netflix、Spotify) 绕过国家或特定 IP
游戏 绕过游戏服务器 IP 以降低延迟
本地网络设备 绕过家庭/办公室 LAN 子网
银行应用 根据安全策略绕过或隧道
开发服务器 仅隧道您的开发网络

避免使用分流隧道:

场景 建议
不受信任的公共 Wi-Fi 全隧道
访问敏感账户 全隧道
在工作中绕过内容过滤器 全隧道(可能违反政策)

理解绕过逻辑

传出数据包 → 检查绕过规则 →
  → 匹配绕过?→ 直接发送(不加密)
  → 无匹配?→ 通过 VPN 隧道发送

绕过在加密之前检查。匹配的流量永远不会进入 VPN 隧道。

国家绕过

[split_tunnel]
enabled                  = true
builtin_bypass_countries = ["CN", "HK", "SG", "JP", "KR", "TW"]

这会绕过发往这些国家注册的 IP 地址的流量。在以下情况下有用:

  • 您在境外旅行,想要访问国内内容而不减速
  • 流媒体服务阻止外国 IP

限制:国家绕过使用 APNIC IP 范围数据。大型 CDN 可能从多个国家的 IP 提供内容。

网络绕过(CIDR)

无论国家如何,绕过特定 IP 范围:

[split_tunnel]
enabled            = true
bypass_networks    = ["192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12"]

典型的绕过网络: - 192.168.0.0/16 - 家庭/办公室 LAN - 10.0.0.0/8 - 私有网络 - 172.16.0.0/12 - Docker、VPN、其他私有子网

基于域名的绕过

绕过发往特定域名的流量:

[split_tunnel]
enabled            = true
bypass_domains_file = "~/.config/rvpn/bypass-domains.txt"

bypass-domains.txt

netflix.com
spotify.com
hulu.com
disneyplus.com

域名绕过使用 DNS 解析:域名在本地解析(不通过 VPN),结果 IP 绕过隧道。

基于域名的隧道(强制 VPN)

即使某些域名本来会绕过,也强制特定域名通过 VPN:

[split_tunnel]
enabled            = true
tunnel_domains_file = "~/.config/rvpn/tunnel-domains.txt"

这在以下情况下有用: - 您的 ISP 节流特定服务 - 您想强制流媒体通过 VPN 以保护隐私

拦截广告

[split_tunnel]
enabled   = true
block_ads = true

在 DNS 层面拦截已知广告和追踪器域名。被拦截的域名立即返回 NXDOMAIN。与绕过规则配合工作:被绕过的域名在本地解析,不进行广告拦截。

组合规则

规则按此顺序评估:

  1. tunnel_networks / tunnel_domains(强制通过 VPN)
  2. bypass_networks / bypass_domains / builtin_bypass_countries(强制直连)
  3. 默认(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

安全注意事项

何时使用全隧道(无分流隧道):

[split_tunnel]
enabled = false
  • 在不受信任的公共网络上(咖啡店、酒店、机场 Wi-Fi)
  • 需要最大隐私时
  • 当绕过规则可能意外排除敏感流量时

分流隧道的风险:

绕过 VPN 的流量对您的 ISP 和本地网络运营商可见。如果您绕过银行网站,您的 ISP 可以看到您访问了它们。考虑这对您的威胁模型是否可接受。

国家绕过的风险:

流媒体服务可能通过其他方式(支付货币、账户历史、GPS 位置)检测 VPN 使用情况。国家绕过使流量看起来像国内流量,但不会改变这些其他信号。