【问题标题】:Mosquitto configuration not accepting listener containing IP addressMosquitto 配置不接受包含 IP 地址的侦听器
【发布时间】:2019-12-07 13:54:41
【问题描述】:

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

  1. 所有本地网络客户端在端口 1883 上无需 TLS 连接(端口 1883 已被路由器对公共关闭)
  2. 外部客户端使用 TLS 连接端口 8883
  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

但这会导致 Mosquitto 停止,并且日志显示;

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

【问题讨论】:

    标签: mqtt mosquitto


    【解决方案1】:

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

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

    实现您想要做的唯一方法是使用计算机防火墙丢弃来自其他 IP 地址发送到该端口的任何数据包。您可以使用 iptables 来执行此操作。类似的东西

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

    这应该丢弃任何发往端口 8880 且不是来自 140.238.70.129 的 TCP 数据包

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

    *可能能够编写自定义身份验证插件来执行此操作,但我不确定您是否在有关用户连接。另外,我认为您不能只将身份验证绑定到一个侦听器。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2015-06-30
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多