4、桥接配置实战(Mosquitto):Mosquitto桥接配置文件详解、远程桥接与本地桥接、TLS加密桥接配置
好,咱们进入实战环节。前面聊了那么多桥接的理论,今天咱们把袖子撸起来,直接上手配 Mosquitto。我个人习惯是,学一个新东西先看它的配置文件长什么样,心里有个底。Mosquitto 的桥接配置,说白了就是通过一个叫 bridge 的指令,告诉它:「嘿,你去跟另一台 Broker 连个线,把某些主题的消息传过去。」
4.1 Mosquitto 桥接配置文件详解
Mosquitto 的桥接配置,通常写在 mosquitto.conf 里,或者单独写一个 .conf 文件然后用 include_dir 引进来。我建议你单独写,方便管理。
先看一个最基础的桥接配置片段:
# 定义一个桥接连接,名字叫 bridge-to-hq
connection bridge-to-hq
address 192.168.1.100:1883
# 桥接的主题映射
topic # out 0
topic # in 0
# 本地和远程的客户端ID
local_clientid bridge_local
remote_clientid bridge_remote
# 桥接模式
bridge_protocol_version mqtt-v311
bridge_attempt_unsubscribe false
这里我解释几个关键字段:
- connection:这是桥接的「名字」,你可以起任何名字,但最好有意义。比如
connection to-beijing-cluster。 - address:远程 Broker 的地址和端口。可以是 IP 也可以是域名。
- topic:这是核心。格式是
topic 主题模式 方向 QoS。方向有out(本地发到远程)、in(远程发到本地)、both(双向)。 - local_clientid / remote_clientid:桥接两端使用的客户端 ID。注意不要跟其他客户端冲突。
重要提醒: topic # out 0 表示把所有本地主题都发到远程,QoS 为 0。这在生产环境要慎用,流量可能会很大。我在项目中见过有人直接配了 #,结果把整个公司的传感器数据全传到了云端,带宽直接打满。
4.2 远程桥接与本地桥接
嗯,这里要区分一下。远程桥接和本地桥接,其实不是配置上的区别,而是网络拓扑上的区别。
远程桥接,指的是两个 Broker 部署在不同的网络环境里,比如一个在本地机房,一个在阿里云上。这时候你需要考虑网络延迟、带宽限制、以及断线重连。
配置远程桥接时,我通常会加上这些参数:
connection remote-bridge
address mqtt.example.com:1883
# 远程桥接建议开启自动重连
start_type automatic
restart_timeout 30
# 心跳检测
keepalive_interval 60
cleansession false
# 主题映射:只同步设备数据
topic device/+/data out 1
topic cloud/+/command in 1
你看,我加了 start_type automatic,这样 Mosquitto 启动时自动建立桥接。还有 restart_timeout 30,断线后 30 秒重试。这些在远程场景下特别重要。
本地桥接,通常是在同一个局域网内,比如两个机房之间,或者同一个集群内部。这时候延迟低,带宽大,配置可以简单一些:
connection local-bridge
address 10.0.0.2:1883
# 本地桥接,可以大胆用高QoS
topic sensor/# both 2
# 本地桥接一般不需要太复杂的重连策略
start_type automatic
restart_timeout 10
我的经验: 本地桥接我一般用 QoS 2,确保消息不丢。远程桥接我倾向于 QoS 1,因为 QoS 2 在公网上来回确认,延迟会高不少。你想想看,一条消息在公网上飞四次,跟飞两次,差别还是挺大的。
4.3 TLS加密桥接配置
好,到了重头戏。TLS 加密桥接,说白了就是给桥接通道加一把锁。为什么要加?因为你的 MQTT 数据在网络上明文传输,万一被截获了,设备数据、控制指令全暴露了。我曾经在一个客户现场,他们用远程桥接把工厂数据传到总部,结果发现数据在公网上裸奔,吓得当场就让我配 TLS。
配置 TLS 桥接,你需要三样东西:CA 证书、服务端证书、服务端私钥。如果你是自己搭建的 PKI,还需要客户端证书。
先看服务端(远程 Broker)的配置:
# 远程 Broker 的 mosquitto.conf
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
tls_version tlsv1.2
require_certificate true
再看客户端(本地 Broker)的桥接配置:
connection tls-bridge
address mqtt.example.com:8883
# TLS 相关配置
bridge_cafile /etc/mosquitto/certs/ca.crt
bridge_certfile /etc/mosquitto/certs/client.crt
bridge_keyfile /etc/mosquitto/certs/client.key
# 主题映射
topic factory/# out 1
topic control/# in 1
# 其他参数
start_type automatic
restart_timeout 30
注意: 如果你配了 require_certificate true,那么客户端必须提供证书,否则连接会被拒绝。我第一次配的时候忘了在桥接配置里加 bridge_certfile 和 bridge_keyfile,结果日志里一直报 SSL error: certificate required,查了半天才发现。
还有一个容易踩的坑:TLS 版本。Mosquitto 默认可能支持 TLS 1.0/1.1,但这些版本现在被认为不安全。我建议你显式指定 tls_version tlsv1.2,或者直接用 tlsv1.3(如果客户端支持)。
最后,验证 TLS 桥接是否成功,可以看 Mosquitto 的日志:
tail -f /var/log/mosquitto/mosquitto.log
如果看到类似这样的输出,说明桥接建立成功:
1634123456: New connection from 192.168.1.100:54321 on port 8883.
1634123456: Bridge bridge-to-hq doing local SUBSCRIBE on topic factory/#
1634123456: Bridge bridge-to-hq doing local SUBSCRIBE on topic control/#
总结一下: 桥接配置其实不复杂,核心就是 connection、address、topic 这三个。TLS 加密桥接多配几个证书路径。远程桥接注意重连策略,本地桥接可以大胆用高 QoS。嗯,把这些记住,你就能应付大部分场景了。
下一章,咱们聊聊桥接的监控和排错。到时候我会分享一些我踩过的坑,保证让你少走弯路。