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 进程。
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 隧道访问。网络层加固是基础,不是全部。