好吧,过去几天这件事一直困扰着我。
信息
我已在 Ubuntu Server 14.4 上安装并运行启用了 WebSockets 的 Mosquitto MQTT 1.4.10。我的 LAN 上的任何客户端都可以使用端口 1883 (mqtt) 和 9001 (websockets) 连接到代理,一切正常。现在,我还有一个公共 IP 地址,并在我的 DD-WRT 路由器上设置了端口转发,以将 1883 和 9001 路由到服务器的地址。我已禁用防火墙 (sudo ufw 禁用) 并确认它已被禁用。
问题
- 我将运行 OwnTracks 的手机连接到本地 WiFi。我输入 MQTT 服务器 IP 和端口 1883,它就可以正常工作。我输入公共 IP 和端口 1883,它就可以正常工作。然后我断开与本地 WiFi 的连接,这样我就只能使用我的蜂窝网络了。我尝试使用我的公共 IP 和端口 1883 再次连接,但它不起作用。
检查日志后我发现:
New connection from <<external_ip>> on port 1883
Socket error on client <unknown>, disconnecting
检查我的配置文件,一切看起来都很好:
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
include_dir /etc/mosquitto/conf.d
listener 1883
protocol mqtt
listener 9001 127.0.0.1
protocol websockets
检查以确保 Ubuntu 正在监听指定的端口:
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2216 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN
tcp6 0 0 :::1883 :::* LISTEN
tcp6 0 0 :::2216 :::* LISTEN
最后让我困惑的是,我可以使用任何连接到我的 LAN 或 WAN 的客户端的 Web 套接字连接到 9001。我认为绑定到本地环回地址将允许它仅接受来自其自身的连接。
关于如何让 1883 接受来自我的 LAN 之外的客户端,有什么想法吗?