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

问题描述 投票:0回答:1

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

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

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

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

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

TPLINK Screenshot

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

Linux Screenshot

从那里我已经尝试了我能想到的一切 - 我用命令行声明的端口运行Mosquitto,我已经改变了conf文件说:

听众1883 0.0.0.0

听众1883 192.168.0.144

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

我下载了两个不同的实用程序 - 一个在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# tcp mqtt mosquitto
1个回答
0
投票

我发布这个作为答案,所以我可以提供更多的细节,以防万一有人在将来偶然发现。

在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步:使用Web工具检查连接

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

[注意:除非MOSQUITTO经纪人正在运行,否则你不会获得开放状态]

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

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

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

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

希望这可以节省一些人在路上!

© www.soinside.com 2019 - 2024. All rights reserved.