
物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载本文以 Eclipse Mosquitto 1.5.5 官方发布公告version-155-released.md为主体逐条解读该 bugfix security 版本在安全、Broker、客户端库、命令行工具与构建系统五个方面的变更并结合当前仓库源码src/、lib/、client/与示例配置mosquitto.conf说明每项改动的实际影响与配置方法。读完本文你将理解per_listener_settings与acl_file的安全交互细节、掌握新增的socket_domain监听器选项、了解connection_messages的日志开关语义并弄清客户端重连退避backoff的计算逻辑。版本概览一次以修复为主的发布Mosquitto 1.5.5 发布于 2018 年 12 月性质是bugfix and security release缺陷修复与安全修复版本即不引入破坏性功能变更重点解决自 1.5.x 系列以来暴露的问题。官方公告原文对本版本的定位是This is a bugfix and security release.本次变更共涉及五大板块Security修复per_listener_settings下默认监听器忽略acl_file的问题并登记为 CVE-2018-20145Broker新增socket_domain监听器选项、修复 bridge 初始连接不发送 retained 消息、调整auth_opt_重载行为、统一连接/断开日志开关Librarylibmosquitto修复重连延迟退避行为、避免 keepalive 失败时重复回调on_disconnect()Clientmosquitto_sub十六进制输出补全前导零Build修复未启用 TLS-PSK 时的编译问题。下文将按公告顺序逐条结合源码展开。SecurityCVE-2018-20145 与 per_listener_settings 的 acl_file 缺陷缺陷背景Mosquitto 允许为不同监听器listener选项定义的端口/IP设置彼此独立的 ACL 文件。是否启用这种每监听器独立安全配置由per_listener_settings开关控制其默认值为false见 src/conf.c 初始化逻辑。官方公告描述的问题如下Ifper_listener_settingsis set to true, then theacl_filesetting was ignored for the default listener only. This has been fixed. This does not affect any listeners defined with thelisteneroption.即当per_listener_settings true时默认监听器即未通过listener选项显式声明、直接使用port等全局配置的监听器上配置的acl_file会被静默忽略导致本应受 ACL 约束的默认监听器实际不受任何访问控制。该问题被跟踪为 CVE-2018-20145属于安全配置失效类缺陷。需要强调的是显式用listener关键字定义的监听器不受此问题影响。源码层面的证据从当前仓库源码可以确认 ACL 文件的两条加载路径确实存在分支差异当per_listener_settings为true时ACL 解析循环遍历所有显式监听器db.config-listeners[i].security_options-acl_file逐一调用aclfile__parse()见 src/security_default.c当per_listener_settings为false时则使用全局db.config-security_options.acl_file解析一次见 src/security_default.c。acl_file的解析入口本身在 src/conf.c配置值写入当前安全选项结构体。1.5.5 的修复正是补齐了per_listener_settings模式下默认监听器安全选项config-security_options与显式监听器分离中acl_file的加载。配置示例与自查方法典型的受影响配置形如per_listener_settings true port 1883 acl_file /etc/mosquitto/acl/global.acl而正确的写法是若希望默认监听器也使用 ACL应当像显式监听器一样声明其安全配置若所有监听器共用同一套 ACL则应保持per_listener_settings false并在全局位置设置acl_file关于acl_file的完整语法说明见 mosquitto.conf支持user、topic、pattern三种规则。升级到 1.5.5 后可通过 mosquitto 启动日志中是否出现Error opening acl file及 ACL 校验行为变化来验证修复生效同时建议在配置了per_listener_settings true的环境中对每个监听器单独验证 ACL 是否按预期拦截。Broker新增 socket_domain 选项精确控制监听地址族动机libwebsockets 的 IPv6 局限1.5.5 为监听器新增了socket_domain配置选项官方公告说明其动机Addsocket_domainoption to allow listeners to disable IPv6 support. This is required to work around a problem in libwebsockets that means sockets only listen on IPv6 by default if IPv6 support is compiled in.即编译启用了 IPv6 的 libwebsockets 在默认情况下会只创建 IPv6 监听套接字若系统没有可用的 IPv6 地址则监听失败。socket_domain让用户可以把 WebSocket 监听器强制限定为 IPv4 或 IPv6从而规避该库的地址族选择问题。配置语法在mosquitto.conf中该选项隶属于监听器区块取值如下说明见 mosquitto.conf# 默认行为不设置 socket_domain监听器尝试在所有受支持的 IP 协议版本上监听 # socket_domain ipv4 # 强制仅使用 IPv4 # socket_domain ipv6 # 强制仅使用 IPv6官方配置文件注释特别提醒若希望同时支持 IPv4 与 IPv6则不要使用socket_domain选项。底层实现从源码可以确认该选项的实现路径解析逻辑位于 src/conf.c将字符串ipv4映射为AF_INET、ipv6映射为AF_INET6其他取值会打印Error: Invalid socket_domain value并拒绝启动同时该选项不支持热重载if(reload) continue;修改后需重启 broker 生效值保存在监听器结构体struct mosquitto__listener的int socket_domain字段见 src/mosquitto_broker_internal.hTCP 监听创建时src/net.c 会将该值写入getaddrinfo的hints.ai_family有设置则使用指定地址族未设置则为AF_UNSPEC由系统决定WebSocket 监听创建时src/websockets.c 在socket_domain AF_INET时向 libwebsockets 传递LWS_SERVER_OPTION_DISABLE_IPV6标志直接禁用 IPv6正是为规避上述库缺陷而设计的联动。典型应用场景主机只有 IPv4 地址、又需要提供 WebSocket 监听时socket_domain ipv4需要让监听器严格绑定在 IPv6 环境时socket_domain ipv6混用场景下可对不同listener区块分别设置实现一个 broker 同时提供纯 IPv4 与纯 IPv6 入口。Brokerbridge 保留消息与插件选项重载行为修复修复 bridge 初始连接不发送 retained 消息Fix outgoing retained messages not being sent by bridges on initial connection.此前 bridge 在首次建立连接时其作为客户端订阅到的 retained 消息不会被作为 outbound 消息转发出去导致桥接端数据缺失1.5.5 修复了该问题。若你的部署依赖跨 broker 桥接同步遗嘱/状态类 retained 消息例如设备上下线状态位升级后应能观察到初始连接阶段的 retained 消息正常补发。相关桥接配置入口可参考src/bridge.c与src/bridge_topic.c。auth_opt_ 选项不再随 SIGHUP 重载Dont reloadauth_opt_options on reload, to match the behaviour of the other plugin options.此前 broker 收到 SIGHUP 触发配置重载时auth_opt_*前缀的插件参数会被重新加载而其他插件选项如plugin、plugin_opt_*不会行为不一致。1.5.5 让auth_opt_*与其他插件选项保持一致——重载时不再生效必须重启 broker 才能更新插件参数。插件参数的实际消费路径集中在 src/plugin_*.c 系列文件配置定义见 mosquitto.conf 附近的外部认证/访问控制插件段落。Windows 服务安装/卸载错误提示Print message on error when installing/uninstalling as a Windows service.涉及service.c的 Windows 服务管理逻辑此前以mosquitto install/uninstall方式操作 Windows 服务失败时无任何输出1.5.5 起会在出错时打印错误信息便于排障。Brokerconnection_messages 统一连接/断开日志开关All non-error connect/disconnect messages are controlled by theconnection_messagesoption.在 1.5.5 之前客户端连接与断开相关的日志输出分散受控、部分消息不受开关约束本次统一为所有非错误类的连接/断开日志消息一律由connection_messages选项控制。配置项位置mosquitto.conf注释明确 If set to true, client connection and disconnection messages will be included in the log.默认值为true见 src/conf.c实际使用点分布在 src/handle_connect.c连接成功日志、src/handle_connect.c断开相关日志与 src/loop.c会话过期/清理日志等处均以if(db.config-connection_messages true)为前置条件。对于日志量敏感的生产环境可设置connection_messages false屏蔽连接/断开信息仅保留 error/warning 等关键日志配合log_type系列选项可进一步细化输出。Librarylibmosquitto 重连退避与回调修复修复 reconnect delay backoff 行为Fix reconnect delay backoff behaviour.libmosquitto 的自动重连延迟由mosquitto_reconnect_delay_set()配置C 封装见 lib/cpp/mosquittopp.cpp符号导出见 lib/linker.version。从当前仓库 lib/loop.c 可以看出其计算逻辑if(mosq-reconnect_delay_max mosq-reconnect_delay){ if(mosq-reconnect_exponential_backoff){ reconnect_delay mosq-reconnect_delay*(mosq-reconnects1)*(mosq-reconnects1); }else{ reconnect_delay mosq-reconnect_delay*(mosq-reconnects1); } }else{ reconnect_delay mosq-reconnect_delay; } if(reconnect_delay mosq-reconnect_delay_max){ reconnect_delay mosq-reconnect_delay_max; }即线性模式下第 n 次重连延迟为reconnect_delay × (n1)指数退避模式下为reconnect_delay × (n1)²两者都封顶于reconnect_delay_max若最大值不大于基础延迟则恒定使用基础延迟。默认值为reconnect_delay 1、reconnect_delay_max 1、reconnect_exponential_backoff false见 lib/mosquitto.c。1.5.5 修复了该退避序列计算上的偏差升级后客户端在断线重连时的延迟递增将符合上述预期曲线。避免 keepalive 失败时重复触发 on_disconnect()Dont callon_disconnect()twice if keepalive tests fail.此前当 keepalive 超时检测失败触发断开流程时on_disconnect()回调可能被执行两次一次来自检测路径、一次来自连接清理路径导致应用层重复处理断开事件如重复释放资源、重复置位状态。1.5.5 保证该回调在 keepalive 失败场景下只触发一次相关连接状态机处理位于lib/loop.c与lib/callbacks.c。Clientmosquitto_sub 十六进制输出补全前导零Always print leading zeros inmosquitto_subwhen output format is hex.当mosquitto_sub以-F/--format指定十六进制%p配合-x或格式中的 hex 标记输出 payload 时此前单个字节若小于 0x10 会省略前导零如0x0A显示成A导致输出宽度不定、难以解析。1.5.5 起始终以两位宽度输出其实现位于 client/sub_client_output.c高、低半字节分别经nibble_to_hex[]查表输出保证每个字节固定两个十六进制字符。格式相关的 hex 分隔符、字段宽度等选项也集中在该文件如 client/sub_client_output.c供自动化日志解析场景参考。Build修复无 TLS-PSK 时的编译Fix building where TLS-PSK is not available.TLS-PSKPre-Shared Key支持由 CMake 选项WITH_TLS_PSK控制默认开启见 CMakeLists.txt当编译环境缺少 PSK 所需依赖或手动关闭该选项时1.5.5 之前存在条件编译遗漏导致的编译失败。本次修复完善了相关#ifdef边界保证WITH_TLS_PSK关闭时仍可正常构建 broker 与客户端库。若你的环境不需要 PSK 认证可在配置构建时显式关闭该选项以减小攻击面与依赖面。升级建议与验证要点安全优先若使用per_listener_settings true且依赖默认监听器的acl_file务必升级到 1.5.5 并复测 ACL 拦截效果CVE-2018-20145配置新增项WebSocket 监听在无 IPv6 的环境失败时为该listener区块添加socket_domain ipv4注意该选项不支持热重载需重启 broker行为变化确认升级后auth_opt_*参数重载不再生效、连接/断开日志统一受connection_messages控制若依赖 SIGHUP 动态更新插件参数需改为重启流程客户端平滑升级libmosquitto 的重连退避曲线与on_disconnect()触发次数发生变化应用侧应验证断线重连与回调幂等性mosquitto_sub的 hex 输出格式变更可能影响既有日志解析脚本。以上全部变更的官方说明以 version-155-released.md 为准源码与配置证据均可按文中给出的仓库相对路径进一步查阅。赞分享物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto 1.5.5 版本详解安全修复、socket_domain 新选项与连接消息控制Eclipse Mosquitto 1.5.5 版本详解安全修复、socket_domain 新选项与连接消息控制 Eclipse Mosquitto 1.5物联网消息队列后端网络/通信Mosquitto 1.5.5 发布解析安全修复、socket_domain 新选项与连接消息控制详解Mosquitto 1.5.5 发布解析安全修复、socket_domain 新选项与连接消息控制详解 Mosquitto 1.5.5 是一个以 安全修复 和后端消息队列消息路由Eclipse Mosquitto 0.10.1 发布解读Windows 兼容性修复与 IPv4/IPv6 连接健壮性改进Eclipse Mosquitto 0.10.1 发布解读Windows 兼容性修复与 IPv4/IPv6 连接健壮性改进 本篇文章围绕 Mosquitto后端消息队列消息路由上一篇如何用transcribe.cpp Python SDK实现流式WAV转写官方示例逐行解析下一篇LaserWeb4多机控制终极指南如何同时管理多台激光雕刻机创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考