我已按照说明在 CentOS 7 上配置 Mosquitto,由数字海洋提供。我相信我已经正确设置了大部分内容,我能够按照所有说明进行深入研究,找到一些已弃用的说明的解决方案。但是,当我登录到我的服务器时,我能够订阅并向主题发布消息。
但是,我想从与服务器地址不同的客户端访问我自己的 MQTT 代理(呃)。无论我怎么尝试,我都无法连接 - 我觉得连接尝试无法到达我的代理(无论是使用在线查看器还是https://hobbyquaker.github.io/mqtt-admin/以及本地安装的MQTT 探索器)。
我的 mosquitto.conf 非常简单,我进一步简化了它以允许匿名连接,但是对于端口 8083 上的 Web 套接字和端口 8883 上的(默认?)mqqt 都使用 TLS。
完整的 mosquitto.conf 文件(根据 Halfgaar 的反应更新):
allow_anonymous true
#password_file /etc/mosquitto/passwd (I have disabled this to simplify my connection attempt)
log_dest file /var/log/mosquitto.log
log_type all
listener 1883 localhost
listener 8883 0.0.0.0
protocol mqtt # newly added, but still doesn't seem to do anything
certfile /etc/letsencrypt/live/iot.mydomain.com/cert.pem
cafile /etc/letsencrypt/live/iot.mydomain.com/chain.pem
keyfile /etc/letsencrypt/live/iot.mydomain.com/privkey.pem
listener 8083 0.0.0.0
protocol websockets
certfile /etc/letsencrypt/live/iot.mydomain.com/cert.pem
cafile /etc/letsencrypt/live/iot.mydomain.com/chain.pem
keyfile /etc/letsencrypt/live/iot.mydomain.com/privkey.pem
后来我认为默认的 Mosquitto.conf 文件包含更多设置,并在我的配置文件中复制了一份默认设置的新副本,并在文件末尾添加了上述配置。所以现在我有一个带有上述覆盖的默认配置。重新启动 mosquitto 服务成功了。
然后我想这可能和防火墙有关。我检查了端口 1883、8883 和 8083 是否打开firewall-cmd --zone=public --permanent --list-ports
,发现部分输出确实报告了8883/tcp 8083/tcp 1883/tcp
。
指定的日志文件不包含任何尝试连接的信息,所以我对此一无所知。有人能给我指明方向,找到更多线索来解决这个问题吗?
更新根据@Halfgaar 的反应:我更新了配置,绑定到公共地址(我只是重复他说的话,我一点头绪都没有),运行时netstat -n -l -t -p
输出如下。尽管我无法从我的笔记本电脑(或任何其他地方)连接到代理。
# netstat -n -l -t -p | grep mosquitto
tcp 0 0 0.0.0.0:8883 0.0.0.0:* LISTEN 2573/mosquitto
tcp 0 0 127.0.0.1:1883 0.0.0.0:* LISTEN 2573/mosquitto
tcp6 0 0 :::8083 :::* LISTEN 2573/mosquitto
tcp6 0 0 ::1:1883 :::* LISTEN 2573/mosquitto
更新我也偶然发现了防火墙规则这让我思考我是否能够使用 mqtt 协议连接,因此我也执行firewall-cmd --zone=public --permanent --add-service=mqtt
并重新加载了防火墙。
进展不大我已经从出现错误前进Disconnected from server
到connect ETIMEDOUT 1.2.3.4:8883
(其中 1.2.3.4 是我的服务器的 IP)。不确定这对进度意味着什么,但我现在和之前的位置不同...
更新的输出iptables -L INPUT -n
如下:
# iptables -L INPUT -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
解决了 看来我的 VPS 上还有另一个(软件)防火墙,我也必须配置它。当我也打开该防火墙上的端口时,我就可以登录了。
答案1
您没有绑定到公共网络接口。如果绑定了,netstat -n -l -t -p
您可以看到进程正在监听哪些地址。
做:
listener 1883 0.0.0.0
listener 8883 0.0.0.0
certfile /etc/letsencrypt/live/iot.mydomain.com/cert.pem
cafile /etc/letsencrypt/live/iot.mydomain.com/chain.pem
keyfile /etc/letsencrypt/live/iot.mydomain.com/privkey.pem
listener 8083 0.0.0.0
protocol websockets
certfile /etc/letsencrypt/live/iot.mydomain.com/cert.pem
cafile /etc/letsencrypt/live/iot.mydomain.com/chain.pem
keyfile /etc/letsencrypt/live/iot.mydomain.com/privkey.pem
答案2
我要感谢@Halfgaar 的帮助,并试图帮助我解决问题。同时,我还联系了我的 VPS 托管提供商的支持。问题与防火墙有关,但不是我们正在探索的防火墙。还有一个软件防火墙,我也必须打开那里的端口(当然)。我不知道我的 VPS 上还有另一个防火墙处于活动状态。我现在可以登录我的经纪人了!