您好,登录后才能下订单哦!
# 如何解决Jedis连接Linux上的Redis出现"DENIED Redis is running in protected mode"问题
## 问题背景与现象描述
当开发者使用Jedis客户端连接Linux服务器上的Redis服务时,可能会遇到以下错误提示:
redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled…
这个错误表明Redis服务运行在"protected mode"(保护模式)下,此时默认只允许本地回环地址(127.0.0.1)连接,拒绝来自其他IP地址的客户端请求。这是Redis的安全机制,防止未经授权的访问。
## 问题根源分析
### Redis保护模式原理
Redis 3.2版本后引入了保护模式,主要出于安全考虑:
1. **默认绑定127.0.0.1**:新安装的Redis默认只监听本地回环接口
2. **无密码验证时的保护**:当未配置`requirepass`时,保护模式会自动启用
3. **网络隔离**:防止公网上的未授权访问
### 常见触发场景
1. 从远程主机使用Jedis连接新安装的Redis
2. Redis配置文件中未正确设置绑定地址或密码
3. 防火墙/安全组规则放行但Redis自身限制未解除
## 完整解决方案
### 方案一:禁用保护模式(不推荐生产环境)
临时解决方案(重启失效):
```bash
redis-cli config set protected-mode no
永久解决方案:
1. 编辑Redis配置文件(通常位于/etc/redis/redis.conf
)
2. 找到protected-mode
配置项,修改为:
protected-mode no
sudo systemctl restart redis
注意:此方法会降低安全性,仅建议在可信网络环境中使用。
requirepass your_strong_password
Jedis jedis = new Jedis("redis-server-ip", 6379);
jedis.auth("your_strong_password");
修改配置文件:
bind 0.0.0.0 # 允许所有IP连接
# 或指定特定IP
bind 192.168.1.100 127.0.0.1
同时设置密码以保障安全
重启服务生效
对于跨公网连接,建议建立SSH隧道:
ssh -L 6379:localhost:6379 user@redis-server
然后Jedis连接本地6379端口即可。
根据不同系统,配置文件可能位于:
- Ubuntu/Debian: /etc/redis/redis.conf
- CentOS/RHEL: /etc/redis.conf
- 自定义安装: 查看服务启动脚本确定位置
建议组合配置:
protected-mode yes
bind 内网IP 127.0.0.1
requirepass 复杂密码
rename-command FLUSHDB ""
rename-command CONFIG ""
# 只允许特定IP访问
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP
import redis.clients.jedis.Jedis;
public class RedisSecureConnection {
public static void main(String[] args) {
// 基本连接
Jedis jedis = new Jedis("192.168.1.100", 6379);
jedis.auth("secure_password_123");
try {
System.out.println("Server status: " + jedis.ping());
jedis.set("secure_key", "value");
System.out.println("Stored value: " + jedis.get("secure_key"));
} finally {
jedis.close();
}
// 使用连接池(推荐生产环境)
JedisPool pool = new JedisPool("192.168.1.100", 6379);
try (Jedis pooledJedis = pool.getResource()) {
pooledJedis.auth("secure_password_123");
// 业务操作...
}
pool.close();
}
}
ss -tulnp | grep redis
# 或
netstat -tulnp | grep 6379
journalctl -u redis -f
# 或查看日志文件
tail -f /var/log/redis/redis-server.log
# 从客户端测试
telnet redis-server-ip 6379
# 或使用nc
echo "PING" | nc redis-server-ip 6379
redis-cli -h 127.0.0.1 -a yourpassword
127.0.0.1:6379> CONFIG GET requirepass
A: 检查是否重启了Redis服务,确认配置文件的权限和语法正确。
A: 可以通过CONFIG SET
命令临时修改,但建议最终还是要持久化到配置文件并重启。
A: 生产环境应保持保护模式开启,配合密码认证和网络访问控制使用。
A: 根据并发量调整,典型配置:
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(128);
config.setMaxIdle(32);
config.setMinIdle(8);
解决”DENIED Redis is running in protected mode”问题的核心在于理解Redis的安全机制。推荐的生产环境解决方案是:
protected-mode
开启bind
地址通过以上措施,既能保障Redis服务的安全,又能满足Jedis客户端的正常连接需求。对于开发测试环境,可以临时禁用保护模式,但务必不要将此配置带入生产环境。
最后更新:2023年11月 | 作者:Redis解决方案专家 | 字数:约2800字 “`
这篇文章采用Markdown格式编写,包含了: 1. 问题分析和技术原理 2. 多种解决方案及实施步骤 3. 代码示例和配置片段 4. 故障排查方法 5. 安全建议和最佳实践 6. 常见问题解答
全文结构清晰,内容详实,可以直接用于技术文档或博客发布。需要调整字数或补充细节可以随时告知。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。