一、引言:从一个典型连接错误说起
在分布式系统开发中,Redis 作为高性能缓存中间件被广泛使用。
然而,当我们首次部署 Redis 并尝试从外部客户端连接时,常常会遇到以下错误:
DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user. In this mode connections are only accepted from the loopback interface.
这个错误看似简单,却涉及 Redis 安全机制的核心设计。
本文将深入解析 Redis 保护模式的原理、触发条件,并提供四种实战解决方案,同时结合生产环境最佳实践,帮助你全面理解和解决 Redis 外部连接问题。
二、Redis 保护模式原理与触发条件
2.1 保护模式的设计初衷
Redis 自 3.2 版本引入保护模式(Protected Mode),旨在解决用户因配置疏忽导致的安全漏洞。其核心逻辑是:当 Redis 未进行任何安全配置(如未设置密码、未绑定特定 IP)时,默认仅允许本地环回接口(Loopback Interface)访问,拒绝所有外部连接,从而避免公开网络中的未授权访问。
2.2 触发保护模式的三大条件
保护模式的激活需同时满足以下三个条件:
未设置访问密码:配置文件中 requirepass
未定义或为空。
未绑定具体 IP:默认绑定 127.0.0.1
,或 bind
配置中未包含外部可访问的 IP 地址。
未禁用保护模式:配置文件中 protected-mode
为 yes
(默认值)。
2.3 保护模式下的连接限制
允许的连接:仅本地环回地址(127.0.0.1
或 ::1
)的连接请求。
拒绝的连接:所有来自外部网络的 TCP 连接请求,即使 Redis 服务监听在 0.0.0.0
端口。
三、四种实战解决方案详解
3.1 方案一:通过命令临时关闭保护模式(测试场景)
适用场景
临时本地调试,需快速验证 Redis 功能。
仅建议在开发环境使用,严禁用于生产环境。
操作步骤
本地连接 Redis通过 redis-cli
从服务器本地发起连接:
redis-cli -h 127.0.0.1 -p 6379
若提示 (error) DENIED
,说明保护模式已生效,但本地环回连接仍允许(因保护模式不限制本地访问)。
执行配置命令关闭保护模式在 Redis 命令行中输入:
CONFIG SET protected-mode no
命令执行后,保护模式立即关闭,允许外部连接。
验证配置状态
CONFIG GET protected-mode
# 预期输出:1) "protected-mode" 2) "no"
(可选)永久保存配置若希望重启后配置生效,需执行:
CONFIG REWRITE
该命令会将临时配置写入 Redis 配置文件(redis.conf
)。
风险提示
关闭保护模式后,若 Redis 暴露在公网且未设置密码,可能导致数据泄露或被恶意攻击。
此方案仅适用于短期测试,完成验证后应立即恢复保护模式或设置密码。
3.2 方案二:修改配置文件永久关闭保护模式(开发环境)
适用场景
开发或测试环境,需长期允许外部无密码访问。
不建议用于生产环境,除非已通过其他方式(如防火墙)严格限制访问。
操作步骤
1、定位 Redis 配置文件
Linux 系统:通常位于 /etc/redis/redis.conf
或 /usr/local/etc/redis.conf
。
Windows 系统:默认路径为 C:\Program Files\Redis\redis.windows.conf
。
2、编辑配置文件使用文本编辑器打开配置文件,搜索 protected-mode
配置项:
# 原值(默认)
protected-mode yes
# 修改后
protected-mode no
3、重启 Redis 服务
Linux(以 systemd 为例):
sudo systemctl restart redis
Windows:通过服务管理器找到 Redis 服务,点击 “重启”;或在命令行重新运行:
redis-server.exe "C:\Program Files\Redis\redis.windows.conf"
安全建议
若必须在开发环境关闭保护模式,建议同时配置 bind
限制允许的 IP 地址,例如:
bind 192.168.1.100 # 仅允许指定 IP 访问
结合防火墙规则,禁止公网访问 Redis 端口,仅允许内网可信 IP 连接。
3.3 方案三:启动时临时禁用保护模式(单次测试)
适用场景
仅需单次启动时允许外部连接(如临时演示、脚本测试)。
无需修改配置文件,快速验证场景。
操作步骤
在启动 Redis 服务时,通过命令行参数显式禁用保护模式:
# Linux 命令
redis-server --port 6379 --protected-mode no
# Windows 命令(需在 redis-server.exe 所在目录执行)
redis-server.exe redis.windows.conf --protected-mode no
注意事项
此参数仅在当前进程有效,Redis 服务重启后会恢复默认的保护模式。
不建议在生产环境中使用此方法,避免因进程重启导致配置丢失。
3.4 方案四:为 Redis 设置访问密码(生产环境推荐)
适用场景
所有生产环境,尤其是暴露在公网或复杂网络环境中的 Redis 实例。
需兼顾安全性与外部访问需求的最佳实践。
操作步骤
配置文件中设置密码编辑 redis.conf
,找到 requirepass
配置项(默认被注释),取消注释并设置强密码:
# 原值
# requirepass foobared
# 修改后(替换为强密码,如包含大小写字母、数字、特殊符号)
requirepass YourStrongPassword123!
重启 Redis 服务使配置生效执行重启命令(参考方案二),确保密码配置加载成功。
客户端连接时携带密码
命令行连接:
redis-cli -h <服务器IP> -p 6379 -a YourStrongPassword123!
应用程序配置(以 Spring Boot 为例):
spring.redis.password=YourStrongPassword123!
验证密码有效性连接后执行 PING
命令,若返回 PONG
,表示认证成功:
127.0.0.1:6379> PING
PONG
安全增强措施
结合 bind
配置限制 IP:在 redis.conf
中指定允许访问的 IP 地址,例如:
bind 192.168.1.100 10.0.0.5 # 允许多个内网 IP 访问
启用 SSL 加密连接:通过 rediss://
协议或代理(如 stunnel)实现客户端与 Redis 之间的流量加密,防止密码明文传输。
定期轮换密码:使用配置管理工具(如 Ansible、Vault)定期更新密码,避免长期使用固定密码。
四、方案对比与最佳实践
4.1 方案对比表格
方案 | 安全性 | 复杂度 | 持久性 | 适用场景 |
---|---|---|---|---|
临时命令关闭 | 低 | 简单 | 临时(需重启) | 本地测试、短期验证 |
配置文件关闭 | 中 | 中等 | 永久 | 开发环境、受限内网 |
启动参数关闭 | 低 | 简单 | 单次启动 | 临时演示、脚本测试 |
设置密码 | 高 | 中等 | 永久 | 生产环境、公网部署 |
4.2 生产环境最佳实践
强制设置强密码避免使用默认密码或简单密码,建议密码长度不少于 16 位,包含多种字符类型。
限制绑定 IP禁止使用 bind ``0.0.0.0
暴露所有 IP 接口,应指定具体的内网 IP 或子网,例如:
bind 10.0.0.0/8 # 允许 10.0.0.0 网段的所有 IP 访问
防火墙与安全组配置
云服务器中,仅放行指定客户端 IP 的 TCP 6379 端口入站规则。
禁止公网直接访问 Redis 端口,通过 VPN 或内网负载均衡器中转连接。
启用 ACL 访问控制Redis 6.0+ 引入 ACL(Access Control Lists)功能,可创建细粒度权限的用户,例如:
ACL SETUSER admin on # 允许 admin 用户执行所有命令
ACL SETUSER readonly \~\* +GET -SET # 只读用户,仅允许 GET 命令
定期审计与监控使用 redis-audit
等工具记录命令执行日志,监控异常连接尝试和高频操作,及时发现潜在攻击。
五、常见问题与进阶解决方案
5.1 问题:设置密码后仍无法连接
可能原因:
密码错误:检查配置文件中 requirepass
的值与客户端输入是否一致。
端口未放行:防火墙或安全组阻止了 TCP 6379 端口。
保护模式未完全关闭:若同时满足保护模式触发条件(如未绑定 IP),即使设置密码,仍可能拒绝外部连接。
解决方法:执行 redis-cli -h ``127.0.0.1`` -a <密码> CONFIG GET protected-mode
,确认保护模式为 no
,并检查 bind
配置是否允许客户端 IP。
5.2 问题:保护模式关闭后,公网仍无法连接
可能原因:
Redis 服务未监听在公网 IP:默认监听 127.0.0.1
,需在 bind
中添加公网 IP 或 0.0.0.0
。
云服务器安全组限制:例如阿里云默认禁止 Redis 端口公网访问,需手动添加安全组规则。
解决方法:
# 修改 redis.conf 监听所有接口
bind 0.0.0.0
并在云厂商控制台放行 TCP 6379 端口的入站规则。
5.3 进阶:使用 Docker 部署 Redis 时的安全配置
若通过 Docker 运行 Redis,需注意:
容器端口映射:避免直接映射 6379 端口到宿主机公网,建议通过 Docker 网络隔离或代理服务访问。
配置文件挂载:将本地加密后的 redis.conf
挂载到容器中,避免密码泄露在镜像中。
FROM redis:latest
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD \["redis-server", "/usr/local/etc/redis/redis.conf"]
✍结尾
🀙🀚🀛🀜🀝🀞🀟🀠🀡🀐🀑🀒🀓🀔🀕🀖🀘🀗🀏🀎🀍🀌🀋🀊🀉🀈🀇🀆🀅🀃🀂🀁🀀🀄︎🀢🀣🀥🀤🀦🀧🀨🀩🀪
📘 妹妹听后点了点头,脸上露出了满意的笑容。她轻声说道:“原来如此,谢谢你,鸽鸽。看来我不仅要多读书,还要多动手实践,提升自己才行。”
看着她那充满求知欲的眼神,我不禁感叹,学习之路虽然充满挑战,但有这样一位美丽聪慧的伙伴相伴,一切都变得格外有意义。快去和妹妹一起实践一下吧!
📘相关阅读⚡⚡
笔者 綦枫Maple 的其他作品,欢迎点击查阅哦~:
📚Jmeter性能测试大全:Jmeter性能测试大全系列教程!持续更新中!
📚UI自动化测试系列: Selenium+Java自动化测试系列教程❤
📚移动端自动化测试系列:Appium自动化测试系列教程
📚Postman系列:Postman高级使用技巧系列
👨🎓作者:綦枫Maple
🚀博客:CSDN、掘金等
🚀CSDN技术社区:https://bbs.csdn.net/forums/testbean
🚀网易云音乐:https://y.music.163.com/m/user?id=316706413
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系处理。
🀐其他:若有兴趣,可以加文章结尾的Q群,一起探讨学习哦~