4. 网络层安全加固:绑定监听地址、禁用保护模式、配置防火墙规则、使用非默认端口

网络层是 Redis 安全的第一道防线。默认配置下 Redis 监听 0.0.0.0:6379,且保护模式(protected-mode)在无密码时自动开启有限防护,但这远不足以应对生产环境。本章从四个维度构建纵深网络防御:绑定监听地址缩小暴露面、禁用保护模式避免误判、配置防火墙规则实施白名单、使用非默认端口规避自动化扫描。

安全基线原则:Redis 不应直接暴露在公网或非信任网络。即使内网环境,也应遵循最小暴露原则——只监听业务需要的 IP 和端口,只允许必要的客户端 IP 访问。

4.1 绑定监听地址(bind)

bind 指令控制 Redis 监听的网络接口。默认 bind 127.0.0.1 -::1 仅监听本地回环,适合单机开发;生产环境需根据拓扑明确指定内网 IP。

配置场景 bind 值 监听范围 安全等级
单机开发/本地工具 127.0.0.1 仅本机 高
同网段应用服务器 192.168.1.100 指定内网 IP 高
多网卡混合部署 192.168.1.100 10.0.0.100 多个指定接口 中高
禁止使用 0.0.0.0 所有接口(含公网) 极低
# redis.conf 配置示例
bind 192.168.1.100 127.0.0.1
# 只监听内网业务 IP 和本地回环,不监听公网接口
常见误区:bind 多个 IP 时用空格分隔,不要用逗号。修改后需重启 Redis 或执行 CONFIG SET bind "192.168.1.100 127.0.0.1" 动态生效(注意动态修改不会持久化到配置文件)。

4.2 禁用保护模式(protected-mode)

Redis 保护模式是一种安全兜底机制:当满足 无密码 + bind 0.0.0.0 或 未显式配置 bind 时,保护模式自动拒绝非回环连接。但该机制存在两个问题:

  • 误判风险:显式配置了 bind 但忘记设置密码时,保护模式不会触发,Redis 直接暴露。
  • 运维干扰:部分集群管理工具(如 Sentinel、Cluster)需要从非回环地址发起连接,保护模式可能阻断合法探测。

正确做法:显式设置 protected-mode no,同时通过 bind + 防火墙 + 密码三重机制保障安全,不依赖保护模式的模糊判定。

# redis.conf
protected-mode no
# 关闭保护模式,由 bind + requirepass + 防火墙接管访问控制
安全策略:保护模式是“安全网”而非“安全墙”。生产环境应关闭保护模式,用精确的访问控制替代模糊的自动阻断。

4.3 配置防火墙规则

防火墙是网络层最可靠的访问控制手段。无论 Redis 配置如何,防火墙应作为白名单机制只放行特定源 IP。以下以 iptables 和 firewalld 为例:

4.3.1 iptables 规则示例

# 仅允许应用服务器 10.0.1.0/24 访问 Redis 6379 端口
iptables -A INPUT -p tcp --dport 6379 -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

# 允许本机回环访问(监控脚本、本地客户端)
iptables -A INPUT -i lo -p tcp --dport 6379 -j ACCEPT

4.3.2 firewalld 规则示例

# 添加可信源区域
firewall-cmd --permanent --zone=trusted --add-source=10.0.1.0/24
firewall-cmd --permanent --zone=trusted --add-port=6379/tcp
firewall-cmd --reload
防火墙策略 推荐做法 不推荐做法
源 IP 白名单 只放行业务网段 放行 0.0.0.0/0
端口限制 仅开放 Redis 端口 开放大范围端口
默认策略 DROP 或 REJECT ACCEPT 后单独拒绝
规则持久化 iptables-save / firewalld --permanent 仅运行时生效
运维建议:防火墙规则变更后,先保留一条当前 SSH 会话的放行规则,避免将自己锁在门外。建议使用 iptables-apply 或 firewalld 的 --timeout 参数做安全生效。

4.4 使用非默认端口

默认端口 6379 是自动化扫描工具的首选目标。更换为高位随机端口(如 16379、26379)可有效降低被批量扫描的概率。注意端口变更需同步更新:

  • 客户端连接地址:应用配置、连接池、DNS 记录
  • Sentinel / Cluster 配置:节点间通信端口
  • 防火墙规则:放行新端口
  • 监控系统:端口探测、指标采集
# redis.conf
port 16379
# 使用非默认端口,避免自动化扫描
注意:非默认端口不能替代认证和加密。它只是降低被扫描的概率,不能阻止定向攻击。必须与 bind、requirepass、TLS 配合使用。

4.5 网络层安全架构总览

以下 SVG 图展示四层加固的协同关系:从外到内依次为防火墙白名单、非默认端口、绑定内网地址、关闭保护模式,最终到达 Redis 进程。

Redis 网络层安全加固架构 Redis 网络层安全加固四层纵深防御 第1层:防火墙白名单 iptables / firewalld 仅放行 10.0.1.0/24 → 16379 第2层:非默认端口 port 16379(避开自动化扫描默认 6379) 第3层:绑定监听地址 bind 192.168.1.100 127.0.0.1 第4层:禁用保护模式 protected-mode no(精确控制替代模糊阻断) Redis Server 进程 攻击者视角:层层递减的暴露面

4.6 综合配置清单

以下为生产环境最小安全配置模板,可直接用于 redis.conf:

# 网络层安全加固(第4章)
bind 192.168.1.100 127.0.0.1
port 16379
protected-mode no

# 认证层(第5章详细展开)
requirepass YourStrongPassword!2024

# 其他安全相关
tcp-backlog 511
timeout 300
tcp-keepalive 300
验证命令:配置生效后,使用 ss -tlnp | grep redis 确认监听地址和端口;使用 redis-cli -h 192.168.1.100 -p 16379 -a 'YourStrongPassword!2024' ping 测试连通性。

4.7 常见问题与避坑

问题现象 根因 解决方案
本地 redis-cli 连接正常,远程连接超时 bind 未包含内网 IP 或防火墙未放行 检查 bind 配置和防火墙规则
修改 port 后 Sentinel 频繁切换 Sentinel 配置中端口未同步更新 更新所有 Sentinel 节点的 sentinel monitor 端口
保护模式关闭后仍无法远程连接 bind 127.0.0.1 限制仅本地 添加业务网段 IP 到 bind 列表
防火墙规则正确但连接被拒绝 Redis 绑定地址与防火墙规则网段不匹配 确保 bind IP 在防火墙放行源范围内
安全红线:禁止在公网或跨互联网环境直接暴露 Redis 端口。即使配置了密码和绑定,也应通过 VPN、专线或 SSH 隧道访问。网络层加固是基础,不是全部。