Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

独立 hop 节点(rove-hop)

rove-hop 是一个独立运行的二级出口(hop)代理:不连控制面、不读快照、不执行策略、不限速。它的定位是 「受控网络里的一个干净出口」—— 主节点(edge)把命中分流规则的流量转发给它,由它直连真实目标。

它和主节点 rove 共用同一套访问日志方案,但没有用户/策略/限速这些控制面能力。

认证

hop 用单一用户名密码认证,来自命令行或环境变量:

  • --username / --password
  • Rove_HOP_USERNAME / Rove_HOP_PASSWORD

只要配置了任一入口监听,这两项就是必填的:两项都缺、或只给一半,进程启动即失败并说明该设哪些参数。 hop 没有内置回退凭据——回退值会被编进每一份发布二进制,忘记设置就等于把一个公开口令的开放代理 挂到网上。反向 QUIC-only 的 hop 不监听任何入口,因此不需要凭据。

下文聚焦单个功能的示例默认已经 export Rove_HOP_USERNAME / Rove_HOP_PASSWORD,因此命令行里不再重复这两项。

三种入口

参数含义
--socks5 ADDR明文 SOCKS5
--https ADDRHTTP CONNECT over TLS
--socks5tls ADDRSOCKS5 over TLS
--tls-cert / --tls-keyTLS 入口所需的证书与私钥
# 只启动明文 SOCKS5(凭据必填)
./rove-hop --socks5 0.0.0.0:1080 --username hop-user --password hop-pass

# 同时启动 HTTPS、SOCKS5、SOCKS5-over-TLS
./rove-hop \
  --https 0.0.0.0:8443 \
  --socks5 0.0.0.0:1080 \
  --socks5tls 0.0.0.0:1081 \
  --tls-cert ./certs/server.crt \
  --tls-key ./certs/server.key \
  --username hop-user \
  --password hop-pass

控制面快照里建一个 named egress 指向这个 hop(backend.kind = "http" 或 "socks5",addr 填 hop 地址, 带上同一套凭据),再让 routing policy 的 route 选中它,即可把匹配流量从这个 hop 发出。 见 数据模型 · 出口 backend。

专用出口 DNS(可选)

hop 常位于目标网络里、亲自解析并连出用户目标域名,因此这里最需要指定可信解析器。用 --dns-server(可重复,ip 或 ip:port)把 hop 的所有出口目标解析(HTTP/SOCKS5 入口与反向隧道目标)改走指定 DNS,--dns-protocol udp|tcp|tls|https 选传输;不设则用系统解析器。 bare IP 的默认端口随传输:udp/tcp=53、tls=853、https=443。

./rove-hop --socks5 0.0.0.0:1080 \
  --dns-server 10.0.0.53 --dns-server 10.0.0.54:5353 --dns-protocol tcp

跨不可信链路时用加密 DNS(DoT/DoH)保证应答完整性,--dns-server-name 校验证书名,私有服务器用 --dns-ca 指向自签 CA:

./rove-hop --socks5 0.0.0.0:1080 \
  --dns-server 10.0.0.53 --dns-protocol tls \
  --dns-server-name dns.internal --dns-ca /etc/rove/dns-ca.pem

DoH 加 --dns-doh-path(默认 /dns-query);自签名且无 CA 时可用 --dns-insecure(危险,跳过校验)。 拼错地址或协议、或 tls/https 少填 --dns-server-name 会 fail-closed(启动即报错),不会静默回落系统解析器。

反向模式(NAT / 防火墙后)

当 edge 无法主动拨号 hop(hop 在 NAT / 私有网络后)时,hop 可以主动用 QUIC 拨到 edge 注册,由 edge 反向 开隧道。可以只跑反向会话(不配任何本地 listener),也支持多个 --reverse-quic 注册到多个 edge:

# 令牌走环境变量,避免进 argv
Rove_HOP_REVERSE_TOKEN=REPLACE_WITH_TOKEN ./rove-hop \
  --reverse-quic edge.example.com:9443 \
  --reverse-hop-id rove-hop-jp

常用反向参数:--reverse-quic(可重复)、--reverse-hop-id、--reverse-token、--reverse-server-name、 --reverse-insecure、--reverse-max-streams、--reverse-initial-mtu(跑在压缩/固定 MTU 隧道里时固定 QUIC 路径 MTU,UDP 载荷字节 1200-1500)。edge 侧 [reverse_hop] 配置、多 edge、观测与 NAT 保活见 反向 hop 数据面。

Subnetra 组网(TUN 模式)

rove-hop 可以作为轻量级的 TUN spoke 节点,加入以 rove 为中心的 Subnetra 虚拟局域网。 在此模式下,rove-hop 在宿主机内核创建并托管一个 TUN 设备(如 rove0),获取 overlay IP(如 10.0.0.2), 将本机的系统端口(如 sshd :22、ping)直接暴露在 overlay 内部,与其他 spoke 主机纯三层互通,无需经过任何应用层代理。

为了避免预共享密钥(PSK)泄露在命令行 argv 中,rove-hop 强制要求通过配置文件读取 [subnetra] 段:

# 启动 TUN spoke(需要 root 或 CAP_NET_ADMIN 特权)
sudo rove-hop --subnetra-config /etc/rove/mesh.toml

配置文件示例(/etc/rove/mesh.toml):

[subnetra]
enable = true
mode = "spoke"
device = "tun"                  # rove-hop 强制要求 device = "tun"
local_id = 2
listen = "0.0.0.0:0"            # spoke 随机绑定出站 UDP 端口
overlay_cidr = "10.0.0.2/24"    # 本节点的 overlay IP 与虚拟子网掩码
obfuscate = true
keepalive_secs = 25
mtu = 1400

[subnetra.tun]
name = "rove0"                  # Linux 网卡名
manage = true                   # true: 自动分配 IP、子网路由并拉起网卡

[[subnetra.peers]]
id = 1
psk = "REPLACE_LINK_1_2_64_HEX_CHARS"
allowed_src = "10.0.0.0/24"     # 所有 overlay 流量送往 hub 中继
endpoint = "203.0.113.10:18020" # 公网 hub 的 UDP 监听地址
name = "hub"

当仅作为 TUN spoke 节点运行时,无需配置任何 --username、--password 或入口监听参数。 也可以与 --socks5 / --https 等入口监听并存。

外网出口诊断 doctor egress

内置一个手工诊断命令,不启动代理监听、不连控制面。默认从 Google、YouTube、OpenAI、Cloudflare、GitHub 里随机挑一个目标做深度诊断;也可指定 preset 名、域名、host:port 或 URL:

./rove-hop doctor egress                         # 随机目标,文本输出
./rove-hop doctor egress github.com              # 指定目标
./rove-hop doctor egress api.openai.com:443 --trace
./rove-hop doctor egress --target github --trace --json   # 给脚本用

输出按 DNS、route、TCP、TLS、HTTP 和可选 trace 分层。--trace 优先调用系统 traceroute,缺失时尝试 tracepath,逐跳输出 hop index、IP、反查主机名、RTT;系统没有 trace 工具则该层标记 skipped,不影响其他层。

MQTT 远程 egress doctor(可选,默认关)

hop 不挂 edge 的用户查询 / 同步 / 拨测通道。需要 TE3 远程回收与 doctor egress --json 同构的分层报告时,单独打开 hop MQTT:

rove-hop --socks5 0.0.0.0:1080 \
  --mqtt-broker tcp://mqtt.example.com:1883 \
  --mqtt-hop-id rove-hop-jp \
  --mqtt-username mqtt-user
# 密码走 Rove_HOP_MQTT_PASSWORD,不要进 argv
用途主题方向
触发 doctorrove/hop/<hop_id>/doctor控制面 → hop
一次性回复rove/replies/hop-doctor-<id>(前缀默认 rove/replies/)hop → 控制面

请求必须带 target(preset / host:port / URL)和合法 reply_topic。trace 默认关,超时夹在 500ms–30s。 回包字段与 --json 相同(kind=egress_diagnostic,dns/route/tcp/tls/http/trace),并附加 event=hop_egress_doctor、hop_id、request_id。token / 密码不会进回包。doctor 不跑在 splice / CONNECT 热路径上; 未配 --mqtt-broker 时进程行为与现在完全一致。

详见 MQTT 对接。

访问日志

hop 与主节点访问日志方案完全一致(默认开启、按天轮转、保留 7 天)。可用这些参数调整:

--access-log-disable、--access-log-dir、--access-log-file-prefix、--access-log-retention-days、 --access-log-channel-capacity;转发 syslog 用 --access-log-syslog ADDR(搭配 --access-log-syslog-protocol / -facility / -tag)。详见 访问日志。

完整参数列表随时可查:rove-hop --help。

RouterOS 容器部署

在 MikroTik RouterOS 上把 rove-hop 跑在 container 里、做 NAT 后反向出口时,请直接看运维专题: