无法让 Mosquitto 允许从外部本地网络连接

Cannot get Mosquitto to Allow Connection from Outside Local Network

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

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

但是当我尝试通过互联网地址连接时,我总是得到 uPLibrary.Networking。M2Mqtt.Exceptions.MqttConnectionException: “无法建立连接,因为目标机器主动 拒绝它 95.XXX.XXX.134:1883" 错误。(那里的地址是我通过 "WhatsmyIP" 得到的地址)

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

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

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

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

监听器 1883 0.0.0.0

监听器 1883 192.168.0.144

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

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

我觉得我只是遗漏了一件小事,但我不知道是什么。还有其他显示相同错误的 Whosebug 问题,但它们对我没有帮助。

如果重要的话,运行 的实际 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

和上面的none。只是留空。 None 他们工作了。

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

在 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 尚未 运行ning

pgrep mosquitto

[注意,如果显示任何数字,那是已经 运行ning 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/

[注意:您不会得到 OPEN 状态 除非 MOSQUITTO 经纪人是 运行 ]

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

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

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

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

希望这能为大家节省一些时间!