跳到主要内容

接入四步

前提自检 → 自助申请 → 装隧道 → 验证。 全程只在本机执行,不需要动路由器,也不需要公网 IP。

先看清一件事

Hub 不会替你运行电台服务。你的 MRRC Modern 始终跑在你自己的机器上, Hub 只是给它一个从公网可达的入口。所以"局域网已经能用"是硬前提 —— 局域网不通,接上 Hub 也不会通。

  1. 前提自检

    在继续之前,逐条确认下面五件事。任何一条不满足,先解决它再往下走。

    局域网能打开 http://<你的内网IP>:8888/ 能出登录页。
    默认端口 8888,默认监听所有网卡。
    能登录 首次启动会自动生成随机口令,在登录页横幅和菜单栏的 Show Password… 里都能看到。
    有音频、能发射 先在局域网里跑通一次完整收发。远程排障比本地排障贵十倍。
    知道设备 串口(如 /dev/cu.usbserial-*)与音频设备名 (常见是 USB Audio Device)—— 装完之后如果配置变了, 这两项是要改的地方。
    出站可达 隧道控制口 8989 的出站不能被拦。公司网、访客 Wi-Fi 常拦非标端口。
    三个端口是不同的事

    隧道控制口是 tunnel.mrrc.vlsc.net:8989(你的电脑连出去); 入口是 <呼号>.mrrc.vlsc.net:9988(浏览器连进来)。 它们都要出站可达,但只有前者是接入时必须打通的。

  2. 注册:拿到你的名字与端口

    呼号是你在 Hub 上的身份。注册完成后你会得到三样东西,后面两步都要用。

    今天可用 自助申请(公网入口已上线)

    打开 https://portal.mrrc.vlsc.net:8899/,填呼号与联系方式提交。Portal 当场走完前三步:

    • 规范化 —— 去空格、大小写不敏感。BG1SB 与 bg1sb 视为同一个呼号,不会变成两个租户。
    • 查重 —— 同一个呼号在同一时刻只能有一个归属人。 已被绑定时走申诉/转移流程,绝不静默覆盖。
    • 核验 —— 命中 Club Log 呼号库(27 万条,与站内留言版同源) 的当场自动核验;库外转人工核验 —— 库外 ≠ 冒用,新执照、低活跃都可能不在库里,只有人能拒绝。

    核验通过后,运维走第四步分配:把呼号标签与隧道端口写进注册表, 然后把三样东西发给你:呼号标签(入口就是 <呼号>.mrrc.vlsc.net)、隧道端口(形如 188xx)、隧道凭证(别贴进公开场合)。 拿到这三样,进第 3 步装隧道。

    自助注册对你的三个实际好处
    • 不会被静默覆盖 —— 被冒用时申请会被拒绝,而不是抢走你的呼号。
    • 每一步有审计 —— 申请、核验、授予都进追加式审计日志。
    • 可被撤销 —— 冒用被核实后移除绑定并停用入口(/revoke)。
    为什么核验必须发生在"给访问"之前

    呼号是公开信息,入口存在性天然可以被枚举出来 —— 这一点在设计上是被 有意接受的,不是漏洞。既然藏不住,防御重心就只能前移到"授予访问之前把身份核实清楚", 而不是事后追责。

  3. 装隧道

    隧道把你自己机器上的电台服务,接到 Hub 上属于你呼号的那个回环端口。 你的电脑只连出去,不开放任何入站端口。

    # 1) 取仓库(安装器在里面)
    git clone https://github.com/cheenle/mrrc_hub.git
    
    # 2) 装成常驻服务(macOS / Linux)
    #    不需要先装 frp —— 安装器会自己取回来并校验哈希
    MRRC_HUB_TOKEN='<隧道凭证>' \
      bash mrrc_hub/deploy/install_instance_tunnel.sh <呼号> <隧道端口>

    Windows 用对等的 PowerShell 版,而且它做的更多:

    $env:MRRC_HUB_TOKEN = '<隧道凭证>'
    .\mrrc_hub\deploy\install_instance_tunnel.ps1 <呼号> <隧道端口>
    frpc 从哪来 安装器按三级优先选:① 安装包内嵌副本 → ② 系统 PATH 里已有的 → ③ 从 frp 官方 release 下载并校验 SHA-256, 不符即拒绝使用。版本与 Hub 端钉死对齐 —— 客户端比服务端新可能握手失败。缓存落在 ~/.local/share/mrrc-fleet。
    它做了什么 写一份 0600 的隧道配置,并装一个常驻服务: macOS 是带 KeepAlive 的 LaunchAgent、Linux 是 systemd 用户单元(带 linger,注销后仍活)、Windows 是计划任务。 崩溃、重启、换网都能自恢复。
    Windows 额外做 用内置的 openssl 给你的 <呼号>.mrrc.vlsc.net 签一张自签证书,并把证书路径与心跳阈值写成用户级环境变量 —— 应用下次启动即生效。私钥不出本机,只有公钥交给 Hub 钉住。
    它不做什么 不管你的 MRRC 服务。电台服务归你自己起。 实例没起来时隧道照常在,访问会得到 502 —— 这是区分 "隧道断了"和"电台服务没起"的关键。
    幂等 / 防冲突 已经有手工启动的隧道客户端在跑时,它会拒绝启动 —— 两个客户端抢同一个名字会让入口反复抖动。
    凭据处理 凭据只落在 0600 配置文件里;不进命令行参数、不进世界可读的文件。
    端口与凭证从哪来?

    隧道端口由 Hub 侧权威分配(注册表里那行),你不能自己挑。 核验通过、运维分配后,你会拿到标签、端口与凭证三样东西。 没拿到就别猜 —— 填错的端口隧道会连上,但入口仍然 404。

  4. 验证

    两条命令,一条看隧道,一条看整条链路。

    # 1) 隧道这一跳健康吗
    tail -5 "$HOME/Library/Application Support/mrrc-fleet/frpc-<呼号>.log"
    # 期望看到:login to server success
    #           [<呼号>] start proxy success
    
    # 2) 从公网看整条链路健康吗
    curl -sI https://<呼号>.mrrc.vlsc.net:9988/login        # 期望 200
    curl -s  https://<呼号>.mrrc.vlsc.net:9988/api/health     # 期望 401
    401 是好事

    /api/health 返回 401 说明三层同时通了: 隧道建立成功、Hub 按呼号找到了你的实例、实例的鉴权中间件在工作。 如果它返回 200,反而说明鉴权没生效 —— 值得停下来查一下。

    两条都通过之后,浏览器打开下面的地址,用你的主口令登录, 就应该看到和局域网里一模一样的控制台:

    https://<呼号>.mrrc.vlsc.net:9988/
  5. 重启之后

    这两件事的行为不一样,这是最容易踩的坑。

    隧道 自动回来。常驻服务带自重启(macOS LaunchAgent / Linux systemd --user / Windows 计划任务), 重启、崩溃、换网络都会自己重连。
    MRRC 服务 看你装的是哪个版本:
    · 打包版(v1.22.0 起)—— 按正常应用安装,已带 Hub 前置能力(路径前缀 / 令牌不进 URL / 会话遥测 / PTT 活性闸门)。
    · 源码运行 —— 非常驻,重启后要手动起(下面就这个情况)。
    cd mrrc_modern
    while IFS='=' read -r k v; do case "$k" in ''|\#*) continue;; esac; export "$k=$v"; done \
        < "$HOME/Library/Application Support/MRRC-Modern/mrrc_modern.env"
    nohup venv/bin/python server.py > /tmp/mrrc-src/server.log 2>&1 &
    必须是这个 while ... read 循环,不能 source

    环境文件里有 USB Audio Device 这类带空格的值。 source 会把值里的词当命令去执行;上面这个循环才是正确的加载方式。 这不是风格问题,是会真的报错。

接下来 → 怎么用、怎么分享给朋友 · 连不上 → 排障 · 想知道每一层为什么这么设计 → 设计与层层实现
本页事实基线:2026-10-01 现场取证。命令与期望输出均在现网实例上实测。