为了防止redis实例收到外部网络的攻击,redis在3.2.0版本之后加入了保护模式的概念。当保护模式有效时,保护模式下只响应本地回环接口(127.0.0.1/localhost/0.0.0.0)的访问,从其他地址仍然可以与服务器建立redis连接,但是执行命令会提示错误,并提示如何处理这种错误。
保护模式必须符合以下条件才会有效:
模拟条件:
#不绑定任何ip----1
127.0.0.1:6370> config get bind
1) "bind"
2) ""
#不设置密码
127.0.0.1:6370> config get requirepass
1) "requirepass"
2) ""
#启动保护模式
127.0.0.1:6370> config get protected-mode
1) "protected-mode"
2) "yes"
指定ip连接:
[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions:
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
报错,并提供了四种从外网访问服务的解决办法。四种方法选择任意一种即可。
以上四种解决方法中的前三种都是关闭保护模式,第四种是不关闭保护模式。下面我们针对这两种方式进行测试。
关闭保护模式的方式有3种。
方式1,使用redis-cli客户端,通过命令关闭保护模式,不需要重启服务。
#查看保护模式状态
localhost:6370> config get protected-mode
1) "protected-mode"
2) "yes"
#关闭保护模式
localhost:6370> config set protected-mode no
OK
#查看保护模式状态,确认修改成功
localhost:6370> config get protected-mode
1) "protected-mode"
2) "no"
#将当前配置重写进配置文件,防止下次重启失效。
localhost:6370> config rewrite
OK
方式2,修改reids.conf配置文件,需要重启服务。
#修改配置文件
vi redis.conf
#将protected-mode改为no
protected-mode no
#保存 重启服务
方式3,通过redis-server选项--protected-mode no关闭保护模式,重启服务。
redis-server /etc/redis/single-6370.conf --protected-mode no
测试结果通过:
[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(empty list or set)
例如:redis服务器的ip为192.168.25.66,那么允许其他服务器通过这个ip访问redis的操作如下。注意,如果未绑定回环接口的,本地地址是访问不通的。
注意:如果需要访问所有的本地ip的话,可以直接绑定源地址0.0.0.0,0.0.0.0指的是本机上的所有IPV4地址。
#修改配置文件
$ vi redis.conf
#追加绑定ip,未绑定127.0.0.1不能从本地访问
bind 192.168.25.66
#绑定多个ip
#bind 127.0.0.1 192.168.25.66
#保存重启
查看已绑定的ip。
192.168.25.66:6370> config get bind
1) "bind"
2) "192.168.25.66"
测试结果通过:
[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> keys *
(empty list or set)
方法1,命令修改密码,不用重启服务。
192.168.25.66:6370> config get requirepass
1) "requirepass"
2) "foobared"
192.168.25.66:6370> config set requirepass newpwd
OK
192.168.25.66:6370> config rewrite
OK
方法2,修改配置文件,需要重启服务。
#修改配置文件redis.conf
#添加
requirepass foobared
#保存重启
测试结果通过:
[root@node03 ~]# redis-cli -h 192.168.25.66 -p 6370
192.168.25.66:6370> auth foobared
OK
192.168.25.66:6370> keys *
(empty list or set)