首页 > 解决方案 > 无法让 Mosquitto 允许来自外部本地网络的连接

问题描述

我有 Linux Ubuntu 18.04 笔记本电脑,并在那里安装了 Mosquitto MQTT 代理。在我的 Windows 10 笔记本电脑上,我正在运行使用 M2Mqtt 库的 Visual Studio 2013 编写的 C# 应用程序。

如果我通过本地主机连接,一切都很好。我启动 Mosquitto 服务器,通过 C# 应用程序连接,订阅一个主题,然后可以整天来回发送消息。

但是当我尝试通过互联网地址连接时,我一直收到一个 uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException: "No connection could be made because the target machine positively denied it 95.XXX.XXX.134:1883" 错误。(那里的地址是我通过“WhatsmyIP”得到的)

这是我到目前为止所做的:

首先,我去了我的路由器,这是一个 TP-LINK AC1200。我将端口设置为转发到 Linux 机器的本地 IP 地址。

TPLINK 截图

然后我去我的Linux机器并使用ufw启用端口1833并启用防火墙

Linux 截图

从那里我已经尝试了我能想到的一切——我已经使用在命令行中声明的端口运行 Mosquitto,我已经将 conf 文件更改为:

听众 1883 0.0.0.0

听众 1883 192.168.0.144

我已经完全删除了端口分配和侦听器分配(因为无论如何这是它的默认值)并且我总是得到相同的结果。

我下载了 2 个不同的实用程序——一个在 Android 手机上,一个是 Windows 商店提供的应用程序,我也无法连接它们中的任何一个。Android手机根本无法连接(它不在同一个网络上,因此不能选择localhost),其他应用程序将在本地连接,但当我更改为互联网地址时不会。

我觉得我只是错过了一件小事,但我无法弄清楚它是什么。还有其他 stackoverflow 问题显示相同的错误,但它们对我没有帮助。

如果重要的话,正在运行的实际 C# 代码是:

try 
           {
                System.Security.Cryptography.X509Certificates.X509Certificate caCert = null;
                Boolean useSecureProtocol = false;
                int OpenPort = 1883;
                // external IP address
                String PublicIPAddress = "95.XXX.XXX.134";
                // local IP address
                String LocalIPAddress = "192.168.0.144";

                System.Net.IPAddress ipaddress = System.Net.IPAddress.Parse(PublicIPAddress);
                client = new MqttClient(ipaddress, OpenPort, useSecureProtocol, caCert, MqttSslProtocols.TLSv1_0); 
// certificate and Protocol are irrelevant because security set to false??
            }
            catch (System.Net.Sockets.SocketException SException )
            {
                string SEX = SException.Message;
            }

* * * 

            try
            {
                Byte retVal = client.Connect(ClientId);
            }
            catch (uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException ex)
            {
                string m = ex.Message;
            }

配置文件:conf.d(我使用 -C 选项显式运行)

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
#


pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /home/mark_admin/mosquitto.log

include_dir /etc/mosquitto/conf.d

正如我所说,我已经改变了它并尝试了很多事情:

监听器 1883 192.168.0.144 监听器 1883 0.0.0.0 监听器 1883

以上都不是。只好留空了。他们都没有工作。

标签: c#tcpmqttmosquitto

解决方案


我将其发布为答案,因此我可以提供更多详细信息,以防将来有人偶然发现此问题。

在 Ubuntu 18.04 中设置 MOSQUITTO MQTT 服务器其实并不难,但是步骤很重要。

第 1 步:安装 Mosquitto 软件

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto

步骤 2:打开 1883 端口并启动防火墙

sudo ufw allow 1883 
sudo ufw enable

第 3 步:验证 Mosquitto 尚未运行

pgrep mosquitto

[注意,如果有任何数字显示,那就是已经运行的 Mosquitto 的 PID。你可以杀了它。另外,您可以尝试:sudo service mosquitto stop ]

第 4 步:使用详细选项启动 Mosquitto

mosquitto -v

[注意:这会在不使用任何配置文件的情况下启动 Mosquitto。它将连接和状态信息回显到屏幕上。最容易快速调试。]

第 5 步:使用本地主机检查连接性

转到您的客户端计算机(在我的情况下是 Windows 10 笔记本电脑)并运行 MQTT 客户端,连接到 Linux Mosquitto 服务器的本地地址(在我的情况下为 192.168.0.144)。您应该能够连接。事实上,你甚至可以在打开防火墙之前执行此步骤,因为这都是在本地网络上,所以此时防火墙规则无关紧要。直到下一步……

第 6 步:使用网络工具检查连接

使用:www.yougetsignal.com/tools/open-ports/https://canyouseeme.org/

[注意:除非 MOSQUITTO BROKER 正在运行,否则您不会获得OPEN状态]

第 7 步:如果从 Internet 进入时端口显示已关闭(即不是本地主机)

这就是我被绊倒的地方。就我而言,我有一个 Verizon 调制解调器,它也有防火墙(因为它有一个路由器)。我有自己的无线路由器,一个 tp-link Archer C1200,已插入 Fios 调制解调器/路由器。我首先将端口转发放在 tp-link 中。但是那个防火墙在 Fios 防火墙之后,所以我需要去第一堵墙并在那里做端口转发。

这是第二个棘手的问题。所有在线指南都说我应该将端口 1883 转发到我的 Linux 服务器的本地 IP 地址,在我的例子中是 192.168.0.144。但这在我的情况下是不正确的。Archer C1200 实际上是我需要转发到的设备——它从那里处理正确的分发。它从 Verizon 路由器分配了一个地址 192.168.0.152。我仍然有两个转发(即 Fios 和 tp-link),我的猜测是我需要它们。

现在所有路径都已打开,您可以按照其他 Mosquitto 说明进行有关日志记录、配置文件、守护程序等的操作。

希望这可以节省一些时间!


推荐阅读