![Mosquito 服务器拒绝连接 Ubuntu 18.04](https://linux22.com/image/1164308/Mosquito%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8B%92%E7%BB%9D%E8%BF%9E%E6%8E%A5%20Ubuntu%2018.04.png)
这是一个相当狭窄的问题,但我希望 Ubuntu 小组能提供帮助。我在 SO 上问过,但我相当确定我收到的错误是由于 Ubuntu 中缺少设置或我的路由器端口存在问题。我不知道如何调试它。
我在 Ubuntu 18.04 系统上安装了 Mosquitto。它默认在端口 1883 上运行。您可以在命令行或配置文件中指定确切的端口。我尝试了许多变体:
我通过 ufw 在防火墙中打开了端口 1883。这似乎是正确的:
mark_admin:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
1883 ALLOW Anywhere
5900 ALLOW Anywhere
1883 (v6) ALLOW Anywhere (v6)
5900 (v6) ALLOW Anywhere (v6)
我可以从本地网络上的另一台计算机连接到它。但是当我尝试使用该计算机的实际 IP 地址从“外部世界”打开连接时,我收到“无法建立连接,因为目标计算机主动拒绝”错误。
编辑:已解决。我在错误的路由器上进行了端口转发。
答案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 服务 mosquitto 停止]
步骤 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/
[注意:你不会得到打开状态除非蚊子经纪人正在运行]
步骤 7:如果从互联网(即非本地主机)进入时端口显示已关闭
这就是我被绊倒的地方。就我而言,我有一个 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 说明进行操作。
希望这可以为某些人节省一些时间!
答案2
我假设您的服务器可以访问互联网。
如果您可以访问本地网络上的端口,那么问题肯定出在端口转发上。
首先,您的服务器机器在网络内部是否有静态 IP 地址?如果没有,我强烈建议先修复它。原因是当您设置端口转发时,它会想知道要转发到哪个内部(192.168.0.x 范围)地址。但如果您的服务器是动态的(使用 DHCP),那么它会偶尔移动,每次移动都会破坏端口转发。
其次,查看您的端口转发设置截图,大部分都很好,除了 192.168.0.144,这与问题评论中列出的 192.168.0.155 不同。请确保修复该问题。
第三,您在哪里测试使用外部地址 (96.221.154.134) 进行连接?如果是在同一个路由器后面,除非您的路由器支持“发夹式 NAT”(大多数消费级路由器不支持),否则它将无法工作。但它对“互联网上”的其他人(即,不在同一路由器后面的人)有效。因此,它可能全部正常工作,只是您的测试方式可能存在问题。显然,如果您在同一个路由器后面,您应该只使用内部地址而不是公共地址(如果可能,即,无论您在哪个路由器后面,您都不会使用以相同地址应答的 DNS 名称)。
第四,如果您有多个路由器,并具有多层 NAT,则整个“设置静态内部 IP 并将端口转发到该 IP”适用于每个路由器。因此,如果您有两个路由器 A 和 B,B 位于 A 后面,A 连接到您的 ISP,则需要将路由器 B 设置为在其 WAN/上游连接(即路由器 A 的“LAN”网络)上具有静态 IP 地址。然后在路由器 A 上,您需要设置端口转发到路由器 B 的地址。然后对路由器 B 重复该过程:在服务器上设置静态 IP 地址,然后在路由器 B 上将端口转发到服务器的静态 IP。
PS:不是NAT 和端口转发的乐趣?(这是讽刺)。您可能会询问您的 ISP 是否有可用的 IPv6,这是无需处理端口转发或 NAT 的长期解决方案。大多数 ISP 实施 IPv6 的速度都很慢;主要是因为很少有客户了解 IPv6 会让这一切变得更容易(一旦我们让每个人都使用 IPv6)。