Mosquitto 配置不接受包含 IP 地址的侦听器
Mosquitto configuration not accepting listener containing IP address
我在本地服务器上安装了 Mosquitto 运行,我的目标是拥有 3 个侦听器:
- 所有本地网络客户端无需 TLS 连接到端口 1883(端口 1883 被路由器关闭到 public)
- 外部客户端在端口 8883 上使用 TLS 进行连接
- 外部客户端在端口 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
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 的访问)。
* 你 可能 可以编写自定义身份验证插件来执行此操作,但我不确定你是否得到有关用户连接的详细信息中的远程 IP 地址。另外,我认为您不能将身份验证绑定到一个侦听器。
我在本地服务器上安装了 Mosquitto 运行,我的目标是拥有 3 个侦听器:
- 所有本地网络客户端无需 TLS 连接到端口 1883(端口 1883 被路由器关闭到 public)
- 外部客户端在端口 8883 上使用 TLS 进行连接
- 外部客户端在端口 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
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 的访问)。
* 你 可能 可以编写自定义身份验证插件来执行此操作,但我不确定你是否得到有关用户连接的详细信息中的远程 IP 地址。另外,我认为您不能将身份验证绑定到一个侦听器。