Redis 8.4.7 起 cluster bus 端口未认证会在启动时告警:先收敛 16379,再决定 protected-mode
参考链接:Redis 8.4 release notes、Cluster scaling 文档。
8.4.7 的安全修复
Redis 8.4.7(2026-09-17)包含以下修复:
- #15673:事务中已排队的命令,在事务执行前 ACL 权限被撤销的情况下,仍可能访问对应键。
- #15722:cluster bus 协议本身没有认证,除非启用
tls-cluster,因此任何能访问某节点 bus 端口的主机都能加入集群并威胁它。集群节点现在会在 bus 端口未认证时于启动阶段告警;新增cluster-bus-port-protected-mode选项(默认no),把它设为yes时,只有tls-cluster认证了 bus 才允许节点启动。 - TimeSeries:避免从畸形 RDB 恢复的压缩 Time Series 键在追加样本时崩溃。
- Vector Sets:Vector Set 查询中深度嵌套 JSON 可导致服务器崩溃。
bus 端口为什么是裸露的
客户端端口的计算规则是 bus 端口 = 客户端端口 + 10000:默认 6379 对应 16379,自定义成 7000 就是 17000。requirepass 和 ACL 保护的是客户端连接,节点之间走 bus 的是另一套二进制协议,不经过这套认证。也就是说,只要主机能连上 16379,就能向节点发送集群消息、参与 gossip、把自己塞进集群视图,进而影响集群状态。在只靠密码保护客户端端口的部署里,bus 端口往往是唯一没有认证的入口。
tls-cluster 是让 bus 具备认证能力的开关;在它开启之前,cluster-bus-port-protected-mode 只是把风险从“默认暴露”变成“拒绝启动”。
兼容性陷阱:直接设 yes 会让明文集群起不来
cluster-bus-port-protected-mode 默认是 no,保持 8.4.6 及以前的行为。把它改成 yes 后,节点启动时会检查 bus 是否已由 tls-cluster 认证;纯明文集群不满足这个条件,节点会直接拒绝启动。
所以顺序只能是:先让全集群的 tls-cluster 生效,再打开 cluster-bus-port-protected-mode。改配置前先确认当前状态:
redis-cli -p 6379 CONFIG GET tls-cluster
返回 no 的集群,不要动 cluster-bus-port-protected-mode。
先用防火墙和 bind 收敛 bus 端口
在无法立刻上 TLS 的环境里,现实做法是把 bus 端口的可达范围压到集群节点之间。
确认本机实际监听情况:
ss -lntp | grep -E ':(6379|16379)\b'
配置 bind 只监听内网地址,避免 bus 端口落在公网网卡上:
bind 127.0.0.1 10.0.0.11
nftables 示例(集群节点为 10.0.0.11、10.0.0.12、10.0.0.13):
nft add table inet redis
nft add chain inet redis input '{ type filter hook input priority 0; policy accept; }'
nft add rule inet redis input tcp dport 16379 ip saddr != { 10.0.0.11, 10.0.0.12, 10.0.0.13 } drop
iptables 示例:
for ip in 10.0.0.11 10.0.0.12 10.0.0.13; do
iptables -A INPUT -p tcp --dport 16379 -s "$ip" -j ACCEPT
done
iptables -A INPUT -p tcp --dport 16379 -j DROP
这些规则要放在已有 ESTABLISHED 放行规则之后,否则会影响正常的节点间连接。
放行名单不能凭记忆写,用 cluster nodes 核对每个对端的地址和 bus 端口:
redis-cli -p 6379 cluster nodes
输出中 ip:port@cport 的 cport 就是该节点的 bus 端口,据此确认防火墙允许的源地址覆盖了全部节点,且没有多余条目。
8.4.8:超大 PUBLISH 消息在 bus 上的堆溢出
Redis 8.4.8(2026-10-26)修复了集群模式下经 cluster bus 传播大于 4GB 的 PUBLISH/SPUBLISH 消息时的堆缓冲区溢出。这类体积的消息本身不应出现在正常业务里,但一旦触发就是节点级故障,补丁版本需要跟上;应用侧也应限制消息体大小,避免把 GB 级 payload 交给 Pub/Sub。
8.4 中与集群运维相关的变更
CLUSTER MIGRATION:原子槽迁移。CLUSTER SLOT-STATS:按槽输出指标,包括键数、CPU 时间、网络 IO。
已知限制:槽迁移期间 FT.SEARCH 等查询可能返回部分结果或重复。
升级顺序
- 先升级到 8.4.7 及以上(含 8.4.8 的溢出修复),不改任何配置。此时 bus 未认证会在启动日志里出现告警,属预期行为。
- 用
bind加 nftables/iptables 收敛 bus 端口,ss -lntp确认监听地址,cluster nodes核对放行名单。 CONFIG GET tls-cluster确认是否已启用;纯明文集群保持cluster-bus-port-protected-mode为no。- 需要设成
yes的集群,先完成全集群tls-cluster配置,再挑一台改配置文件并重启,确认能正常启动并重新加入集群,之后才铺开到其余节点。