4、搭建MQTT Broker:Mosquitto安装与配置、EMQX安装与配置、Broker安全设置(用户名密码/SSL/TLS)

好,咱们进入第四章。这一章,咱们要亲手把MQTT的“心脏”——Broker给搭起来。

你想想看,没有Broker,设备跟设备之间怎么传消息?说白了,Broker就是那个“邮局”。今天咱们选两个最主流的:Mosquitto和EMQX。一个轻量级,一个企业级。我个人的习惯是,原型验证用Mosquitto,生产环境上EMQX。

4.1 Mosquitto:轻量级Broker的安装与配置

Mosquitto,Eclipse基金会下的老牌项目。它小,真的小。我在树莓派上跑过,内存占用才几十兆。适合边缘网关、嵌入式设备。

4.1.1 安装Mosquitto

Linux上安装最简单。Ubuntu/Debian用户,直接敲:

sudo apt update
sudo apt install mosquitto mosquitto-clients -y

CentOS/RHEL用户:

sudo yum install epel-release -y
sudo yum install mosquitto -y

Windows用户?去官网下载exe安装包就行。嗯,这里要注意,Windows版默认不带service,需要手动注册。

安装完,先别急着跑。咱们看看默认配置。

4.1.2 基础配置

配置文件在 /etc/mosquitto/mosquitto.conf。我建议你备份一份:

sudo cp /etc/mosquitto/mosquitto.conf /etc/mosquitto/mosquitto.conf.bak

然后打开它。最基础的配置,其实就几行:

# 监听端口
listener 1883

# 允许匿名访问(生产环境千万别这么干)
allow_anonymous true

# 数据持久化
persistence true
persistence_location /var/lib/mosquitto/

# 日志
log_dest file /var/log/mosquitto/mosquitto.log

保存,启动服务:

sudo systemctl start mosquitto
sudo systemctl enable mosquitto

验证一下:

mosquitto_sub -h localhost -t "test" -v &
mosquitto_pub -h localhost -t "test" -m "Hello MQTT"

能看到消息,说明Broker跑起来了。

我的小技巧: 调试阶段,我习惯把日志级别调到debug。在配置里加一行 log_type all,能看到所有连接和消息的细节。排查问题特别好用。

4.2 EMQX:企业级Broker的安装与配置

EMQX,国产开源之光。它支持百万级并发,集群部署,规则引擎……说白了,就是能扛大流量。我在一个智慧城市项目里用过,单机扛了5万设备,稳得很。

4.2.1 安装EMQX

EMQX的安装方式很多。我推荐用Docker,干净利落:

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18083:18083 emqx/emqx:5.0.26

端口说明:

端口 用途
1883 MQTT TCP端口
8083 MQTT WebSocket端口
8084 MQTT over TLS/SSL端口
18083 Dashboard管理界面

不想用Docker?直接下载tar.gz包也行:

wget https://www.emqx.com/en/downloads/broker/5.0.26/emqx-5.0.26-ubuntu20.04-amd64.tar.gz
tar -xzf emqx-5.0.26-ubuntu20.04-amd64.tar.gz
cd emqx
./bin/emqx start

启动后,浏览器访问 http://localhost:18083,默认账号 admin,密码 public。进去后第一件事——改密码!

4.2.2 EMQX的配置方式

EMQX的配置在 /opt/emqx/etc/emqx.conf(或Docker容器内的对应路径)。它支持HOCON格式,比Mosquitto的ini格式更灵活。

举个例子,修改监听器:

listeners.tcp.default {
  bind = "0.0.0.0:1883"
  max_connections = 1024000
} 

我个人觉得,EMQX最大的优势是它的Dashboard。点几下鼠标,就能看到连接数、消息吞吐量、订阅关系。比敲命令爽多了。

我曾经踩过的坑: 有一次我把EMQX的 max_connections 设得太高,结果服务器内存爆了。记住,每个连接大概消耗2-4KB内存。算好你的硬件上限再设值。

4.3 Broker安全设置:用户名密码认证

好,Broker跑起来了。但你现在是“裸奔”状态——谁都能连,谁都能发消息。这不行。

咱们先上第一道锁:用户名密码。

4.3.1 Mosquitto的用户名密码配置

Mosquitto用密码文件。先创建:

sudo mosquitto_passwd -c /etc/mosquitto/passwd user1

它会让你输入两次密码。想加更多用户?去掉 -c 参数:

sudo mosquitto_passwd /etc/mosquitto/passwd user2

然后修改配置文件,开启认证:

allow_anonymous false
password_file /etc/mosquitto/passwd

重启Mosquitto:

sudo systemctl restart mosquitto

现在再试一下匿名连接:

mosquitto_sub -h localhost -t "test"

会报错 Connection Refused: not authorised。带上用户名密码才行:

mosquitto_sub -h localhost -t "test" -u "user1" -P "你的密码"

4.3.2 EMQX的用户名密码配置

EMQX更简单。在Dashboard里,点“认证” -> “内置数据库”,添加用户就行。

或者用命令行:

./bin/emqx_ctl auth add username password

EMQX还支持外部认证源,比如MySQL、Redis、LDAP。我在一个大型项目里用过MySQL认证,用户信息统一管理,方便得很。

核心原则: 生产环境永远不要开 allow_anonymous。哪怕只是测试,也养成加密码的习惯。这是血的教训换来的。

4.4 SSL/TLS加密通信

用户名密码只能防“谁在连”,但防不了“谁在偷听”。消息在网络上还是明文传输的。你想想看,如果有人在同一个WiFi下抓包,你的传感器数据、控制指令全暴露了。

所以,咱们得上SSL/TLS。

4.4.1 生成自签名证书

测试环境,咱们用自签名证书。生产环境请用CA签发的证书。

先生成CA证书:

# 生成CA私钥
openssl genrsa -out ca.key 2048

# 生成CA证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=MyMQTT CA"

再生成服务器证书:

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成证书签名请求
openssl req -new -key server.key -out server.csr -subj "/CN=你的服务器IP或域名"

# 用CA签名
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

4.4.2 Mosquitto配置SSL

在配置文件中添加:

listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
tls_version tlsv1.2

重启Mosquitto。客户端连接时,端口改成8883,并指定CA证书:

mosquitto_sub -h localhost -p 8883 --cafile ca.crt -t "test"

4.4.3 EMQX配置SSL

EMQX的SSL配置在Dashboard里就能搞定。点“监听器” -> “SSL/TLS”,上传证书文件就行。

或者改配置文件:

listeners.ssl.default {
  bind = "0.0.0.0:8883"
  ssl_options {
    keyfile = "/opt/emqx/etc/certs/server.key"
    certfile = "/opt/emqx/etc/certs/server.crt"
    cacertfile = "/opt/emqx/etc/certs/ca.crt"
  }
}
我的经验: 证书过期是生产环境最常见的故障之一。我建议在证书到期前30天设置告警。另外,用Let's Encrypt的免费证书也是个好选择,自动续期,省心。

4.5 本章小结

咱们今天干了三件事:

  • 装了Mosquitto和EMQX,一个轻量一个重量
  • 加了用户名密码认证,堵住了匿名访问的漏洞
  • 配了SSL/TLS加密,让消息在网络上“隐身”

嗯,到这里,你的Broker已经具备基本的生产能力了。下一章,咱们要开始写代码,让设备真正连上来。

记住一句话:安全不是功能,是习惯。从今天开始,每次搭Broker都带上密码和证书,就像出门要带钥匙一样自然。

公众号:蓝海资料掘金营,微信deep3321