杨丽华二号 發表於 2021-7-26 08:17:00

Linux主机部署MQTT服务器

<h1 id="linux主机部署mqtt服务器">Linux主机部署MQTT服务器</h1>
<p>MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。Mosquitto是一种流行的MQTT服务器(或MQTT中的<em>代理</em>),具有出色的社区支持,易于安装和配置。</p>
<p>在本篇教程中,我们将安装和配置Mosquitto,并使用Let的加密SSL证书来保护我们的MQTT流量。</p>
<h2 id="安装软件"><strong>安装软件</strong></h2>
<p>首先,我们将安装一个自定义软件存储库以获取最新版本的Certbot,即Let的加密客户端:</p>
<pre><code class="language-sh">sudo add-apt-repository ppa:certbot/certbot
</code></pre>
<p>按<code>ENTER了</code>接受,然后安装Mosquitto和Certbot的软件包:</p>
<pre><code class="language-sh">sudo apt install certbot mosquitto mosquitto-clients
</code></pre>
<p>接下来我们将获取SSL证书。</p>
<h2 id="下载ssl证书"><strong>下载SSL证书</strong></h2>
<p>打开防火墙中的端口<code>80</code>:</p>
<pre><code class="language-sh"># 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
</code></pre>
<p>然后运行Certbot以获取证书。请务必在此处替换您服务器的域名:</p>
<pre><code class="language-sh">sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
</code></pre>
<p>系统将提示您输入电子邮件地址并同意服务条款。执行此操作后,您应该会看到一条消息,告诉您进程是否成功以及您的证书存储在何处。</p>
<p>我们接下来将Mosquitto配置为使用这些证书。</p>
<h2 id="配置mosquitto"><strong>配置Mosquitto</strong></h2>
<p>首先,我们将创建一个Mosquitto将用于验证连接的密码文件。使用<code>mosquitto_passwd</code>来创建这个文件,请确保使用你喜欢的用户名替换它:</p>
<pre><code class="language-sh">sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username
</code></pre>
<p>系统将提示您输入两次密码。</p>
<p>现在为Mosquitto打开一个新的配置文件:</p>
<pre><code class="language-sh">sudo nano /etc/mosquitto/conf.d/default.conf
</code></pre>
<p>这将打开一个空文件。粘贴如下:</p>
<pre><code class="language-ini">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
</code></pre>
<p>请务必替换您在步骤2中使用的域名为<code>mqtt.example.com</code>。完成后保存并关闭文件。</p>
<p>该文件执行以下操作:</p>
<ul>
<li>禁用匿名登录</li>
<li>使用我们的密码文件启用密码验证</li>
<li>仅在端口1883上为<strong>localhost</strong>设置不安全的侦听器</li>
<li>在端口<code>8883</code>上设置安全侦听器</li>
<li>在端口<code>8083</code>上设置基于websocket的安全侦听器</li>
</ul>
<p>重启Mosquitto以获取配置更改:</p>
<pre><code class="language-sh">sudo systemctl restart mosquitto
</code></pre>
<p>检查以确保服务再次运行:</p>
<pre><code class="language-sh">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
</code></pre>
<p>状态应该是<code>active (running)</code>。如果不是,请检查配置文件并重新启动。Mosquitto的日志文件中可能会提供更多信息:</p>
<pre><code class="language-sh">sudo tail /var/log/mosquitto/mosquitto.log
</code></pre>
<p>如果一切顺利,请使用<code>ufw</code>允许两个新端口通过防火墙:</p>
<pre><code class="language-sh">sudo ufw allow 8883
sudo ufw allow 8083
</code></pre>
<p>现在已经建立了Mosquitto,我们将在续订证书后配置Certbot以重启Mosquitto。</p>
<h2 id="配置certbot续订"><strong>配置Certbot续订</strong></h2>
<p>Certbot会在它们到期之前自动续订我们的SSL证书,但需要告知它在重新启动之后重启Mosquitto服务。</p>
<p>打开域名的Certbot续订配置文件:</p>
<pre><code class="language-sh">sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
</code></pre>
<p>在最后一行添加以下<code>renew_hook</code>选项:</p>
<pre><code class="language-sh">renew_hook = systemctl restart mosquitto
</code></pre>
<p>保存并关闭该文件,然后运行Certbot dry run以确保语法正常:</p>
<pre><code class="language-sh">sudo certbot renew --dry-run
</code></pre>
<p>如果您没有看到任何错误,那么您已经完成了设置。让我们接下来测试我们的MQTT服务器。</p>
<h2 id="测试mosquitto"><strong>测试Mosquitto</strong></h2>
<p>我们在步骤1中安装了一些命令行MQTT客户端。我们可以在localhost监听器上订阅主题<strong>测试</strong>,如下所示:</p>
<pre><code class="language-sh">mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"
</code></pre>
<p>我们可以用<code>mosquitto_pub</code>发布:</p>
<pre><code class="language-sh">mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"
</code></pre>
<p>要使用端口8883上的安全侦听器进行订阅,请执行以下操作:</p>
<pre><code class="language-sh">mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
</code></pre>
<p>这就是您向安全监听器发布的方式:</p>
<pre><code class="language-sh">mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
</code></pre>
<p>请注意,我们使用的是完整的主机名而不是<code>localhost</code>。因为我们为<code>mqtt.example.com</code>发布了SSL证书,如果我们尝试安全连接到<code>localhost</code>,我们会收到一条错误消息,指出主机名与证书主机名不匹配。</p>
<p>要测试websocket功能,我们将使用基于浏览器的公共MQTT客户端。在浏览器中打开Eclipse Paho javascript客户端实用程序并填写连接信息,如下所示:</p>
<ul>
<li><strong>主机</strong>是您的Mosquitto服务器的域,<code>mqtt.example.com</code></li>
<li><strong>端口</strong>是<code>8083</code></li>
<li><strong>ClientId</strong>可以保留为默认的随机值</li>
<li><strong>路径</strong>可以保留为<strong>/ ws</strong>的默认值</li>
<li><strong>用户名</strong>是步骤3中的Mosquitto用户名</li>
<li><strong>密码</strong>是您在步骤3中选择的密码</li>
</ul>
<p>其余字段可以保留其默认值。</p>
<p>按<strong>Connect</strong>后,客户端将连接到您的服务器。您可以使用<strong>连接</strong>窗格下的<strong>订阅</strong>和 <strong>发布消息</strong>窗格进行发布和订阅。</p><br><br>
来源:https://www.cnblogs.com/cuianbing/p/15059731.html
頁: [1]
查看完整版本: Linux主机部署MQTT服务器