OpenWrt
rVPN 的 OpenWrt 软件包把守护进程运行在路由器上。LAN 客户端可以自动接入(通过 WPAD 广告的 SOCKS5 / HTTP 代理),也可以透明接入(TUN 模式下,通过策略路由把 LAN 转发流量送入隧道)。
发布为两个 .ipk 包:
rvpn-client—— 守护进程、procd 服务、UCI 配置、热插拔策略路由。与架构相关。luci-app-rvpn—— LuCI 23.05 Web UI。与架构无关。
- OpenWrt 22.03 及以上。
- 有足够 RAM 和闪存装下 5–10 MB 静态二进制的路由器。现代设备通常没问题;8 MB 闪存的旧路由可能吃力。
- 已部署的 rVPN 服务器(服务器地址 + 预共享密钥包)。
获取对应架构的两个 .ipk 文件,通过 opkg 安装:
opkg install rvpn-client_1.3.1_<arch>.ipkopkg install luci-app-rvpn_1.3.1_all.ipk支持的架构:x86_64、aarch64、armv7、mipsel_24kc、mips_24kc。
postinst 钩子会在 /etc/rvpn/identity.key 处自动生成身份密钥并启用服务。在你填写服务器地址之前,守护进程保持停止状态。
通过 LuCI 配置
Section titled “通过 LuCI 配置”打开路由器的管理界面,进入 服务 → VPN → rVPN:
- 服务器 —— 粘贴基础 URL(例如
wss://vpn.example.com)。正确的 WebSocket 路径会自动附加。 - 模式 —— 选择 SOCKS5 代理(配合 WPAD 自动发现,让 LAN 客户端按需分应用路由)或 TUN(全局 VPN)(LAN 全量透明路由)。
- 预共享密钥包 —— 把服务器管理员提供的 JSON 粘贴到 Prekey Bundle 文本框,点击保存并应用。
- 服务器指纹 (可选) —— 把运营方提供的
ik:1:…固定值粘贴到这里以启用严格固定;留空则采用首次使用即信任(TOFU)。 - 启用 —— 打开开关。保存并应用。
Overview 段的状态标签会根据 procd 实例的运行情况显示 已连接 / 连接中 / 已禁用。
通过命令行配置
Section titled “通过命令行配置”UCI 配置项非常直白:
uci set rvpn.main.server_address='wss://your-server.com'uci set rvpn.main.mode='socks5'uci set rvpn.main.enabled='1'
# 可选:严格固定替代 TOFUuci set rvpn.server_identity.server_fingerprint='ik:1:...'uci set rvpn.server_identity.strict_mode='1'
uci commit rvpn/etc/init.d/rvpn restart每个 UCI 选项在路由器上的 /etc/config/rvpn 中都有内联注释。最常用的:
| 段名 | 选项 | 用途 |
|---|---|---|
main | server_address | rVPN 服务器的基础 URL(不含路径)。 |
main | mode | socks5 或 tun。 |
server_identity | server_fingerprint | 规范的 ik:1: 固定值。留空即 TOFU。 |
server_identity | trust_on_first_use | 默认 1,首次连接时捕获身份。 |
server_identity | strict_mode | 1 会在首次连接时也拒绝未知身份(需配合固定值)。 |
socks5 | listen_address | SOCKS5 代理监听地址。默认 0.0.0.0:1080。 |
http_proxy | enabled | 同时启用 HTTP 代理。默认关闭。 |
tun | ip_address | 本地 TUN 地址。默认 10.200.0.2/24。 |
split_tunnel | bypass_countries | 逗号分隔的 ISO 国家码,其 CIDR 段不走隧道。 |
network | dns_servers | DNS 回落解析器。 |
wpad | enabled | 通过 DHCP 选项 252 广告 SOCKS5 代理。默认启用。 |
SOCKS5 模式 + WPAD
Section titled “SOCKS5 模式 + WPAD”rVPN 以 SOCKS5 模式启动时,init 脚本会用路由器的实际 LAN IP(uci get network.lan.ipaddr)在运行时生成 /www/wpad.dat,并通过 DHCP 选项 252 通告给 LAN 客户端。支持 WPAD 的客户端 —— macOS、Chrome、开了对应偏好的 Firefox —— 会自动接入代理。
不支持 WPAD 的设备可手动指向 SOCKS5 <路由器 LAN IP>:1080。
TUN 模式
Section titled “TUN 模式”TUN 模式下守护进程创建一个虚拟接口(默认 rvpn0),热插拔脚本 /etc/hotplug.d/iface/99-rvpn-tun 会在接口上线后为 IPv4 与 IPv6 分别设置策略路由:
- 表
100得到经由 VPN 网关的默认路由。 - 优先级
100的规则匹配iif br-lan—— LAN 客户端进表,路由器自身出站流量不进表。
rvpn 防火墙区在出站进行伪装(masquerade),并对 IPv4/IPv6 拒绝入站。这样双栈 LAN 不会把 IPv6 直接漏到 WAN。
服务器身份固定 (TOFU)
Section titled “服务器身份固定 (TOFU)”与其他所有 rVPN 客户端相同的模型:首次成功连接时,守护进程以规范的 ik:1:<base32> 形式捕获服务器的 Ed25519 身份。如果服务器日后在没有签名轮换的情况下出示不同身份,守护进程会拒绝连接。
若想从一开始就固定特定身份,把运营方的 ik:1: 值粘贴到 服务器指纹 字段(LuCI)或设置 rvpn.server_identity.server_fingerprint(CLI)。设置 strict_mode='1' 会在首次连接时也拒绝未知身份 —— 请配合固定值使用。
完整模型(含运营方轮换密钥的方法)请参考 服务器身份固定。
隧道已建立但 LAN 客户端没走隧道(TUN 模式)
Section titled “隧道已建立但 LAN 客户端没走隧道(TUN 模式)”在接口起来之后检查策略路由和默认路由是否就位:
ip rule show | grep br-lanip route show table 100两者都应有条目。若缺失,logread -e rvpn 会告诉你热插拔脚本为什么退出(未解析到网关、找不到 br-lan 等)。
LuCI 显示”已禁用”但守护进程在运行
Section titled “LuCI 显示”已禁用”但守护进程在运行”保存并应用没有触发守护进程重载。/etc/init.d/rvpn reload 会重新运行 generate_config;如果没有:
uci show rvpn/etc/init.d/rvpn restart客户端接收不到 WPAD
Section titled “客户端接收不到 WPAD”确认 DHCP 选项已经写入:
uci get dhcp.@dnsmasq[0].dhcp_option期望在列表中看到 252,http://<路由器 LAN IP>/wpad.dat。若没有,说明 WPAD 渲染失败 —— 检查 logread -e rvpn 中关于 LAN IP 解析的告警。
启动时提示”缺少预共享密钥包”
Section titled “启动时提示”缺少预共享密钥包””如果 /etc/rvpn/prekey-bundle.json 不存在,守护进程会拒绝启动。把运营方提供的 JSON 粘贴到 LuCI 的 Prekey Bundle 文本框,或者直接通过 SCP 放置该文件。
更多故障排查请参考 故障排查指南。