引言
mosquitto常用命令以及配置。
服务启动命令
-
-c
或--config-file
: 使用此选项加载配置文件。如果不指定,mosquitto broker将默认监听1883端口,并且只绑定到本地回环接口(loopback interface),同时采用mosquitto.conf(5)
中描述的默认设置。注意在2.0版本及以上,如果同时使用了-p
选项和配置文件中定义的监听器,命令行中的-p
选项将会被忽略。 -
-d
或--daemon
: 以守护进程模式运行mosquitto。这意味着mosquitto将在后台作为服务运行,不影响终端操作。除了运行方式变为后台外,其他行为保持不变。 -
-p
或--port
: 指定broker监听的端口号。该选项可以最多指定10次,以便于打开多个监听不同端口的套接字。对于1.6.x及更早版本,使用-p
(或默认的1883端口)会绑定到所有网络接口,允许任何网络的连接。但是从2.0版本开始,通过-p
选项指定的监听器仅绑定到本地回环接口,因此只能从本地机器连接。若同时使用-p
和配置文件中定义的监听器,命令行中的-p
选项将被忽略。 -
-v
或--verbose
: 使用详细日志记录。这相当于在配置文件中设置了log_type
为all
,启用所有类型的日志输出。启用此选项后,它将覆盖配置文件中设定的所有日志级别选项,确保mosquitto以最详细的日志级别运行,有助于调试和监控broker状态。 -
SIGHUP(挂起)信号 你可以通过执行以下命令向Mosquitto服务发送SIGHUP信号:
kill -HUP <mosquitto_process_id>
其中
<mosquitto_process_id>
是运行中的Mosquitto服务器进程ID。当Mosquitto接收到SIGHUP信号时,如果启动时使用了
-c
参数指定了配置文件,则会尝试重新加载该配置文件的数据。
配置文件
基本配置
listener 11883 0.0.0.0
allow_anonymous true
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /tmp
log_dest file /tmp/mosquitto.log
include_dir /mnt/mosquitto/etc/mosquitto/conf.d
但是这里面很多都可以不需要,能跑起来就可以。
鉴权配置
总共有三种配置可以进行相关的验证登录,下述分别阐述。
插件配置
在使用MQTT Broker Mosquitto时,为了实现更精细、更具控制力的用户认证管理,除了基本的密码文件方式外,还可以利用各类认证插件来满足需求。不同插件提供的功能各异,具体取决于所选用的插件类型。
配置认证插件
配置认证插件的过程会因插件支持的Mosquitto插件接口版本而异,主要分为针对2.0及以上版本和1.6.x及更低版本的两种情况。
对于 1.6.x及以下版本 的Mosquitto,通过 auth_plugin
选项来配置插件:
listener 1883
auth_plugin <path to plugin>
其中 <path to plugin>
需要替换为认证插件的实际路径。某些插件可能需要额外的配置参数,详细信息请参阅对应插件的官方文档。
而对于 2.0及以上版本 的Mosquitto,采用 plugin
选项进行配置:
listener 1883
plugin <path to plugin>
同样将 <path to plugin>
替换为实际的插件路径。
可用的认证插件
-
动态安全(Dynamic security):专为Mosquitto 2.0及以上版本设计,由Mosquitto项目直接提供。此插件提供了灵活的内置客户端、群组和角色管理功能,并支持远程管理,极大地提升了安全性与便捷性。
-
mosquitto-go-auth:这款插件支持多种后端存储用户数据的方式,包括MySQL数据库、JWT令牌验证或Redis数据库等。这使得开发者可以根据项目的实际情况选择合适的认证数据存储方案,增强了认证机制的扩展性和灵活性。
这个有兴趣的可以自己尝试以下,我试了一下发现动态库mosquitto_dynamic_security.so加载失败了,所以没能进行下去,应该是交叉编译的时候没有把openssl放入其中。
无密码配置
为了在MQTT Broker Mosquitto中实现无认证(匿名)访问,我们可以使用allow_anonymous
选项进行设置。下面是如何配置匿名访问的具体步骤:
listener 1883
allow_anonymous true
在这段配置中,我们为监听在1883端口的Broker启用了匿名访问权限。这意味着任何连接到此端口的客户端无需提供用户名和密码即可进行通信。
值得注意的是,在同一台MQTT Broker上同时允许匿名访问和经过身份验证的访问是完全可行的。特别是对于动态安全插件而言,它支持对匿名用户和已认证用户提供不同的权限设定,这在某些场景下非常实用。
密码文件配置
密码文件是存储用户名和密码的一种简单机制,特别适用于拥有少量且相对固定用户的场景。通过将用户名与加密后的密码记录在一个单独的文件中,可以方便地对MQTT Broker进行用户身份验证。
更新密码文件 当您对密码文件进行更改时,需要向Broker发送SIGHUP信号以触发其重新加载文件内容:
kill -HUP <mosquitto进程ID>
创建密码文件 利用mosquitto_passwd
工具可以创建并填充密码文件。若要新建一个密码文件并添加用户,请执行以下命令,系统会提示您输入密码。注意,这里的-c
选项表示如果文件已存在则会被覆盖:
mosquitto_passwd -c <密码文件路径> <用户名>
若要向已存在的密码文件中添加更多用户或修改现有用户的密码,只需省略 -c
参数:
mosquitto_passwd <密码文件路径> <用户名>
从密码文件中移除用户 如需从密码文件中删除某个用户,请使用以下命令:
mosquitto_passwd -D <密码文件路径> <用户名>
另外,您也可以在单行命令中添加/更新用户名及其密码,但请注意,这种方式会导致密码明文出现在命令行及命令历史记录中:
mosquitto_passwd <密码文件路径> <用户名> <密码>
配置Broker 开始使用密码文件之前,您需要在Broker的配置文件中添加password_file
选项,并指向您的密码文件位置:
password_file <密码文件路径>
确保运行Mosquitto服务的用户有权限读取该密码文件。在Linux/POSIX系统上,通常这个用户是mosquitto
,而 /etc/mosquitto/password_file
是存放此文件的一个常见路径。
针对不同监听器设置独立的安全设置 如果您启用了per_listener_settings true
选项,以便为每个监听器设置不同的安全参数,则必须在相关监听器配置之后指定相应的密码文件:
listener 1883
password_file /etc/mosquitto/password_file
这样,连接到1883端口的客户端就需要通过密码文件中的凭证进行身份验证。
验证配置简单举例
在配置文件中同时配置无密码和密码文件配置,配置如下:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
listener 1883 0.0.0.0
user root
password_file /mnt/mosquitto/etc/passwd
allow_anonymous true
其中/mnt/mosquitto/etc/passwd是使用mosquitto_passwd命令生成的密码文件:
./mosquitto_passwd -c /mnt/mosquitto/etc/passwd admin
输入此命令后会提示输入admin用户的密码,然后就会在目录下生成密码文件。
之后启动服务:
./mosquitto -c /mnt/mosquitto/etc/mosquitto/mosquitto.conf
无密码登录成功:
密码验证登录:
./mosquitto_sub -v -t /test -p 1883 -u admin -P admin
./mosquitto_sub -v -t /test -u
连接数目
max_connections count
权限配置
权限配置文件
# 打开配置
vim /mosquitto/aclfile
# 李雷只能发布以test为前缀的主题,订阅以$SYS开头的主题即系统主题
user lilei
topic write test/#
topic read $SYS/#
# 韩梅梅只能订阅以test为前缀的主题
user hanmeimei
topic read test/#
然后在配置文件中配置权限配置文件的路径:
acl_file file_path
这个配置可以连接成功,但是无法成功的订阅以及发布。