FMO (NFM Over Internet) 语音服务器搭建指南
ℹ️ 通知
FMO 固件 4.0 版本已正式推送,如果你正在使用旧版本,建议立即升级到最新版本,如果您仍然坚持使用 2/3.x.x 版本的FMO固件建设服务器,请参考 旧版指南2.0,旧版指南3.0。
需要留意:出于安全性考量,2.x/3.x 版本的 FMO 设备无法发现 4.x 版本发布的服务器;而 4.0 设备当前仍兼容旧版服务器,我们将在合适的时候结束对 2.0/3.0 版本的支持。
FMO 4.0版本,彻底摒弃了共享密码/密钥模式,转而改用数字证书 + 数字签名的方式持续验证爱好者身份。 这带来了无可伪造的用户身份,同时任何人都可以通过公开的根证书,验证一个设备证书所代表的呼号是否真实有效。 我们在FMO内完整的实现了 根证书->中间证书->用户证书的 PKI 证书链验证模型。 这是一个工程学上的巨大改进,意味着服务器管理员即使不出示用户名密码,也能安全的让真正的爱好者登录自己的服务器。
在这一模型中,认证与责任是两个独立且清晰的维度:
认证(技术层面):证书链从根CA延伸到用户证书,确保每个设备持有者的身份(呼号)可被任何第三方公开验证,无法伪造。
责任(治理层面):签发证书、授权接入、在服务器上发言——所有行为都归属于具体的个人、管理员或组织。系统本身不自动追责,但提供不可抵赖的技术证据。
这种分离设计,既保证了认证机制的纯粹透明,也为社群自治保留了灵活的管理空间。
这是自 FMO 诞生以来最重要的一次更新,它标志着 FMO 从原始的“密钥分发模式”彻底转向了“数字证书模式”。也标志着FMO最终从襁褓中开始走向成熟。
用户视角的FMO 2.0.0授权机制:您的FMO收集大家在aprs上分发的用户名密码,然后您的fmo使用用户名密码登录的大家的服务器。
用户视角的FMO 3.0.0授权机制:您的FMO收集大家分发在aprs上的Secret,然后您的fmo打包您的个人信息,使用Secret利用签名算法将您的个人信息签名,组装成临时登陆令牌,并用该令牌登陆大家的服务器。
用户视角的FMO 4.0.0授权机制: 您的FMO收集大家在任意途径分发的数字证书和数字签名,然后通过根证书->中间证书->用户证书持续验证一个用户是否为业余无线电爱好者。在访问爱好者自建服务器时,对方也通过根证书->中间证书->用户证书持续验证您自己是否也为真的业余无线电爱好者。双方交叉比对后,允许您在对方服务器上进行通联或数据交换。在4.0机制下,没有公开的用户名密码/秘密、设备内的证书代表了您的唯一身份。
FMO如何通过APRS广播式发现
FMO采用“代理广播”的方式广播爱好者所搭建的MQTT Broker。具体原理可访问
APRS官网收录文章:aprs.org: 《Build a High-Speed Data Exchange HamNet Based on APRS-IS》 By BG5ESN
了解FMO的广播工作原理。
详细操作说明
| 图标 | 说明 |
|---|---|
| 🖥️ | 服务器端操作,通常代表需要在您的MQTT Broker或终端进行的操作。 |
| 📻 | 涉及FMO设备本体操作,如通过浏览器访问后台,直接操作FMO界面。 |
| ℹ️ | 提示信息 |
STEP1: 安装MQTT Broker
- 🖥️ 访问 EMQX官网,按照官方文档进行安装和配置,确保版本大于5.8版本。确保您的MQTT Broker能够正常运行,并可通过外网访问。
- 🖥️ 预先配置您的服务器的外网访问URL和端口。
- ℹ️应用提示: FMO使用MQTT Broker进行数据交换,我们建议您安装EMQX的MQTT Broker(或Mosquito附带http认证插件版本),您可以根据自己的需求选择合适的MQTT Broker进行搭建。
- ℹ️安全性提示: EMQX的docker版本在您重启容器后,会恢复默认18083登陆端口的登陆信息,该部分可能有安全隐患,请仔细确认后使用。
STEP2: 设置FMO
-
📻使用电脑访问[FMO网页后台] -> [参数配置],仔细阅读解释说明,并配置如下内容:
📻配置项 📻说明 APRS网络设置 -> APRS PASSCODE 您登录APRS的密码,可以在APRS官网申请 自定义服务器 -> 自定义服务器地址 可以是IP或域名,需要直接指向您的服务器公网地址 自定义服务器 -> 自定义服务器端口 常规非加密端口为1883,需要直接指向您的服务器地址 自定义服务器 -> 服务器名称 这是您服务器的名称,支持中英文,设置后,会显示在您的FMO上 自定义服务器 -> 服务范围 您可以规定您的服务器所覆盖的范围 -
📻 上述确认配置完毕后,请点击 [APRS网络设置] -> [重启APRS服务] -> [重启服务],让您的配置生效。
-
📻 请回到设备上进行操作 回到FMO设备主界面 -> 顺时针旋转旋钮 -> 应当可以看到您的服务器已经呈现在列表中。
-
📻 基础配置已经完成,请继续按照STEP3进行配置。
STEP3: 安装并设置证书验证器 (SAS)
方式一:一键脚本安装
🖥️ 一行命令完成下载、配置、注册系统服务并启动:
Linux / macOS (需要 root 权限):
curl -fsSL https://bg5esn.com/share/fmo/sas-installer/install.sh | sudo bash
Windows (以管理员身份运行 PowerShell):
irm https://bg5esn.com/share/fmo/sas-installer/install.ps1 | iex
安装脚本会自动完成以下操作:
- 检测您的系统平台,下载对应版本的 SAS
- 引导您输入 SAS 启动参数(从📻[FMO后台] -> [SAS 搭建快捷方式] -> [生成命令] 复制粘贴即可)
- 注册为系统服务(Linux: systemd / macOS: launchd / Windows: 计划任务)并启动
服务管理 - Linux:
| 项目 | 说明/指令 |
|---|---|
| 日志 | journalctl -u fmo-sas -f |
| 启动 | systemctl start fmo-sas |
| 停止 | systemctl stop fmo-sas |
| 重启 | systemctl restart fmo-sas |
| 升级 | systemctl stop fmo-sas && /opt/fmo-sas/sas –update && systemctl start fmo-sas |
| 卸载 | curl -fsSL https://bg5esn.com/share/fmo/sas-installer/uninstall.sh |
| 配置文件 | /etc/fmo-sas/config.json |
| 安装目录 | /opt/fmo-sas/ |
服务管理 - macOS:
| 项目 | 说明/指令 |
|---|---|
| 日志 | tail -f /var/log/fmo-sas.log |
| 启动 | sudo launchctl load /Library/LaunchDaemons/com.fmo.sas.plist |
| 停止 | sudo launchctl unload /Library/LaunchDaemons/com.fmo.sas.plist |
| 升级 | sudo launchctl unload /Library/LaunchDaemons/com.fmo.sas.plist && /usr/local/opt/fmo-sas/sas –update && sudo launchctl load /Library/LaunchDaemons/com.fmo.sas.plist |
| 卸载 | curl -fsSL https://bg5esn.com/share/fmo/sas-installer/uninstall.sh |
| 配置文件 | /usr/local/etc/fmo-sas/config.json |
| 安装目录 | /usr/local/opt/fmo-sas/ |
服务管理 - Windows(管理员 PowerShell):
| 项目 | 说明/指令 |
|---|---|
| 日志 | Get-Content -Wait “$env:LOCALAPPDATA\fmo-sas\sas.log” |
| 启动 | Start-ScheduledTask -TaskName fmo-sas |
| 停止 | Stop-ScheduledTask -TaskName fmo-sas |
| 重启 | Stop-ScheduledTask fmo-sas; Start-ScheduledTask fmo-sas |
| 升级 | Stop-ScheduledTask fmo-sas; & “$env:LOCALAPPDATA\fmo-sas\Sas.exe” –update; Start-ScheduledTask fmo-sas |
| 卸载 | irm https://bg5esn.com/share/fmo/sas-installer/uninstall.ps1 |
| 配置文件 | %LOCALAPPDATA%\fmo-sas\config.json |
| 安装目录 | %LOCALAPPDATA%\fmo-sas\ |
方式二:手动安装
如果您不希望使用一键脚本,也可以按照以下步骤手动安装:
-
🖥️访问 GitHub Release 页面 下载您对应服务器平台的二进制文件(如 linux-x64 则下载 linux-x64.tar.gz,Windows 则下载 win-x64.zip)。
-
🖥️解压上述程序至您服务器的相应目录,如:
# Linux/macOS
mkdir -p ~/fmo-sas && tar xzf linux-x64.tar.gz -C ~/fmo-sas
# Windows: 解压 win-x64.zip 至任意目录
-
📻电脑访问[FMO后台] -> [SAS 搭建快捷方式] -> [生成命令],复制生成的启动命令。
-
🖥️在解压目录下执行复制的命令:
cd ~/fmo-sas
./Sas --server-uid 2 --server-callsign 您的呼号 --mqtt-host 您的服务器地址 --mqtt-port 1883 --cert-fingerprint 您的证书指纹 --http-port 8080
- 🖥️ SAS 正常启动后请保持运行。如需后台运行可自行配置 systemd / screen / nohup 等。升级时执行
./Sas --update即可。
SAS 正常运行日志参考
无论使用哪种方式安装,SAS 正常启动后的日志看起来应当和下面相似,如遇到任何启动问题,可根据提示进行排查修复:
[2026-06-15 09:30:11.006] [INFO ] _____ __ __ ___
[2026-06-15 09:30:11.018] [INFO ] | ___| \/ |/ _ \
[2026-06-15 09:30:11.018] [INFO ] | |_ | |\/| | | | |
[2026-06-15 09:30:11.018] [INFO ] | _| | | | | |_| |
[2026-06-15 09:30:11.018] [INFO ] |_| |_| |_|\___/
[2026-06-15 09:30:11.018] [INFO ]
[2026-06-15 09:30:11.018] [INFO ] Server Authorizer Service
[2026-06-15 09:30:11.018] [INFO ]
[2026-06-15 09:30:11.018] [INFO ] Config: /etc/fmo-sas/config.json
[2026-06-15 09:30:11.018] [INFO ] SAS HTTP auth mode
[2026-06-15 09:30:11.019] [INFO ] MQTT: fmo2.bg5esn.com:1883
[2026-06-15 09:30:11.019] [INFO ] Server: uid=2 callsign=BG5ESN certFingerprint=hBpv6w-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[2026-06-15 09:30:11.020] [INFO ] Admins: 2 uid=2 fp=hBpv6w-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, uid=450 fp=R1RzqD_vlL-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[2026-06-15 09:30:11.020] [INFO ] Version: 1.0.3+2593091efb6709a8284093e0f21462e09adc3a69
[2026-06-15 09:30:11.089] [INFO ] Loaded Root CA: sn=1 keyId=1
[2026-06-15 09:30:11.089] [INFO ] Root CA store initialized with 1 root(s)
[2026-06-15 09:30:11.102] [INFO ] Loaded role: admin (admin.json)
[2026-06-15 09:30:11.102] [INFO ] Loaded role: super (super.json)
[2026-06-15 09:30:11.102] [INFO ] Loaded role: user (user.json)
[2026-06-15 09:30:11.102] [INFO ] SAS HTTP auth listening on:
[2026-06-15 09:30:11.484] [INFO ] http://198.18.0.1:8080/auth
[2026-06-15 09:30:11.484] [INFO ] http://192.168.30.202:8080/auth
[2026-06-15 09:30:11.484] [INFO ] http://192.168.1.202:8080/auth
[2026-06-15 09:30:11.505] [INFO ] CRL manager started: 1 root(s), refresh every 14400s
[2026-06-15 09:30:11.545] [INFO ] HTTP auth server ready
[2026-06-15 09:30:11.546] [INFO ] ─── Checking for updates ───
[2026-06-15 09:30:11.688] [INFO ] Already up to date.
[2026-06-15 09:30:11.692] [INFO ] Root CRL not published yet: xxxx
ℹ️SAS说明 SAS (Server Authorizer Service) 为 FMO Server Authorizer Service 的简写,是 FMO 的开源认证服务,部署在您的 EMQX 旁边,用于验证用户证书链。该服务可离线运行,不依赖中心数据库,不存用户信息列表,它仅根据证书链来验证一个用户是否真的为业余无线电爱好者。可以理解为它是 EMQX 的安全登录防火墙。
- 开源地址:github.com/BG5ESN/fmo-server-authrozier-service
- 支持平台:linux-x64 / linux-arm64 / osx-x64 / osx-arm64 / win-x64(.NET 跨平台开发,无系统级依赖,可自行编译至其他平台)
STEP3: 设置EMQX登录参数
- 🖥️访问EMQX的设置后台 通常情况下为您的服务器的:18083端口 进入[客户端认证] 选项。
- 🖥️点击右上角->[创建]->[Password-Based]->[HTTP服务]
- 🖥️当前参数参考下面的列表
参数 值 说明 请求方式 POST 默认值 URL http://你的SAS服务器地址:8080/auth 参见上述SAS的打印日志中的URL,请填写同一局域网内的SAS地址,我们当前填写:http://192.168.1.202:8080/auth 键 content-type 默认值 值 application/json 默认值 请求体 {“username”: “${username}”,“password”: “${password}”} 默认值 - 🖥️点击创建
- 🖥️正常创建后,你应当可以看到 数据源状态显示为:已连接。
STEP4: 至此您可以尝试让您的FMO登录您自己的节点了,所有配置均已完成。
服务器部署合规和须知
⚠ 若使用中国大陆服务器(如 阿里云、腾讯云)且通过域名访问 → 需进行ICP备案。
⚠ 切勿在自己服务器上进行广告、商业活动,这会直接导致你的服务变为商业服务,进而引发法律风险,这是红线!
⚠ 建设Broker服务时,请将Broker仅供FMO使用,这是因为仅服务于FMO可以确保为业余无线电爱好者(请阅读 FMO的信任链模型),以符合业余无线电业务定义,避免被归类为公共通信服务,增加法律风险。
⚠ 您在使用FMO时,本质上是用互联网延伸业余电台的通联范围,属于技术研究和自我训练的范畴。请务必确保你的服务器仅用于合法的业余无线电活动,并且采取必要的安全措施来防止滥用,这不仅是对法律的遵守,也是对业余无线电社区的负责。
⚠ 必须遵守《中华人民共和国无线电管理条例》 和 《中华人民共和国网络安全法》 等相关法律法规,确保服务器的合法合规运营。
⚠ FMO网络不以规模为目标,建议以小范围、可控的爱好者网络为主,过度扩展可能引发不必要的法律和安全风险。
⚠ 所有爱好者感谢您的付出, 但请不要让它影响您的工作和生活。
⚠ 尽管FMO做到了合规持有证书业余无线电爱好者应有的自律和克制,并建立了完整的信任链模型让爱好者们实现透明自我管理,但在服务器的管理责任和运营风险方面,服务器运营者需要承担更大的风险,请仔细思考您是否能承受相关风险,并以您自己的思考作为行动指南。如有相关考量,请不要进行服务器搭建。
⚠ 以上分析仅代表技术理解,不构成法律意见。业余无线电互联网互联的合规边界仍在探讨中,使用者需独立评估并承担相应法律责任。