【问题标题】:Cannot get Mosquitto to Allow Connection from Outside Local Network无法让 Mosquitto 允许来自外部本地网络的连接
【发布时间】:2019-07-19 13:16:53
【问题描述】:

我有 Linux Ubuntu 18.04 笔记本电脑,并在那里安装了 Mosquitto MQTT 代理。在我的 Windows 10 笔记本电脑上,我正在运行使用 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 手机上,一个是 Windows 商店提供的应用程序,我也无法连接其中任何一个。 Android手机根本无法连接(它不在同一个网络上,因此不能选择本地主机),其他应用程序将在本地连接,但当我更改为互联网地址时不会。

我感觉我只是错过了一件小事,但我不知道它是什么。还有其他 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

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

【问题讨论】:

  • 您是否尝试通过本地 IP 地址访问您的 mqtt 服务器?你也可以发布你的 mosquitto.conf 文件吗
  • @SantoshBalaji:是的,正如我上面所说,我可以通过localhost(即本地IP地址)访问它。
  • 可以在这里发布 mosquitto.conf 文件。您的路由器显示的互联网 IP 地址是否与 whatsmyip 网站中显示的 IP 地址相同?
  • @SantoshBalaji:我编辑了显示配置文件的问题。这只是默认设置。我的路由器没有显示我可以在任何菜单中看到的互联网地址。

标签: c# tcp mqtt mosquitto


【解决方案1】:

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

在 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/

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

第 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 的其他说明进行有关日志记录、配置文件、守护程序等的操作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多