转自:https://blog.csdn.net/cw_hello1/article/details/83444013
本地redis客户端使用 redis-cli -h host -p port -a password 连接远程服务器,爆出错误
Error: Protocol error, got "J" as reply type byte
解决问题的关键在了解redis服务器上配置文件中bind和protected-mode这两项配置的作用
bind的作用
经常会有个误区是bind用于绑定能够访问本机redis服务器的ip,但是真要配置一个其他机器的ip,就会发现启动不了redis。
bind的真实作用是,绑定本机的网卡ip,如果配置了bind,则redis服务器只接受来自绑定网卡的redis请求。如果都没配置,则接受所有网卡发来的请求
举例:如果redis服务器上有两个网卡,IP地址分别是IP1和IP2,在redis.conf里配置 bind IP1,那么远程客户端只能通过IP1访问redis服务器。如果配置了IP1和IP2以外的地址,redis服务就会启动不了
127.0.0.1是一个回环地址,所有计算机都只能访问自己的回环地址。所以只有本机能访问这个IP地址而不是只接受回环地址的访问
redis中的【protected-mode】的理解
redis本身无法限制【只有指定主机】连接到redis中,就像上面说的一样,bind指定只是用来设置接口地址(interfaces)。
1.如果你的bind设置为:bind 127.0.0.1,这是非常安全的,因为只有本台主机可以连接到redis,就算不设置密码,也是安全的,除非有人登入到你的服务器上。
2.如果你的bind设置为:bind 0.0.0.0,表示所有主机都可以连接到redis。(前提:你的服务器必须开放redis的端口)。这时设置密码,就会多一层保护,只有知道密码的才可以访问。也就是任何知道密码的主机都可以访问到你的redis。
protected-mode是redis本身的一个安全层,这个安全层的作用:就是只有【本机】可以访问redis,其他任何都不可以访问redis。这个安全层开启必须满足三个条件,不然安全层处于关闭状态:
(1)protected-mode yes(处于开启)
(2)没有bind指令。原文:The server is not binding explicitly to a set of addresses using the "bind" directive.
(3)没有设置密码。原文:No password is configured。
这时redis的保护机制就会开启。开启之后,只有本机才可以访问redis。 如果上面三个条件任何一个不满足,就不会开启保护机制。