跳转至

SOCKS5 代理模式

SOCKS5 模式是使用 R-VPN 的默认且最灵活的方式。它运行一个本地 SOCKS5 代理,各个应用可以指向该代理——不会影响您机器上的其他流量。


启动代理

rvpn -c ~/.config/rvpn/client.toml

默认监听地址:127.0.0.1:1080

运行后将看到:

INFO  SOCKS5 proxy listening on 127.0.0.1:1080


配置应用

macOS — 系统级代理

系统设置 → 网络 → 您的连接 → 详细信息 → 代理

启用 **SOCKS 代理**并设置: - 服务器:127.0.0.1 - 端口:1080

这会将所有系统流量(Safari、curl 等)通过 VPN 路由。

Firefox

设置 → 常规 → 网络设置 → 手动代理配置

  • SOCKS 主机:127.0.0.1
  • 端口:1080
  • 选择 SOCKS v5
  • 勾选 使用 SOCKS v5 时代理 DNS 以防止 DNS 泄漏(如果您已启用 DNS 代理,则不需要)

Chrome / Brave

Chrome 在 macOS 上使用系统代理。在 Linux 上,使用 SwitchyOmega 扩展:

  1. 安装 SwitchyOmega
  2. 创建新配置文件 → 协议:SOCKS5,服务器:127.0.0.1,端口:1080
  3. 当您想使用 VPN 时切换到该配置文件

curl

curl --socks5 127.0.0.1:1080 https://api.ipify.org

Linux — 系统级(环境变量)

export ALL_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5://127.0.0.1:1080
export HTTP_PROXY=socks5://127.0.0.1:1080

添加到 ~/.bashrc~/.zshrc 以跨会话保持。


分流隧道

分流隧道让您仅将特定流量通过 VPN 路由,而其余流量直接连接。当您希望通过 VPN 访问被屏蔽的网站,同时保持本地网络和国内流量不受影响时,这非常有用。

内置中国绕过

client.toml 中启用自动中国 IP 绕过的分流隧道:

[split_tunnel]
enabled = true
builtin_bypass_countries = ["CN"]

启用后,发往中国 IP 的流量(基于 APNIC 数据——约 8800 个网络)直接连接,其他所有内容通过 VPN 路由。

自定义绕过网络

[split_tunnel]
enabled = true
bypass_networks_file = "~/.config/rvpn/bypass-networks.txt"

bypass-networks.txt——每行一个 CIDR:

192.168.0.0/16
10.0.0.0/8
172.16.0.0/12

拦截广告

[split_tunnel]
block_ads = true

在 DNS 层面拦截已知广告和追踪器域名。不发送任何字节,不建立任何连接。


DNS 代理

**重要:**如果没有 DNS 代理,即使使用 SOCKS5 代理,您的 DNS 查询也可能泄漏到您的 ISP。请参阅 DNS 泄漏预防 获取完整说明。

默认情况下,DNS 查询由您的系统 DNS 服务器解析——在 VPN 隧道**之外**。这意味着您的 ISP 可以观察到您查找了哪些域名,即使您的流量是通过代理的。

R-VPN 包含一个内置 DNS 代理,可通过相同的加密 WebSocket 隧道在服务器端解析所有查询。它也感知分流隧道:被绕过的域名在本地解析,被拦截的广告/追踪器域名立即返回 NXDOMAIN,不会发送到网络。

启用 DNS 代理

[dns_proxy]
enabled        = true
listen_address = "127.0.0.1:53"

**注意:**端口 53 需要 root 或 CAP_NET_BIND_SERVICE。对于无权限测试,请使用端口 5353(见下文)。

重启客户端——您应该看到:

INFO  DNS proxy listening on 127.0.0.1:53

macOS — 系统级

使用 sudo 运行客户端(以便绑定端口 53),然后将 127.0.0.1 添加为您的 DNS 服务器:

系统设置 → 网络 → 您的连接 → 详细信息 → DNS → +127.0.0.1

或通过命令行(将 Wi-Fi 替换为您的接口名称):

sudo networksetup -setdnsservers Wi-Fi 127.0.0.1

完成后恢复原始 DNS:

sudo networksetup -setdnsservers Wi-Fi empty

Linux — 系统级

以 root 身份运行客户端(或具有 CAP_NET_BIND_SERVICE 能力),并设置 listen_address = "127.0.0.1:53",然后将解析器指向它。

/etc/resolv.conf(直接):

nameserver 127.0.0.1

systemd-resolved——添加到 /etc/systemd/resolved.conf

[Resolve]
DNS=127.0.0.1
然后重启:sudo systemctl restart systemd-resolved

无权限测试(端口 5353)

[dns_proxy]
enabled        = true
listen_address = "127.0.0.1:5353"

验证它是否工作:

dig @127.0.0.1 -p 5353 example.com

响应将来自您的 VPN 服务器,而不是您的本地 ISP。


连接模式

SOCKS5 代理支持两种连接到服务器的模式:

多路复用模式(默认)

所有 SOCKS5 流共享**单个 WebSocket 连接**,并共享一个 DoubleRatchet 会话。每个 SOCKS5 CONNECT 通过同一隧道上的 CreateFlow/CloseFlow 控制消息创建逻辑“流”。

优点: - 单次 TLS 握手,单次 X3DH 密钥交换 — 约 250ms 开销,而旧模式每连接约 600ms - 更低的服务器资源使用(一个 WebSocket,一个 ratchet,而非每个流一个) - 更适合高流数场景(浏览器可打开 100+ 连接) - 服务器每个多路复用会话支持最多 2000 个并发流

工作原理: 1. 第一个 SOCKS5 CONNECT 打开多路复用 WebSocket 隧道({server_path}/mux) 2. 执行 X3DH 握手以建立共享的 DoubleRatchet 3. 后续流通过同一隧道发送 CreateFlow 控制消息 4. 服务器以 FlowCreated 确认响应,然后数据通过多路复用帧流动

配置:

[socks5]
multiplex = true        # 默认启用
# mux_path 默认自动从服务器 URL 推导为 {server_path}/mux

要显式覆盖多路复用端点:

[socks5]
multiplex = true
mux_path = "/api/v1/ws/mux"

旧版模式(回退)

每个 SOCKS5 流打开自己独立的 WebSocket 连接,并执行自己的 X3DH 握手和 DoubleRatchet。这是原始行为。

何时使用: - 故障排除 — 隔离问题是特定于流还是隧道范围 - 与没有多路复用端点的旧版服务器兼容

[socks5]
multiplex = false

模式对比

多路复用 旧版
每会话 WebSocket 数 1 每个流 1 个
X3DH 握手次数 1 每个流 1 次
服务器流限制 最多 2000 无限制
服务器端 WS 连接数 1 N
最适合 浏览器、重载网站 调试、旧服务器

故障排除提示:**如果您在多路复用模式下遇到连接问题(例如某些应用无法加载、重载网站超时),请尝试切换到旧版模式,以隔离问题是隧道范围还是特定于流:

[socks5]
multiplex = false
请注意,旧版模式为**每个 TCP 流打开一个 WebSocket。在繁忙网络(例如多标签浏览器)上,这可能会很快耗尽服务器的 max_connections_per_ip 限制。如果您定期使用旧版模式,请相应提高服务器的速率限制:
[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000


更改监听地址

要监听特定接口(例如与本地网络上的其他设备共享代理):

[socks5]
listen_address = "0.0.0.0:1080"

**安全注意:**仅在可信网络上暴露 SOCKS5 端口。默认没有身份验证。

要添加身份验证:

[socks5]
listen_address = "0.0.0.0:1080"
auth_enabled   = true
auth_username  = "user"
auth_password  = "changeme"

作为服务运行

Linux(systemd)

sudo nano /etc/systemd/system/rvpn-client.service
[Unit]
Description=r-vpn Client
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=YOUR_USER
ExecStart=/usr/local/bin/rvpn -c /etc/rvpn/client.toml
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now rvpn-client

FreeBSD(rc.d)

创建 /usr/local/etc/rc.d/rvpn_client

#!/bin/sh
# PROVIDE: rvpn_client
# REQUIRE: NETWORKING
# KEYWORD: shutdown

. /etc/rc.subr

name="rvpn_client"
rcvar="rvpn_client_enable"
command="/usr/local/bin/rvpn"
command_args="-c /usr/local/etc/rvpn/client.toml"
pidfile="/var/run/rvpn-client.pid"

load_rc_config $name
run_rc_command "$1"
chmod +x /usr/local/etc/rc.d/rvpn_client
echo 'rvpn_client_enable="YES"' >> /etc/rc.conf
service rvpn_client start