在内网中搭建MQTT
假设你在内网有一台服务器,这台服务器没有公网IP。
这篇博客有详细的MQTT搭建,但是不适合家用,里面使用了SSL证书还有域名并且MQTT搭建在有公网IP的服务器上。
本次实验搭建的MQTT适用于实验中使用MQTT。
需要的材料,一台服务器,或者笔记本,系统推荐centos,window据说也可以。
https://www.cnblogs.com/yangfengwu/p/7764667.html这篇博客是在window下搭建的。
第1步-安装Mosquitto
sudo yum -y install epel-release
sudo yum -y install mosquitto
该软件包带有一个简单的默认配置,因此让我们运行它以测试我们的安装。
sudo systemctl start mosquitto
我们还需要启用该服务以确保在重新引导系统时启动该服务:
sudo systemctl enable mosquitto
现在让我们测试默认配置。该mosquitto
软件包带有一些命令行MQTT客户端。我们将使用其中一个订阅经纪人上的主题。
主题是您将消息发布到并订阅的标签。它们按层次结构排列,因此例如可以有sensors/outside/temp
和sensors/outside/humidity
。您如何安排主题取决于您和您的需求。在本教程中,我们将使用一个简单的测试主题来测试我们的配置更改。
第二次登录到服务器,因此并排有两个终端。在新终端中,用于mosquitto_sub
订阅测试主题:
mosquitto_sub -h localhost -t test
-h
用于指定MQTT服务器的主机名,并且-t
是主题名称。点击后您将看不到任何输出,ENTER
因为它mosquitto_sub
正在等待消息到达。切换回另一个终端并发布一条消息:
mosquitto_pub -h localhost -t test -m "hello world"
的选项mosquitto_pub
与相同mosquitto_sub
,尽管这次我们使用附加-m
选项来指定消息。点击ENTER
,您应该会在另一个终端中看到hello world。您已经发送了第一条MQTT消息!
输入CTRL+C
第二个终端以退出mosquitto_sub
,但保持与服务器的连接打开。我们将在步骤5中再次使用它进行另一项测试。
接下来,我们将使用新的Let's Encrypt客户端Certbot通过SSL保护安装的安全。
第2步-安装和运行Certbot以让我们对证书进行加密
让我们加密是一项新服务,可通过自动API提供免费的SSL证书。官方的Let's Encrypt客户端称为Certbot,它包含在上一步中安装的EPEL存储库中。
使用安装Certbot yum
。
sudo yum -y install certbot
Certbot需要回答Let's Encrypt API发出的加密挑战,以证明我们控制了我们的域。它使用端口80
(HTTP)和/或443
(HTTPS)来完成此操作。我们将仅使用port 80
,因此现在允许该端口上的传入流量。
使用firewall-cmd
添加的HTTP服务。
sudo firewall-cmd --permanent --add-service=http
重新加载防火墙,以使更改生效。
sudo firewall-cmd --reload
现在,我们可以运行Certbot来获取我们的证书。我们将使用该--standalone
选项来告诉Certbot自行处理HTTP质询请求,并将--standalone-supported-challenges http-01
通信限制为port 80
。-d
用于指定您想要证书的域,并certonly
告诉Certbot仅检索证书而无需执行任何其他配置步骤。
sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com
运行该命令时,系统将提示您输入电子邮件地址并同意服务条款。这样做之后,您应该看到一条消息,告诉您该过程已成功完成,并且证书的存储位置。
我们有我们的证书。现在,我们需要确保Certbot在它们即将到期时自动更新它们。
步骤3 —设置Certbot自动续订
让我们加密的证书仅有效九十天。这是为了鼓励用户自动执行证书更新过程。我们需要设置一个定期运行的命令来检查证书是否过期并自动更新它们。
为了每天运行续签检查,我们将使用cron
标准的系统服务来运行定期作业。我们cron
通过打开和编辑一个名为的文件来告诉该怎么做crontab
。
sudo EDITOR=nano crontab -e
EDITOR=nano
将在nano
编辑器中打开crontab文件。如果您希望使用默认vi
编辑器,请将其关闭。
现在,您将看到默认crontab
的空白文件。粘贴在以下行中,然后保存并关闭文件。
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"
该15 3 * * *
行的部分意思是“每天凌晨3:15运行以下命令”。renew
Certbot的命令将检查系统上安装的所有证书,并更新所有设置为在三十天内过期的证书。--noninteractive
告诉Certbot不要等待用户输入。
--post-hook "systemctl restart mosquitto"
将重新启动Mosquitto以获取新证书,但前提是证书已更新。
现在已经完成了自动证书更新,我们将重新配置Mosquitto使其更加安全。
步骤4 —配置MQTT密码
让我们将Mosquitto配置为使用密码。Mosquitto包含一个实用程序,用于生成名为的特殊密码文件mosquitto_passwd
。该命令将提示您输入指定用户名的密码,并将结果放在中/etc/mosquitto/passwd
。
sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
现在,我们将替换默认配置文件,并告诉Mosquitto使用此密码文件要求所有连接都需要登录。首先,删除现有的mosquitto.conf
。
sudo rm /etc/mosquitto/mosquitto.conf
现在打开一个新的空白配置。
sudo nano /etc/mosquitto/mosquitto.conf
粘贴在下面。
allow_anonymous false
password_file /etc/mosquitto/passwd
allow_anonymous false
将禁用所有未经身份验证的连接,并且该password_file
行告诉Mosquitto在哪里查找用户和密码信息。保存并退出文件。
现在我们需要重新启动Mosquitto并测试我们的更改。
sudo systemctl restart mosquitto
尝试发布没有密码的消息。
mosquitto_pub -h localhost -t "test" -m "hello world"
该消息应被拒绝:
Output
Connection Refused: not authorised. Error: The connection was refused.
在再次尝试使用密码之前,请再次切换到第二个终端窗口,并使用用户名和密码来订阅“ test”主题:
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
它应该连接并坐着,等待消息。在本教程的其余部分中,您可以保持此终端的打开和连接状态,因为我们会定期向其发送测试消息。
现在,再次使用用户名和密码在另一个终端上发布一条消息:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
到此就可以结束了
以下的都需要域名和公网IP绑定,
mosquitto_sub -h localhost -t test -u "sammy" -P "password"
mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
这两条命令就可以在内网中使用了。