如何在Ubuntu 18.04上安装和保护Mosquitto MQTT Messaging Broker

介绍

MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。它通常用于地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模数据收集。

Mosquitto是一种流行的MQTT服务器(或MQTT中的代理),具有出色的社区支持,易于安装和配置的特点。

在本教程中,我们将安装Mosquitto并设置我们的代理以使用SSL来保护受密码保护的MQTT通信。

准备

在开始本教程之前,您需要:

  • 一个Ubuntu 18.04服务器,具有非root,sudo启用的用户和基本防火墙设置。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 根据如何已设置的主机名,指向服务器的域名。本教程将mqtt.example.com贯穿始终。
  • 自动更新的Let's加密SSL证书,用于您的域和Mosquitto,使用Certbot工具生成。您可以在第四步中添加一个systemctl restart mosquitto作为renew_hook,一定要使用在前面的准备步骤配置相同的域。

第一步 - 安装Mosquitto

Ubuntu 18.04在其默认软件存储库中有一个新版本的Mosquitto,因此我们可以从那里安装它。

首先,使用非root用户登录并使用apt update命令更新包列表:

sudo apt update

现在,使用apt install命令安装Mosquitto :

sudo apt install mosquitto mosquitto-clients

默认情况下,Ubuntu将在安装后启动Mosquitto服务。我们来测试默认配置。我们将使用我们刚刚安装的Mosquitto客户端之一来订阅我们的主题。

主题是您向其发布消息和订阅的标签。他们被安排为一个层次,所以你可以有sensors/outside/tempsensors/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退出,但保持与服务器的连接打开。我们将在第五步中再次使用它进行另一次测试。

接下来,我们将使用基于密码的身份验证来保护我们的安装。

第二步 - 配置MQTT密码

让我们配置Mosquitto使用密码。Mosquitto包含一个实用程序来生成一个名为mosquitto_passwd的特殊密码文件。此命令将提示您输入指定用户名的密码,并将结果放入/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

现在我们将为Mosquitto打开一个新配置文件,并告诉它使用此密码文件来要求所有连接的登录:

sudo nano /etc/mosquitto/conf.d/default.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"

该邮件应被拒绝:

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"

该消息应该按照第一步进行。我们已经成功地为Mosquitto添加了密码保护。不幸的是,我们通过互联网发送未加密的密码。我们将通过向Mosquitto添加SSL加密来解决下一步问题。

第三步 - 配置MQTT SSL

要启用SSL加密,我们需要告诉Mosquitto存储Let的加密证书的位置。打开我们之前启动的配置文件:

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

在文件末尾粘贴以下内容,留下我们已经添加的两行:

. . .
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块。第一个,listener 1883 localhost更新端口上的默认MQTT监听器1883,这是我们到目前为止所连接的。1883是标准的未加密MQTT端口。该localhost行的部分指示Mosquitto仅将此端口绑定到localhost接口,因此无法从外部访问它。无论如何,我们的防火墙都会阻止外部请求,但明确是好的。

listener 8883在端口上设置加密侦听器8883。这是MQTT + SSL的标准端口,通常称为MQTTS。接下来的三行: certfilecafile,和keyfile,都指向Mosquitto到适合我们加密文件建立的加密连接。

保存并退出该文件,然后重新启动Mosquitto以更新设置:

sudo systemctl restart mosquitto

更新防火墙以允许连接到端口8883

sudo ufw allow 8883

输出如下所示:

Rule added
Rule added (v6)

现在我们再次使用mosquitto_pub测试一些不同的SSL选项:

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

请注意,我们使用的是完整的主机名而不是localhost。因为我们发出了mqtt.example.comSSL证书,如果我们尝试localhost安全连接,我们会收到一个错误,说主机名与证书主机名不匹配(即使它们都指向同一个Mosquitto服务器)。

--capath /etc/ssl/certs/启用SSL mosquitto_pub,并告诉它在哪里查找root证书。这些通常由您的操作系统安装,因为Mac OS,Windows等的路径不同。mosquitto_pub使用root证书验证Mosquitto服务器的证书是否由Let的加密证书颁发机构正确签名。需要很注意的是mosquitto_pub而且它没有这个选项不会尝试(或类似的SSL连接--cafile选项),即使你连接的标准安全端口8883

如果测试结果一切正常,我们会再次看到hello出现在另一个mosquitto_sub终端。这意味着您的服务器已完全设置好!如果您想扩展MQTT协议以使用websockets,您可以按照最后一步操作。

第四步 - 通过Websockets配置MQTT(可选)

为了在Web浏览器中使用JavaScript来连接MQTT,该协议适用于标准websockets。如果您不需要此功能,则可以跳过此步骤。

我们需要在Mosquitto配置中再添加至少一个listener块:

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

在文件末尾添加以下内容:

. . .
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

同样,请务必在文件末尾留下尾随换行符。

除端口号和protocol websockets线路外,这与前一个块大致相同。MQTT在websockets上没有官方的标准化端口,但是8083最常见。

保存并退出该文件,然后重新启动Mosquitto。

sudo systemctl restart mosquitto

现在,在防火墙中打开8083端口。

sudo ufw allow 8083

要测试此功能,我们将使用基于浏览器的公共MQTT客户端。有一些,但Eclipse Paho JavaScript Client简单易用。在浏览器中打开Paho客户端。你会看到以下内容:

填写连接信息如下:

  • 主机应该是您的Mosquitto服务器的域名: mqtt.example.com
  • 端口应该是8083
  • ClientId可以保留为默认值js-utility-DI1m6
  • 路径可以保留为默认值/ ws
  • 用户名应该是您的Mosquitto用户名。 在这里,我们使用了sammy
  • 密码应该是您选择的密码。

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

按下Connect后,基于Paho浏览器的客户端将连接到您的Mosquitto服务器。

要发布消息,请进入到“ 发布消息”窗格,将“ 主题”填写为“ 测试”,然后在“ 消息”部分中输入任何消息。接下来,按发布。该消息将显示在您的mosquitto_sub终端中。

结论

我们现在已经建立了一个安全的,受密码保护且受SSL保护的MQTT服务器。这可以作为您梦寐以求的任何项目的强大而安全的消息传递平台。一些与MQTT协议配合良好的流行软件和硬件包括:

  • OwnTracks,一款可以在手机上安装的开源地理跟踪应用。OwnTracks将定期向您的MQTT服务器报告位置信息,然后您可以将其存储并显示在地图上,或根据您的位置创建警报并激活IoT硬件。
  • Node-RED是一个基于浏览器的图形界面,用于将物联网“连接”在一起。您将一个节点的输出拖动到另一个节点的输入,并可以通过过滤器,各种协议之间,数据库等信息路由信息。Node-RED非常支持MQTT。
  • ESP8266是一种廉价的无线微控制器MQTT。您可以连接并发布温度数据到主题中,或者可能订阅气压主题并在风暴来临时发出蜂鸣声!

这些只是MQTT生态系统中的一些受欢迎的示例。有更多的硬件和软件可以通过此协议。如果您已经拥有最喜欢的硬件平台或软件语言,它可能具有MQTT功能。

想要了解更多关于Linux的开源信息教程,请前往腾讯云+社区学习更多知识。

参考文献:《How to Install and Secure the Mosquitto MQTT Messaging Broker on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏布尔

后rtx集成时代

基本结构:客户端向服务器发送命令(如给目标rtx号码发送提醒、短信、访问组织和用户信息等)。 ? 1.首先要把原生API做一个基础接口封装,将RTXSDK内部的...

227100
来自专栏架构师小秘圈

域名劫持

作者:sarleon 来自:freebuf.com 01 原理 DNS决定的是我们的域名将解析到哪一个IP地址的记录,是基于UDP协议的一种应用层协议 这个...

93640
来自专栏FreeBuf

基于Python的反连Shell和后渗透工具

声明:该软件供学习研究使用或作为一个POC。开发者不赞同和鼓励或以其它方式支持非授权的电脑入侵和网络破坏。 RSPET (Reverse Shell and ...

224100
来自专栏前端黑板报

HTTP2基础教程-读书笔记(三)

前面两篇记录了HTTP的历史和网络请求、页面渲染的过程以及HTTP/1的一些问题,本篇就来讲一下迁移HTTP/2需要考虑的一些问题。 迁移HTTP/2说简单无非...

36190
来自专栏木子昭的博客

用nodejs向163邮箱, gmail邮箱, qq邮箱发邮件, nodemailer使用详解

以前写过一篇3行代码发邮件(含发送图片), 收获了50+喜欢, 最近博主在用node做后端渲染的业务, 把nodejs发邮件的核心代码也分享一下

19530
来自专栏喔家ArchiSelf

老曹眼中的Linux基础

Linux 几乎无处不在,不论是服务器构建,还是客户端开发,对操作系统的基本理解和基础技能的掌握对全栈来说都是必备的。

14430
来自专栏云知识学习

IIS Windows 集成身份验证弹出输入用户名密码的解决办法

如果您正在设置您的IIS身份验证方式为“ Windows 集成身份验证 ”,并且您在使用IE访问您的站点时发现IE仍然要求您输入您的用户名和密码,而且您又不知道...

43370
来自专栏云知识学习

IIS Windows 集成身份验证弹出输入用户名密码的解决办法

如果您正在设置您的IIS身份验证方式为“ Windows 集成身份验证 ”,并且您在使用IE访问您的站点时发现IE仍然要求您输入您的用户名和密码,而且您又不知道...

398130
来自专栏Python中文社区

反爬虫机制和破解方法汇总

什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式。 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。 ? 常见的反...

4.1K90
来自专栏黑白安全

便携wifi钓鱼

Flash下载工具:跳转 固件我这里用的是iangzy做的:DNS.ino.ino.nodemcu(自行解压)

19820

扫码关注云+社区

领取腾讯云代金券