[mosquitto] 在 CentOS 7 安裝 MQTT Broker ,並使用帳密驗證

在 IoT 領域第一個碰到的協定應該會是 http,再深入一點則是 MQTT,MQTT 是一個非常輕便的協定,MQTT 沒有像是 http header 的東西,可以節省相當的流量!網路上有許多 MQTT 的說明,這裡只講解如何架設與測試。

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

留言

這個網誌中的熱門文章