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跑起来了。
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。点几下鼠标,就能看到连接数、消息吞吐量、订阅关系。比敲命令爽多了。
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"
}
}
4.5 本章小结
咱们今天干了三件事:
- 装了Mosquitto和EMQX,一个轻量一个重量
- 加了用户名密码认证,堵住了匿名访问的漏洞
- 配了SSL/TLS加密,让消息在网络上“隐身”
嗯,到这里,你的Broker已经具备基本的生产能力了。下一章,咱们要开始写代码,让设备真正连上来。
记住一句话:安全不是功能,是习惯。从今天开始,每次搭Broker都带上密码和证书,就像出门要带钥匙一样自然。
公众号:蓝海资料掘金营,微信deep3321