c# - 无法让 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 地址。
然后我去我的Linux机器并使用ufw启用端口1833并启用防火墙
从那里我已经尝试了我能想到的一切——我已经使用在命令行中声明的端口运行 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
以上都不是。只好留空了。他们都没有工作。
解决方案
我将其发布为答案,因此我可以提供更多详细信息,以防将来有人偶然发现此问题。
在 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 说明进行有关日志记录、配置文件、守护程序等的操作。
希望这可以节省一些时间!
推荐阅读
- android - 无法从 java.util.ArrayList 转换表达式数据的类型
到 java.util.ArrayList - java - 具有 root 凭据的 Java 进程 sh 命令
- c - 宏中的参数数量
- ios - 如何快速获取firebase上图像的下载网址?
- reactjs - 我可以在 react js 中打印表单或表格数据吗?
- c++ - 将指针char数组除以其他数组
- c# - C# .NET - 添加 DLL 作为参考不起作用
- scala - Scala Spark 组根据值更改
- c++ - C++ Map使用非默认构造函数初始化对象
- c# - PopupNotifier 在计时器类中不起作用