本文已参与「新人创作礼」活动,一同敞开创作之路。

前言

昨天介绍了《Windows&Linux&MacOS如何快速建立Redis》。建立完结,往往会呈现同一内网下其他主机无法衔接redis-server的状况,原因可能有:protected-mode(保护形式)已敞开、bind绑定了无效的主机地址、bind设置了本地回环地址……为了完全弄清楚protected-mode和bind对长途拜访redis-server的影响,我特别规划了一些测验场景,像测验产品需求一样测验这两项装备。

一、redis.conf中bind和protected mode装备解读

同软件测验的流程一样,在测验规划前,需求先弄懂产品需求(redis装备项bind和protected-mode)是什么

像测试产品需求一样测试Redis配置项protected mode(保护模式)

  • bind: 绑定redis服务器本机网卡IP,默以为127.0.0.1,即本地回环地址,只能经过本机的客户端衔接,而无法经过长途衔接。bind设置为本机IP地址,答应恣意计算机经过此IP地址衔接,如本机有两个IP1和IP2,当bind设置了IP1时,那么只能经过IP1衔接redis,而经过IP2无法衔接。
  • protected mode: 保护形式,默以为yes,敞开状况,为了约束公网拜访redis,加强安全性。它的启用条件有:① protected mode设置为yes;② 没有bind ip;③ 没有设置拜访暗码;(以上条件有必要一起满意,不然不会敞开保护机制)

二、测验场景规划

弄清楚了redis装备项bind和protected-mode的需求,就能够进行测验场景规划了

1.验证场景如下:

redis地点主机地址为:192.168.1.123

运行python测验代码的主机地址为:192.168.1.122

场景 前提:redis.conf装备 测验步骤 希望成果 测验成果
1.敞开保护形式,收效 – protected mode:yes,即敞开状况
  • bind:注释掉,未绑定任何IP
  • 没有设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 衔接失利 | | | 2.敞开保护形式,不收效(设置bind ip) | – protected mode:yes
  • bind:192.168.1.123
  • 没有设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 1.衔接成功2.刺进成功3.value为0 | | | 3.敞开保护形式,不收效(设置拜访暗码) | – protected mode:no
  • bind:注释掉,未绑定任何IP
  • 设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 1.衔接成功2.刺进成功3.value为0 | | | 4.绑定无效ip | – protected mode:no
  • bind:192.168.1.122
  • 没有设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 衔接失利 | | | 5.绑定本地回环地址-敞开保护形式 | – protected mode:no
  • bind:127.0.0.1
  • 没有设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 衔接失利 | | | 6.绑定本地回环地址-封闭保护形式 | – protected mode:yes
  • bind:127.0.0.1
  • 没有设置拜访暗码 | 1.经过python代码长途衔接redis2.刺进键值对:{“test1”:0}3.获取键test1的值 | 衔接失利

2.python测验代码如下

经过一段Python代码简略测验redis连通性:

import redis
class RedisHandler:
    def __init__(self, host, port=6379, db=0):
        self.client = redis.StrictRedis(host=host, port=port, db=db)  # 生成客户端衔接,StrictRedis()默认运用衔接池,不用再单独运用ConnectPool
    def set_string(self, name: str, value, ex=None, px=None, nx=False, xx=False) -> None:
        """
        缓存中写入str(单个)
        :param name: 缓存称号
        :param value: 缓存值
        :param ex: 过期时间(秒)
        :param px: 过期时间(毫秒)
        :param nx: 如果设置为True,则只要name不存在时,当前set操作才履行(新增)
        :param xx: 如果设置为True,则只要name不存在时,当前set操作才履行(修改)
        :return:
        """
        self.client.set(name, value=value, ex=ex, px=px, nx=nx, xx=xx)
    def get_key(self, name):
        """读取缓存"""
        print(self.client.get(name))
if __name__ == '__main__':
    redis = RedisHandler(host='192.168.1.123')
    redis.set_string("test1", 0)
    redis.get_key("test1")

三、验证protected mode

1.保护形式收效- 衔接Redis失利

① 设置redis.conf

  • protected mode:yes,即敞开状况
  • bind:注释掉,未绑定任何IP
  • 没有设置拜访暗码

② 测验连通性

履行后报错如下:

像测试产品需求一样测试Redis配置项protected mode(保护模式)

经过上图能够看出:

衔接Redis被拒绝了,此刻Redis正在保护形式下运行,因为已启用保护形式,未指定绑定地址,未设置拜访暗码。在此形式下,仅承受来自环回接口的衔接,即本地衔接。验证经过,与希望的成果共同。

2.保护形式不收效(设置bindip)- 衔接Redis成功

① 设置redis.conf

  • protected mode:yes
  • bind:192.168.1.123
  • 没有设置拜访暗码

② 测验连通性

虽然protected mode处于敞开状况,但是因为bind绑定了本机IP地址,所以保护形式是不收效的,客户端衔接redis时,也能够衔接成功,如下图所示,衔接redis成功,并成功获取到名为test1的key的value值为0,验证经过,与希望的成果共同:

像测试产品需求一样测试Redis配置项protected mode(保护模式)

3.保护形式不收效(设置拜访暗码)- 衔接Redis成功

① 设置redis.conf

  • protected mode:yes
  • bind:注释掉,未绑定任何IP
  • 已设置拜访暗码

② 测验连通性

暂未验证

虽然protected mode处于敞开状况,但是因为设置了拜访暗码,所以保护形式理论上是不收效的,即本地内网其他主机仍能够长途衔接拜访。

4.绑定无效IP-无法衔接Redis

① 设置redis.conf

  • protected mode:yes
  • bind:192.168.1.122(redis本机地址为192.168.1.123)
  • 没有设置拜访暗码

② 测验连通性

此刻redis装备的是无效的IP地址,服务无法成功启动,所以客户端衔接被拒。验证经过,符合预期。

像测试产品需求一样测试Redis配置项protected mode(保护模式)

5.绑定本地回环地址、敞开保护形式-无法衔接Redis

① 设置redis.conf

  • protected mode:yes
  • bind:127.0.0.1
  • 没有设置拜访暗码

② 测验连通性

像测试产品需求一样测试Redis配置项protected mode(保护模式)

经过上图能够看出:因为绑定了本地回环地址,只能本地衔接,所以客户端在衔接redis的时分被拒了。验证经过,与希望成果共同。

6.绑定本地回环地址、封闭保护形式-无法衔接Redis

① 设置redis.conf

  • protected mode:yes
  • bind:127.0.0.1
  • 没有设置拜访暗码

② 测验连通性

像测试产品需求一样测试Redis配置项protected mode(保护模式)

经过上图能够看出:因为绑定了本地回环地址,只能本地衔接,所以客户端在衔接redis的时分被拒了。验证经过,与希望成果共同。

小结

  1. 以上便是简略验证“redis装备项protected-mode和bind二者之间的相互联络以及对长途拜访redis-server的影响”的过程,当然如果严格意义上的软件测验,需求考虑的场景肯定不止以上这些;
  2. 虽然强大、安稳如redis这般的产品,不会呈现一些上述测验场景中所掩盖到的低级错误,但作为测验人员,对待任何待测产品,都要时间抱有置疑的情绪,用成果说话、用事实说话;
  3. 由场景一、二、三能够得出结论:保护形式有必要在【① protected mode设置为yes② 没有bind ip③ 没有设置拜访暗码】三者一起满意时才能收效,保护形式收效后,其他主机无法衔接拜访redis;
  4. 由场景四能够得知,当bind绑定了非本机地址时,也会导致长途衔接redis-server失利(这不是废话嘛);
  5. 由场景五、六能够得出结论:bind绑定本地回环地址(127.0.0.1),与是否设置protected mode无关,一旦绑定本地回环地址,其他主机便不可再拜访redis;
  6. 所以,下次再遇到redis衔接失利或拜访被拒的状况,你知道该如何排查、处理了吗?