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_certfilebridge_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/#

总结一下: 桥接配置其实不复杂,核心就是 connectionaddresstopic 这三个。TLS 加密桥接多配几个证书路径。远程桥接注意重连策略,本地桥接可以大胆用高 QoS。嗯,把这些记住,你就能应付大部分场景了。

下一章,咱们聊聊桥接的监控和排错。到时候我会分享一些我踩过的坑,保证让你少走弯路。