Linux主機部署MQTT服務器


Linux主機部署MQTT服務器

MQTT是一種機器到機器的消息傳遞協議,旨在為“物聯網”設備提供輕量級的發布/訂閱通信。Mosquitto是一種流行的MQTT服務器(或MQTT中的代理),具有出色的社區支持,易於安裝和配置。

在本篇教程中,我們將安裝和配置Mosquitto,並使用Let的加密SSL證書來保護我們的MQTT流量。

安裝軟件

首先,我們將安裝一個自定義軟件存儲庫以獲取最新版本的Certbot,即Let的加密客戶端:

sudo add-apt-repository ppa:certbot/certbot

ENTER了接受,然后安裝Mosquitto和Certbot的軟件包:

sudo apt install certbot mosquitto mosquitto-clients

接下來我們將獲取SSL證書。

下載SSL證書

打開防火牆中的端口80

# Ubuntu
sudo ufw allow 80
#Centos7
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# iptables防火牆
iptables -I INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
service iptables save

然后運行Certbot以獲取證書。請務必在此處替換您服務器的域名:

sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com

系統將提示您輸入電子郵件地址並同意服務條款。執行此操作后,您應該會看到一條消息,告訴您進程是否成功以及您的證書存儲在何處。

我們接下來將Mosquitto配置為使用這些證書。

配置Mosquitto

首先,我們將創建一個Mosquitto將用於驗證連接的密碼文件。使用mosquitto_passwd來創建這個文件,請確保使用你喜歡的用戶名替換它:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

系統將提示您輸入兩次密碼。

現在為Mosquitto打開一個新的配置文件:

sudo nano /etc/mosquitto/conf.d/default.conf

這將打開一個空文件。粘貼如下:

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

請務必替換您在步驟2中使用的域名為mqtt.example.com。完成后保存並關閉文件。

該文件執行以下操作:

  • 禁用匿名登錄
  • 使用我們的密碼文件啟用密碼驗證
  • 僅在端口1883上為localhost設置不安全的偵聽器
  • 在端口8883上設置安全偵聽器
  • 在端口8083上設置基於websocket的安全偵聽器

重啟Mosquitto以獲取配置更改:

sudo systemctl restart mosquitto

檢查以確保服務再次運行:

sudo systemctl status mosquitto
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated)
   Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/mosquitto.service
           └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

狀態應該是active (running)。如果不是,請檢查配置文件並重新啟動。Mosquitto的日志文件中可能會提供更多信息:

sudo tail /var/log/mosquitto/mosquitto.log

如果一切順利,請使用ufw允許兩個新端口通過防火牆:

sudo ufw allow 8883
sudo ufw allow 8083

現在已經建立了Mosquitto,我們將在續訂證書后配置Certbot以重啟Mosquitto。

配置Certbot續訂

Certbot會在它們到期之前自動續訂我們的SSL證書,但需要告知它在重新啟動之后重啟Mosquitto服務。

打開域名的Certbot續訂配置文件:

sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

在最后一行添加以下renew_hook選項:

renew_hook = systemctl restart mosquitto

保存並關閉該文件,然后運行Certbot dry run以確保語法正常:

sudo certbot renew --dry-run

如果您沒有看到任何錯誤,那么您已經完成了設置。讓我們接下來測試我們的MQTT服務器。

測試Mosquitto

我們在步驟1中安裝了一些命令行MQTT客戶端。我們可以在localhost監聽器上訂閱主題測試,如下所示:

mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"

我們可以用mosquitto_pub發布:

mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"

要使用端口8883上的安全偵聽器進行訂閱,請執行以下操作:

mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

這就是您向安全監聽器發布的方式:

mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

請注意,我們使用的是完整的主機名而不是localhost。因為我們為mqtt.example.com發布了SSL證書,如果我們嘗試安全連接到localhost,我們會收到一條錯誤消息,指出主機名與證書主機名不匹配。

要測試websocket功能,我們將使用基於瀏覽器的公共MQTT客戶端。在瀏覽器中打開Eclipse Paho javascript客戶端實用程序並填寫連接信息,如下所示:

  • 主機是您的Mosquitto服務器的域,mqtt.example.com
  • 端口8083
  • ClientId可以保留為默認的隨機值
  • 路徑可以保留為/ ws的默認值
  • 用戶名是步驟3中的Mosquitto用戶名
  • 密碼是您在步驟3中選擇的密碼

其余字段可以保留其默認值。

Connect后,客戶端將連接到您的服務器。您可以使用連接窗格下的訂閱發布消息窗格進行發布和訂閱。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM