[Unraid 系列 v6.10+] 7 Docker 安装配置 Mosquitto
说明
推荐去看 B站 Mosquitto学习心得_哔哩哔哩_bilibili 视频,基本是对照着官网进行口语翻译,基本上工具也是用的是官方提供的,对于初学者相当不错。
UNRAID 社区官方模板
默认模板
项 | 值 | 说明 |
---|---|---|
名称 |
mosquitto |
|
存储库 |
eclipse-mosquitto:2 |
默认,可以自行修改版本。 |
网络类型 |
Bridge |
默认。 |
MQTT Port |
1883 |
标准 MQTT 端口,默认 1883 。 |
config |
/mnt/user/appdata/mosquitto/config/ |
默认。 |
data |
/mnt/user/appdata/mosquitto/data |
默认。 |
logs |
/mnt/user/appdata/mosquitto/log |
默认。 |
更新模板
根据 Mosquitto Docker 配置 - 终极指南 |塞达洛 (cedalo.com) 提供的说明,在 unraid 模板中添加以下配置。
项 | 值 | 说明 |
---|---|---|
RUN_INSECURE_MQTT_SERVER |
0 |
设置默认值为 0 。 |
MQTT TLS port |
8883 |
自选。设置默认值为 8883 。 |
MQTT Websockets port |
9001 |
自选。设置默认值为 9001 。 |
RUN_INSECURE_MQTT_SERVER
:将此环境变量设置为在端口 1883 上运行接受匿名客户端的不安全的缺省 MQTT 服务器。任何其他值都不起作用。若要启用“接受匿名客户端”的功能,将其值设置为
1
即可。
MQTT TLS port
:自选。经常用作 MQTT TLS 端口。默认情况下不启用。
- 官方推荐作为非证书保护的 TCP 端口。
8884
:官方推荐作为有证书保护的 TCP 端口。
MQTT Websockets port
:自选。标准 MQTT Websockets 端口。默认情况下不启用。
Docker Compose
docker-compose.yml
version: '3.8'
services:
mosquitto:
image: eclipse-mosquitto:2
ports:
- 1883:1883
- 8883:8883
- 9001:9001
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
networks:
- mosquitto
networks:
mosquitto:
name: mosquitto
driver: bridge
启动: docker-compose up -d
。
配置 Mosquitto
设置基于密码的身份认证
创建密码文件附加到容器。运行以下命令以创建用户并将其添加到此文件(可以更改为其他路径):
mosquitto_passwd -c /mnt/user/appdata/mosquitto/config/passwd user_name
如果要将更多用户添加到密码文件,请使用以下命令:
mosquitto_passwd -c /mnt/user/appdata/mosquitto/config/passwd user_name password
如果要删除用户,请运行:
mosquitto_passwd -D /mnt/user/appdata/mosquitto/config/passwd user_name
开启 TLS
使用 X509 格式、PEM 编码的证书。
第三方证书
可以使用阿里的免费证书,证书格式: Apache 证书
和 OV 和 DV 根证书
。
证书文件后缀为 .crt
,密钥文件为 .key
。
Apache 证书
有关文件作为客户端证书和密钥, OV 和 DV 根证书
作为 CA 证书。
OpenSSL 生成证书
根据 Mosquitto-tls 手册页 | Eclipse Mosquitto 。
-
生成证书颁发机构证书和密钥:
openssl req -new -x509 -days <持续时间> -extensions v3_ca -keyout ca.key -out ca.crt
-
服务器
-
生成服务器密钥。
openssl genrsa -aes256 -out server.key 2048
-
生成不加密的服务器密钥。
openssl genrsa -out server.key 2048
-
生成要发送到 CA 的证书签名请求。
openssl req -out server.csr -key server.key -new
注意:当系统提示输入 CN(公用名)时,请输入您的服务器(或代理)主机名或域名。
-
将 CSR 发送到 CA,或使用您的 CA 密钥对其进行签名。
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days <持续时间>
-
-
客户
-
生成客户端密钥。
openssl genrsa -aes256 -out client.key 2048
-
生成要发送到 CA 的证书签名请求。
openssl req -out client.csr -key client.key -new
-
将 CSR 发送到 CA,或使用您的 CA 密钥对其进行签名。
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days <持续时间>
-
mosquitto.conf
主要配置示例
#监听端口 MQTT Default listener
listener 1883 0.0.0.0
#侦听端口 1883 上的所有可用网络接口,可以在上面的侦听器中省略 IP 地址 ,但建议将其保留得更明确
# MQTT over WebSockets
#listener 9001 0.0.0.0
#protocol websockets
#如果还想在 TLS 上使用 websockets 就设置证书
#cafile /path/to/your/ca.crt
#certfile /path/to/your/mosquitto.crt
#keyfile /path/to/your/mosquitto.key
# MQTT over TLS
#listener 8883 0.0.0.0
#cafile /path/to/your/ca.crt
#certfile /path/to/your/mosquitto.crt
#keyfile /path/to/your/mosquitto.key
#持久化数据
persistence true
persistence_location /mosquitto/data/
#启用日志
log_dest file /mosquitto/log/mosquitto.log
log_type error
#取消注释所需的日志级别
#debug/error/warning/notice/information/subscribe/unsubscribe/websockets/none/all/error/warning
#输出日志到控制台
#log_dest stdout
#基于密码的身份认证
password_file /mosquitto/config/passwd
#允许匿名连接
allow_anonymous false
#除了在创建 docker 容器时使用 `RUN_INSECURE_MQTT_SERVER` 环境变量,`allow_anonymous` 参数可防止未经身份验证的客户端连接到代理。。默认情况下,此参数设置为 false,但显式提及它始终是一个好主意。
#如果要实现更高的安全性,请不要允许此设置,并仅使用身份验证进行连接。
重新启动容器以使更改生效。
监听端口。
从 Mosquitto 2.0.0 开始,您必须显式配置侦听器,或设置 override 变量。
如果在运行 docker run 命令时使用该选项映射了端口,则侦听器将在 mqtt://0.0.0.0:1883 时可供主机使用。这意味着您的代理也将在主机的端口 1883 上可供外界使用(请注意,如果您希望从外部访问此端口,您可能必须确保防火墙不会阻止此端口)。
子配置
mosquitto 通常通过一个名为 的主配置文件进行配置。但是,为了便于在 unRAID 方案中使用,此容器改用仅包含单个选项的默认主配置文件。
include_dir /mosquitto/config
此配置会导致枚举挂载点中的所有文件,并将它们合并到共享配置中。您可以在此位置创建单个文件,也可以创建单独文件的集合。
例如,您可以创建以下文件:
文件 内容 mosquitto.conf
主 mosquitto 配置文件 tls.conf
TLS 的其他侦听器配置 websockets.conf
Websockets 的其他侦听器配置 警告:将单个文件应用于配置的顺序不一定是按字母顺序排列的,它是由操作系统和文件系统的特性决定的,因此尝试从一个文件中的设置“覆盖”另一个文件中的设置是不安全的。
客户端
官方 CLI 工具
Mosquitto 自带了 CLI 工具 mosquitto_sub
和 mosquitto_pub
等,参考: Index of /man/ (mosquitto.org) 。
示例:
# 接收 mosquitto_sub -h test.mosquitto.org -p 8884 -u user_name -P user_passwd -t "topic" -v --cafile ca.crt --cert client.crt --key client.key # 发送 mosquitto_pub -u user_name -P user_passwd -t "topic" -m "msg"