SOCKS5 代理模式¶
SOCKS5 模式是使用 R-VPN 的默认且最灵活的方式。它运行一个本地 SOCKS5 代理,各个应用可以指向该代理——不会影响您机器上的其他流量。
启动代理¶
默认监听地址: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 扩展:
- 安装 SwitchyOmega
- 创建新配置文件 → 协议:SOCKS5,服务器:
127.0.0.1,端口:1080 - 当您想使用 VPN 时切换到该配置文件
curl¶
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 以跨会话保持。
HTTP 代理¶
R-VPN 还可以在 SOCKS5 代理旁同时运行 HTTP 代理。当应用或环境期望 HTTP_PROXY/HTTPS_PROXY 环境变量指向 HTTP 代理时(这是 curl、git、npm、pip 和 Docker 等 CLI 工具最常见的约定),这非常有用。
两个代理共享同一个连接池——同时运行两者不会增加任何开销。
启用 HTTP 代理¶
重启客户端——您应该看到:
使用环境变量¶
使用 HTTP 代理最常见的方法是通过环境变量。大多数 CLI 工具和编程语言会自动遵循这些设置:
export HTTP_PROXY=http://127.0.0.1:8118
export HTTPS_PROXY=http://127.0.0.1:8118
export ALL_PROXY=http://127.0.0.1:8118
设置后,curl、git、npm、pip、wget 和 Docker 等工具会自动通过 VPN 路由,无需任何逐应用配置:
# 无需 --proxy 标志——环境变量被自动识别
curl https://api.ipify.org
git clone https://github.com/user/repo.git
pip install requests
添加到 ~/.bashrc 或 ~/.zshrc 以跨会话保持。
curl(显式)¶
工作原理¶
HTTP 代理处理两种请求类型:
- HTTP CONNECT — 用于 HTTPS。客户端发送
CONNECT host:443 HTTP/1.1,代理响应200 Connection Established,流量通过加密隧道流向目的地。 - 纯 HTTP 转发 — 用于未加密的 HTTP。客户端发送
GET http://host/path HTTP/1.1,代理连接到主机并转发请求。
两种方式都感知分流隧道,并使用与 SOCKS5 相同的连接池。
身份验证¶
要要求 Basic 身份验证:
[http_proxy]
enabled = true
listen_address = "127.0.0.1:8118"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"
客户端必须发送 Proxy-Authorization: Basic ... 头(浏览器和 curl -x 在 URL 中包含凭据时会自动处理:http://user:pass@127.0.0.1:8118)。
SOCKS5 与 HTTP 代理对比¶
| SOCKS5 | HTTP 代理 | |
|---|---|---|
| 协议 | 任意(TCP + UDP) | 仅 HTTP 和 HTTPS |
| 环境变量 | ALL_PROXY=socks5://... |
HTTP_PROXY=http://... |
| 浏览器支持 | macOS/Firefox 原生支持 | 通用(所有浏览器) |
| CLI 工具支持 | 部分工具(curl、Node) | 大多数工具(curl、git、pip、npm、Docker) |
| 身份验证 | SOCKS5 用户名/密码 | HTTP Basic 认证 |
| 最适合 | 逐应用路由、UDP | 系统级环境变量、CI/CD |
大多数情况下,使用 HTTP 代理配合环境变量——它与 CLI 工具和构建系统具有最广泛的兼容性。当您需要逐应用路由或 UDP 支持时,请使用 SOCKS5。
分流隧道¶
分流隧道让您仅将特定流量通过 VPN 路由,而其余流量直接连接。当您希望通过 VPN 访问被屏蔽的网站,同时保持本地网络和国内流量不受影响时,这非常有用。
内置中国绕过¶
在 client.toml 中启用自动中国 IP 绕过的分流隧道:
启用后,发往中国 IP 的流量(基于 APNIC 数据——约 8800 个网络)直接连接,其他所有内容通过 VPN 路由。
自定义绕过网络¶
bypass-networks.txt——每行一个 CIDR:
拦截广告¶
在 DNS 层面拦截已知广告和追踪器域名。不发送任何字节,不建立任何连接。
DNS 代理¶
**重要:**如果没有 DNS 代理,即使使用 SOCKS5 代理,您的 DNS 查询也可能泄漏到您的 ISP。请参阅 DNS 泄漏预防 获取完整说明。
默认情况下,DNS 查询由您的系统 DNS 服务器解析——在 VPN 隧道**之外**。这意味着您的 ISP 可以观察到您查找了哪些域名,即使您的流量是通过代理的。
R-VPN 包含一个内置 DNS 代理,可通过相同的加密 WebSocket 隧道在服务器端解析所有查询。它也感知分流隧道:被绕过的域名在本地解析,被拦截的广告/追踪器域名立即返回 NXDOMAIN,不会发送到网络。
启用 DNS 代理¶
**注意:**端口 53 需要 root 或
CAP_NET_BIND_SERVICE。对于无权限测试,请使用端口5353(见下文)。
重启客户端——您应该看到:
macOS — 系统级¶
使用 sudo 运行客户端(以便绑定端口 53),然后将 127.0.0.1 添加为您的 DNS 服务器:
系统设置 → 网络 → 您的连接 → 详细信息 → DNS → + → 127.0.0.1
或通过命令行(将 Wi-Fi 替换为您的接口名称):
完成后恢复原始 DNS:
Linux — 系统级¶
以 root 身份运行客户端(或具有 CAP_NET_BIND_SERVICE 能力),并设置 listen_address = "127.0.0.1:53",然后将解析器指向它。
/etc/resolv.conf(直接):
systemd-resolved——添加到 /etc/systemd/resolved.conf:
sudo systemctl restart systemd-resolved
无权限测试(端口 5353)¶
验证它是否工作:
响应将来自您的 VPN 服务器,而不是您的本地 ISP。
连接模式¶
SOCKS5 代理支持两种连接到服务器的模式:
标准模式(默认,推荐)¶
每个 SOCKS5 流打开自己独立的 WebSocket 连接,并执行自己的 X3DH 握手和 DoubleRatchet。这是推荐的模式。
为什么这是默认模式: - 流量模式与标准工具一致——每个连接是独立的 WebSocket,类似普通 HTTPS 浏览 - 短生命周期的连接更难被流量分类器识别和阻止 - 更简单的故障隔离——单个连接断开不会影响其他连接
多路复用模式(可选)¶
所有 SOCKS5 流共享**单个 WebSocket 连接**,并共享一个 DoubleRatchet 会话。每个 SOCKS5 CONNECT 通过同一隧道上的 CreateFlow/CloseFlow 控制消息创建逻辑”流”。
优点: - 单次 TLS 握手,单次 X3DH 密钥交换 — 约 250ms 开销,而标准模式每连接约 600ms - 0-RTT 流创建 — 数据立即发送,无需等待服务器确认 - 更低的服务器资源使用(一个 WebSocket,一个 ratchet,而非每个流一个) - 服务器每个多路复用会话支持最多 2000 个并发流 - 压力测试中 100% 成功率(标准模式约 85%)
缺点: - 单个长生命周期的二进制流是一个独特的流量模式,分类器可以检测到 - 所有流共享一个连接——如果断开,所有内容都需要重新连接
工作原理:
1. 第一个 SOCKS5 CONNECT 打开多路复用 WebSocket 隧道({server_path}/mux)
2. 执行 X3DH 握手以建立共享的 DoubleRatchet
3. 后续流通过同一隧道发送 CreateFlow 控制消息
4. 客户端立即发送数据(0-RTT)— 服务器在连接目标时缓冲数据
5. 数据通过多路复用帧流动
安全性: 0-RTT 优化不是 TLS 0-RTT。TLS 握手和 X3DH 密钥交换在任何数据流动之前已完成。重放保护由 Double Ratchet 提供 — 每条消息都有唯一的 message_number,ratchet 拒绝 number < current 的消息(参见 ratchet.rs:decrypt)。消息密钥使用后即消耗,因此重放会失败并显示”Message too old”。
配置:
要显式覆盖多路复用端点:
模式对比¶
| 标准模式 | 多路复用 | |
|---|---|---|
| 每会话 WebSocket 数 | 每个流 1 个 | 1 |
| X3DH 握手次数 | 每个流 1 次 | 1 |
| 服务器流限制 | 无限制 | 最多 2000 |
| 服务器端 WS 连接数 | N | 1 |
| 流量模式 | 普通 HTTPS 类似 | 单个长生命周期流 |
| 成功率(HK,15分钟) | ~85% | 100% |
| 延迟 p50(HK) | ~575ms | ~315ms |
| 延迟 p95(HK) | ~2000ms | ~1060ms |
| 最适合 | DPI 规避,流量混合 | 可靠性,高吞吐量 |
注意: 标准模式为**每个 TCP 流打开一个 WebSocket**。在繁忙网络(例如多标签浏览器)上,这可能会耗尽服务器的
max_connections_per_ip限制。如有需要,请提高服务器的速率限制:
更改监听地址¶
要监听特定接口(例如与本地网络上的其他设备共享代理):
**安全注意:**仅在可信网络上暴露 SOCKS5 端口。默认没有身份验证。
要添加身份验证:
[socks5]
listen_address = "0.0.0.0:1080"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"
作为服务运行¶
Linux(systemd)¶
[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
FreeBSD(rc.d)¶
创建 /usr/local/etc/rc.d/rvpn_client: