Mosquitto配置不接受包含IP地址的侦听器

时间:2019-12-07 13:54:41

标签: mqtt mosquitto

我让Mosquitto运行在本地服务器上,我的目标是拥有3个侦听器:

  1. 所有本地网络客户端在端口1883上不使用TLS进行连接(端口1883被路由器关闭,对公众开放)
  2. 外部客户端在端口8883上使用TLS连接
  3. 外部客户端在端口8880上不使用TLS进行连接

使用此配置的效果很好;

# Local MQTT
listener 1883
# End Local MQTT

# Insecure MQTT
listener 8880
# End Insecure MQTT

# Secure MQTT
listener 8883
## This is standard and should always be this
cafile   /etc/ssl/certs/DST_Root_CA_X3.pem
## These are from your installation of LE
certfile /home/pi/.node-red/certs/fullchain.pem
keyfile  /home/pi/.node-red/certs/privkey.pem
## Force all clients in this listener to provide a valid certificate, change th$
require_certificate true
## Stop all unauthorised connections
allow_anonymous false
## Use password file
password_file /etc/mosquitto/passwordfile

并导致健康的Mosquitto日志条目;

1575720819: Opening ipv4 listen socket on port 1883.
1575720819: Opening ipv6 listen socket on port 1883.
1575720819: Opening ipv4 listen socket on port 8883.
1575720819: Opening ipv6 listen socket on port 8883.
1575720819: Opening ipv4 listen socket on port 8880.
1575720819: Opening ipv6 listen socket on port 8880.
1575720820: New connection from 140.238.70.128 on port 8880.
1575719390: New client connected from 140.238.70.128 as telegraf (c1, k60, u'raspPi').

但是... 我想确保只有140.238.70.128上的客户端才能在端口8880上连接(不选择TLS),所以我将IP地址添加到了配置;

# Insecure MQTT
listener 8880 140.238.70.128
# End Insecure MQTT

但这会导致蚊子停止运动,并显示日志;

1575720699: Opening ipv4 listen socket on port 1883.
1575720699: Opening ipv6 listen socket on port 1883.
1575720699: Opening ipv4 listen socket on port 8883.
1575720699: Opening ipv6 listen socket on port 8883.
1575720699: Opening ipv4 listen socket on port 8880.
1575720699: Error: Cannot assign requested address

对于任何无法解决问题的建议或替代解决方案,我将不胜感激。

编辑。我还尝试将侦听器限制为ipv4,但结果完全相同;

# Insecure MQTT
listener 8880 140.238.70.128
socket_domain ipv4
# End Insecure MQTT

1 个答案:

答案 0 :(得分:1)

listen伪指令只能采用运行代理的计算机本地的地址。这用于将套接字绑定到所需端口上的该地址。

您不能将其用作远程计算机的筛选器,实际上,无法将端口配置为仅接受来自mosquitto * (或任何其他代理)中特定IP地址的连接。我知道)。

实现您要执行的操作的唯一方法是使用计算机防火墙丢弃发往该端口的其他IP地址中的任何数据包。您可以使用iptables执行此操作。像

iptables -A INPUT -p tcp --dport 8880 ! -s 140.238.70.129 DROP

这应该删除发自端口140.238.70.129的,发往端口8880的所有TCP数据包

虽然这将起作用,但它只会阻止ipv4客户端,因此,如果您的网络具有正确路由的IPv6设置,则您还需要使用ip6tables阻止访问(并阻止对端口1883的访问)。

* 可能可以编写自定义身份验证插件来执行此操作,但是我不确定在有关以下内容的详细信息中是否获得了远程IP地址用户连接。另外,我认为您不能将身份验证仅绑定到一个侦听器。