[mosquitto] 在 CentOS 7 安裝 MQTT Broker ,並使用帳密驗證
在 IoT 領域第一個碰到的協定應該會是 http,再深入一點則是 MQTT,MQTT 是一個非常輕便的協定,MQTT 沒有像是 http header 的東西,可以節省相當的流量!網路上有許多 MQTT 的說明,這裡只講解如何架設與測試。
(環境:CentOS 7.9)
- mosquitto 預設是不在安裝套件內的,因此需要先安裝 Extra Packages for Enterprise Linux (EPEL)
[user@localhost ~]$ sudo yum install -y epel-release
- 安裝 mosquitto
[user@localhost ~]$ sudo yum install -y mosquitto
- 啟動服務
[user@localhost ~]$ sudo systemctl enable mosquitto #讓mosquitto重開機會自動啟動 [user@localhost ~]$ sudo systemctl start mosquitto #現在馬上啟動mosquitto
- 測試
- 開啟一個新的 terminal (在此稱tty1)
[user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 # mosquitto_sub 訂閱主題 # -h 指定 MQTT Broker的IP/FQDN # -t 指定訂閱的主題
- 開啟一個新的 terminal (在此稱tty2)
[user@localhost ~]$ mosquitto_pub -h localhost -t Try/MQTT/CentOS7 -m "Test Message" # mosquitto_pub 發布主題 # -h 指定 MQTT Broker的IP/FQDN # -t 指定發布的主題 # -m 發布的訊息
- 這時在tty1應該就能看到「Test Message」,此時代表安裝完成!測試完畢後,可以關閉tty1與tty2。
- 設定 mosquitto 帳號與密碼
- 創建帳號
[user@localhost ~]$ sudo mosquitto_passwd -c /etc/mosquitto/passwd test_account # /etc/mosquitto/passwd為帳密檔位置 # test_account 為所要新增的帳號 Password: 輸入該帳號的密碼 Reenter password: 再次輸入該帳號的密碼
- 修改 mosquitto 設定檔(/etc/mosquitto/mosquitto.conf),加入以下兩行
allow_anonymous false # 不可匿名登入,一定要輸入帳密 password_file /etc/mosquitto/passwd # 讓 mosquitto 知道帳密檔在哪裡
- 重啟 mosquitto 服務
[user@localhost ~]$ sudo systemctl restart mosquitto
- 開啟一個新的 terminal (在此稱tty1)
[user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 Connection error: Connection Refused: not authorised.
發現被拒絕了,因為沒有授權(也就是沒有輸入帳號) - tty1 中的指令更改如下
[user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 -u test_account -P 1234 # -u 指定帳號 # -P 指定密碼 (注意P為大寫)
- 開啟一個新的 terminal (在此稱tty2)
[user@localhost ~]$ mosquitto_pub -h localhost -t Try/MQTT/CentOS7 -m "Test Message" -u test_account -P 1234 # -u 指定帳號 # -P 指定密碼 (注意P為大寫)
- 這時在tty1應該就能看到「Test Message」,此時代表帳號密碼機制設定完成!
- 在CentOS中幾乎所有的Port預設都是關閉的,無法由外部連入,因此需要另外設定才能開放給其他主機連線,MQTT 預設的 Port 為 1883
[user@localhost ~]$ sudo firewall-cmd --permanent --add-port=1883/tcp success [user@localhost ~]$ sudo firewall-cmd --reload success
- 到目前為止,可以使用帳密阻擋未被授權的連線,但連線本身並未加密,若被攔截封包,還有可能會被得知帳密,將在下一個文章教學如何在 mosquitto 加上 TLS 。
留言
張貼留言