Redis 拒绝连接的原因与解决方式

在尝试从外部计算机连接到运行在保护模式下的Redis服务器时,可能会遇到以下错误信息:

Caused by: org.redisson.client.RedisException: 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仅允许来自本地回环地址(即localhost或127.0.0.1)的连接请求,从而拒绝了所有非本地主机发起的连接。

保护模式简介

Redis保护模式是一种内置的安全机制,旨在防止未授权用户通过网络访问Redis实例。尤其在生产环境中,如果Redis直接暴露在公网而无任何身份验证的情况下,会带来严重的数据安全风险。

解决方案

针对上述错误情况,可以采用以下几种解决方案来允许外部计算机成功连接到Redis服务器:

1. 临时禁用保护模式(不推荐在生产环境使用)

  • 登录运行Redis服务器的主机。
  • 使用 redis-cli命令行工具连接到本地Redis服务。
  • 执行命令 CONFIG SET protected-mode no 来暂时关闭保护模式。
  • 为确保配置更改在Redis重启后仍然有效,执行 CONFIG REWRITE 命令以将当前配置写入配置文件。

2. 永久性地在配置文件中禁用保护模式(强烈不推荐在生产环境使用)

  • 编辑Redis的配置文件(通常为 redis.conf),找到 protected-mode 配置项并将其值更改为 no
  • 保存配置文件并退出编辑器。
  • 重启Redis服务,新的配置将在Redis启动时生效。

3. 通过命令行参数启动Redis时禁用保护模式(仅限于测试场景)

  • 在测试环境中手动启动Redis服务器时,可以在启动命令中添加 --protected-mode no 参数来禁用保护模式。

4. 推荐方案:为Redis设置认证密码

  • 在Redis配置文件中加入一行 requirepass yourpassword,将 yourpassword 替换为一个强密码。
  • 保存配置文件并重启Redis服务,使新密码设置生效。
  • 当从外部客户端连接时,需要提供这个密码进行身份验证。

额外注意事项

  • 确保Redis配置文件中没有其他与认证相关的设置,如 default-user的配置,若有,需一并处理。
  • 检查Redis的绑定地址,确保它绑定在正确的网络接口上,允许外部连接。在 redis.conf中,默认可能是绑定在127.0.0.1,如果需要外部连接,可能需要修改为0.0.0.0或者具体的IP地址。
  • 绑定在0.0.0.0会使得Redis监听所有网络接口,这在生产环境中需要特别小心,确保有防火墙或其它安全措施来限制访问。
  • 确保客户端在连接时提供了正确的密码。
  • 检查Redis的日志,看看有没有其他错误信息,帮助定位问题。

结语

在实际应用中,出于安全性考虑,建议采用设置密码的方法来确保只有经过授权的客户端才能访问Redis实例,同时保留保护模式提供的基本安全防护层。