mqtt经纪人 - aclfile

时间:2018-01-26 21:28:12

标签: debian mqtt mosquitto broker

我在Debian 9上安装了mosquitto

apt-get install mosquitto mosquitto-clients

做了重新开始     服务蚊子重启

测试了它

mosquitto_pub -d -t My/Topic2 -m "Hello MQTT"

没有错误消息

创建了密码

mosquitto_passwd -c /etc/mosquitto/passwd myUsername

创建了一个aclfile

touch /etc/mosquitto/aclfile
nano /etc/mosquitto/aclfile

有了这个内容:

# This affects access control for clients with no username.
topic read myTopic/#

# This only affects clients with username "myUsername".
user myUsername
topic myTopic/#

# This affects all clients.
pattern write $SYS/broker/connection/%c/state

将acl_file的路径插入此文件

nano /etc/mosquitto/mosquitto.conf

acl_file /etc/mosquitto/aclfile
password_file /etc/mosquitto/passwd

所以计划是用户“myUsername”可以在“myTopic”中发布,而包括访客在内的所有其他用户只能阅读。

我已经在其他服务器上运行了此配置,但在这种情况下出现了问题 我第一次测试时忘了将password_file路径添加到mosquitto.conf中 并得到错误:连接被拒绝,如果我想这样发布 如果我只想订阅

好的我解决了这个问题,但现在我可以在没有用户名/密码的情况下发布

和corse我做了重启:

service mosquitto restart

所以,如果我发送

mosquitto_pub -d -t myTopic/test -m "Access denied is expected"

我没有得到错误,看起来像是发布了消息

如果我打开第二个shell(也来自远程机器) 我可以订阅

mosquitto_sub -d -t myTopic/test

但是如果我在这个主题上发布了一些内容,那么就没有收到任何内容(Ping正在运行)

我的2个问题的任何想法?

PS:我不是Linux专业人士 所以,如果您想了解更多信息,请向我提供如何获取此信息的正确信息

编辑:如果我使用

ps -efc 

这是mosquitto的唯一条目

mosquit+ 736 1 TS 19 21:36 ? 00:00:02 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

在日志中

nano /var/log/mosquitto/mosquitto.log

我得到了

ACL denying access to client with dangerous client id "mosqpub/7977-Debian-93-"
ACL denying access to client with dangerous client id "mosqpub/356-h2700629"

但是关于谷歌,这应该已经在去年修复了

我正在使用mosquitto版本1.4.10

2 个答案:

答案 0 :(得分:0)

如果不允许用户发布主题,则发布将无声地失败。这是为MQTT设计的(至少在MQTT v3.x上)。

如果您想阻止未传递用户名/密码的客户端,您可能还需要添加allow_anonymous false

要获取最新版本的mosquitto,请按照https://mosquitto.org/download/上的说明安装正确的ppa

答案 1 :(得分:0)

遇到同样的问题,发现是关于用户名/客户端 ID 中的 /。来自https://github.com/eclipse/mosquitto/blob/5c45bc4e8407d94d29b39152b580d2b4cc8082e9/src/security.c#L609-L610

/* Check whether the client id or username contains a +, # or / and if
 * so deny access.

删除“/”使其再次工作。