跳转到内容

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 安装:

Terminal window
opkg install rvpn-client_1.3.1_<arch>.ipk
opkg install luci-app-rvpn_1.3.1_all.ipk

支持的架构:x86_64aarch64armv7mipsel_24kcmips_24kc

postinst 钩子会在 /etc/rvpn/identity.key 处自动生成身份密钥并启用服务。在你填写服务器地址之前,守护进程保持停止状态。

打开路由器的管理界面,进入 服务 → VPN → rVPN

  1. 服务器 —— 粘贴基础 URL(例如 wss://vpn.example.com)。正确的 WebSocket 路径会自动附加。
  2. 模式 —— 选择 SOCKS5 代理(配合 WPAD 自动发现,让 LAN 客户端按需分应用路由)或 TUN(全局 VPN)(LAN 全量透明路由)。
  3. 预共享密钥包 —— 把服务器管理员提供的 JSON 粘贴到 Prekey Bundle 文本框,点击保存并应用。
  4. 服务器指纹 (可选) —— 把运营方提供的 ik:1:… 固定值粘贴到这里以启用严格固定;留空则采用首次使用即信任(TOFU)。
  5. 启用 —— 打开开关。保存并应用。

Overview 段的状态标签会根据 procd 实例的运行情况显示 已连接 / 连接中 / 已禁用。

UCI 配置项非常直白:

Terminal window
uci set rvpn.main.server_address='wss://your-server.com'
uci set rvpn.main.mode='socks5'
uci set rvpn.main.enabled='1'
# 可选:严格固定替代 TOFU
uci 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 中都有内联注释。最常用的:

段名选项用途
mainserver_addressrVPN 服务器的基础 URL(不含路径)。
mainmodesocks5tun
server_identityserver_fingerprint规范的 ik:1: 固定值。留空即 TOFU。
server_identitytrust_on_first_use默认 1,首次连接时捕获身份。
server_identitystrict_mode1 会在首次连接时也拒绝未知身份(需配合固定值)。
socks5listen_addressSOCKS5 代理监听地址。默认 0.0.0.0:1080
http_proxyenabled同时启用 HTTP 代理。默认关闭。
tunip_address本地 TUN 地址。默认 10.200.0.2/24
split_tunnelbypass_countries逗号分隔的 ISO 国家码,其 CIDR 段不走隧道。
networkdns_serversDNS 回落解析器。
wpadenabled通过 DHCP 选项 252 广告 SOCKS5 代理。默认启用。

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 模式下守护进程创建一个虚拟接口(默认 rvpn0),热插拔脚本 /etc/hotplug.d/iface/99-rvpn-tun 会在接口上线后为 IPv4 与 IPv6 分别设置策略路由:

  • 100 得到经由 VPN 网关的默认路由。
  • 优先级 100 的规则匹配 iif br-lan —— LAN 客户端进表,路由器自身出站流量不进表。

rvpn 防火墙区在出站进行伪装(masquerade),并对 IPv4/IPv6 拒绝入站。这样双栈 LAN 不会把 IPv6 直接漏到 WAN。

与其他所有 rVPN 客户端相同的模型:首次成功连接时,守护进程以规范的 ik:1:<base32> 形式捕获服务器的 Ed25519 身份。如果服务器日后在没有签名轮换的情况下出示不同身份,守护进程会拒绝连接。

若想从一开始就固定特定身份,把运营方的 ik:1: 值粘贴到 服务器指纹 字段(LuCI)或设置 rvpn.server_identity.server_fingerprint(CLI)。设置 strict_mode='1' 会在首次连接时也拒绝未知身份 —— 请配合固定值使用。

完整模型(含运营方轮换密钥的方法)请参考 服务器身份固定

隧道已建立但 LAN 客户端没走隧道(TUN 模式)

Section titled “隧道已建立但 LAN 客户端没走隧道(TUN 模式)”

在接口起来之后检查策略路由和默认路由是否就位:

Terminal window
ip rule show | grep br-lan
ip route show table 100

两者都应有条目。若缺失,logread -e rvpn 会告诉你热插拔脚本为什么退出(未解析到网关、找不到 br-lan 等)。

LuCI 显示”已禁用”但守护进程在运行

Section titled “LuCI 显示”已禁用”但守护进程在运行”

保存并应用没有触发守护进程重载。/etc/init.d/rvpn reload 会重新运行 generate_config;如果没有:

Terminal window
uci show rvpn
/etc/init.d/rvpn restart

确认 DHCP 选项已经写入:

Terminal window
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 放置该文件。

更多故障排查请参考 故障排查指南