我正在尝试使用 python 创建 mqtt 连接。重现问题的最短代码是
import paho.mqtt.client as paho
client = paho.Client('myClient')
client.username_pw_set('user', 'password')
client.connect('my.broker.com')
在我得到的最后一行
ConnectionRefusedError: [Errno 111] Connection refused
有趣的是,服务器没有拒绝连接。connect()
有日志记录,并且似乎在实际请求之前连接被拒绝。
我在 Windows 机器上尝试了该脚本,它在 Ubuntu 上运行得很好,但我需要在 Fedora 37(拒绝连接)的机器上运行它。我相信存在一些配置错误,但我有基本的 Linux 知识,并且不知道在哪里可以找到它。我不知道这两个 Linux 的当前状态,它们可能以某种方式设置,但 Windows 机器有很好的默认设置。我用谷歌搜索并看到了一些建议,例如:
- 运行本地 mqtt 代理(不适合我,因为我必须连接到远程代理)
- 检查防火墙规则(我相信网络中没有防火墙,因为其他机器可以连接到代理)
- 检查iptables(没有显示过滤规则)
对于我还可以检查哪些内容,还有什么建议吗?对于套接字创建是否有特定于 Fedora 或 Linux 范围的限制?
答案1
Unix 范围内:
通常只有 root 可以使用编号为 1023 或更少的端口,但由于 MQTT 默认端口号是 1883,所以这应该不是问题。
Fedora 特定:
Fedora 默认使用 SELinux,但这不应以此处适用的方式限制普通用户的交互会话。但是,如果您通过某些服务运行脚本(例如作为网络服务器 CGI 脚本或其他脚本),则可能会阻止您的脚本打开传出网络连接,除非将 SELinux 配置为允许这样做。
基本连接测试:
如果您安装了telnet
netcat ( nc
),请使用以下命令测试连接:
telnet my.broker.com 1883
或者
nc -v my.broker.com 1883
分别。
如果您已经traceroute
安装,请运行传输控制协议跟踪路由在您的应用程序需要的特定端口上(1883 是没有 SSL/TLS 的 MQTT 的默认值):
sudo traceroute -T -p 1883 my.broker.com
如果可以成功建立与代理的基本 TCP 连接,telnet
和nc
都会明确告诉您这一点。
如果网络上的某些东西正在丢弃连接尝试,traceroute -T
应该可以帮助您识别该东西。