簡介
mosquito
是一個流行的 Eclipse
開源的 MQTT
(訊息佇列遙測傳輸)代理。它輕巧,易於安裝,適用於小型或大型 IoT
(物聯網)應用程式。
安裝
# For Debian/Ubuntu-based
sudo apt install mosquitto mosquitto-clients
# Required for Mosquitto on RHEL/CentOS
sudo yum install epel-release
sudo yum install mosquitto mosquitto-clients
# 使用dnf安裝
sudo dnf install mosquitto mosquitto-clients
啟動 Mosquitto
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
常用選項
-h
:指定主機IP地址或域名-t
:指定主題的名稱-m
:傳送的訊息-p
:指定埠-u
:授權賬戶的使用者名稱-P
:授權賬戶的密碼
常用操作
客戶端連線使用IP地址的方式
mosquitto_pub -h localhost -t "home/temperature" -m "22.5"
mosquitto_sub -h localhost -t "home/temperature"
客戶端連線使用域名的方式
域名只需要解析到IP就行
mosquitto_pub -h your-domain.com -p 1883 -t "test/topic" -m "Hello MQTT"
mosquitto_sub -h your-domain.com -p 1883 -t "test/topic"
客戶端連線使用SSL的方式
- 安裝
certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot
# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot
- 使用
Certbot
生成免費證書
使用 Standalone
模式,沒有 Web
服務時
sudo certbot certonly --standalone -d mqtt.example.com
使用 Webroot
模式,有 Web
服務時
sudo certbot certonly --webroot -w /var/www/html -d mqtt.example.com
- 配置
Mosquitto
使用證書
在 mosquitto.conf
配置檔案中新增:
# 設定 TLS/SSL 監聽埠(預設 8883)
listener 8883
# 根證書鏈檔案
cafile /etc/letsencrypt/live/mqtt.example.com/fullchain.pem
# 域名證書檔案
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
# 私鑰檔案
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
- 重啟
Mosquitto
服務
sudo systemctl restart mosquitto
- 連線配置了
SSL
的Mosquitto
# --capath 指定包含可信任 CA 根證書的目錄路徑
mosquitto_pub -h mqtt.example.com -p 8883
--capath /etc/ssl/certs -t "test" -m "Hello, MQTT over TLS!"
# --cafile 用於自定義的單個 CA 檔案,例如測試環境或自簽名證書
mosquitto_pub -h mqtt.example.com -p 8883
--cafile /path/to/custom-ca.pem -t "test" -m "Hello, MQTT over TLS!"
- 設定自動續期證書
sudo certbot renew --dry-run
- 使用計劃任務自動續期
0 3 * * * certbot renew --quiet && systemctl restart mosquitto
設定使用者名稱密碼
- 建立或更新
Mosquitto
密碼檔案
sudo mosquitto_passwd -c /etc/mosquitto/password_file [username]
# username 為自定義設定的使用者名稱
# 輸入完以上命令後會提示輸入密碼
- 修改
Mosquitto
配置檔案
在 mosquitto.conf
中啟用密碼認證
# 表示禁止匿名使用者登入,需要使用者名稱密碼
allow_anonymous false
# 指定密碼檔案的位置
password_file /etc/mosquitto/password_file
其 password_file
可以自定義名稱,裡面內容與 /etc/shadow
裡面儲存密碼格式型別。
- 重啟
Mosquitto
服務
sudo systemctl restart mosquitto
- 客戶端連線時提供使用者名稱密碼
mosquitto_pub -h your-domain.com -p 1883 -u "username" -P "password"
-t "test/topic" -m "Hello MQTT"
mosquitto_sub -h your-domain.com -p 1883 -u "username" -P "password"
-t "test/topic"
配置 ACL
規則
ACL
(Access Control List,訪問控制列表) 是用來定義客戶端對主題的訪問許可權的規則配置檔案。
透過 ACL
,可以精確控制哪些客戶端可以訂閱或釋出哪些主題
- 建立
ACL
檔案
sudo vim /etc/mosquitto/acl
- 配置
ACL
規則
ACL
規則語法
# 允許匿名客戶端的預設許可權(如果啟用匿名訪問)
topic read #
# 為某個使用者指定許可權
user <username>
topic <access> <topic>
示例配置:
# 允許匿名使用者只讀訪問所有主題
topic read #
# 限制特定使用者訪問
user client1
topic write sensors/temperature
topic read sensors/temperature
# client2 只能讀取 home/light
user client2
topic read home/light
# client3 可以讀寫所有主題
user client3
topic read #
topic write #
# read 允許訂閱
# write 允許釋出
# #號匹配當前及其子級所有主題
# +號匹配當前級別的單個主題