前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >像测试产品需求一样测试Redis配置项protected mode(保护模式)

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

作者头像
大刚测试开发实战
发布2022-11-14 14:32:20
1.1K0
发布2022-11-14 14:32:20
举报
文章被收录于专栏:大刚测试开发实战

前言

昨天介绍了《Windows&Linux&MacOS如何快速搭建Redis》。搭建完成,往往会出现同一内网下其他主机无法连接redis-server的情况,原因可能有:protected-mode(保护模式)已开启、bind绑定了无效的主机地址、bind设置了本地回环地址......为了彻底弄清楚protected-mode和bind对远程访问redis-server的影响,我特地设计了一些测试场景,像测试产品需求一样测试这两项配置。

一、redis配置项bind和protected mode解读

同软件测试的流程一样,在测试设计前,需要先弄懂产品需求(redis配置项bind和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:yesbind:192.168.1.123没有设置访问密码

1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值

1.连接成功2.插入成功3.value为0

3.开启保护模式,不生效(设置访问密码)

protected mode:yesbind:注释掉,未绑定任何IP设置访问密码

1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值

1.连接成功2.插入成功3.value为0

4.绑定无效ip

protected mode:nobind:192.168.1.122没有设置访问密码

1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值

连接失败

5.绑定本地回环地址-开启保护模式

protected mode:nobind:127.0.0.1没有设置访问密码

1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值

连接失败

6.绑定本地回环地址-关闭保护模式

protected mode:yesbind:127.0.0.1没有设置访问密码

1.通过python代码远程连接redis2.插入键值对:{"test1":0}3.获取键test1的值

连接失败

  • protected mode:yes,即开启状态
  • bind:注释掉,未绑定任何IP
  • 没有设置访问密码

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 2.开启保护模式,不生效(设置bind ip)

  • protected mode:yes
  • bind:192.168.1.123
  • 没有设置访问密码

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值1.连接成功 2.插入成功 3.value为0 3.开启保护模式,不生效(设置访问密码)

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

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值1.连接成功 2.插入成功 3.value为0 4.绑定无效ip

  • protected mode:no
  • bind:192.168.1.122
  • 没有设置访问密码

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 5.绑定本地回环地址-开启保护模式

  • protected mode:no
  • bind:127.0.0.1
  • 没有设置访问密码

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败 6.绑定本地回环地址-关闭保护模式

  • protected mode:yes
  • bind:127.0.0.1
  • 没有设置访问密码

1.通过python代码远程连接redis 2.插入键值对:{"test1":0} 3.获取键test1的值连接失败

2.python测试代码如下

通过一段Python代码简单测试redis连通性:

代码语言:javascript
复制
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被拒绝了,此时Redis正在保护模式下运行,因为已启用保护模式,未指定绑定地址,未设置访问密码。在此模式下,仅接受来自环回接口的连接,即本地连接。验证通过,与期望的结果一致。

2.保护模式不生效(设置bindip)-连接Redis成功

① 设置redis.conf

  • protected mode:yes
  • bind:192.168.1.123
  • 没有设置访问密码

② 测试连通性

尽管protected mode处于开启状态,但是因为bind绑定了本机IP地址,所以保护模式是不生效的,客户端连接redis时,也能够连接成功,如下图所示,连接redis成功,并成功获取到名为test1的key的value值为0,验证通过,与期望的结果一致:

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地址,服务无法成功启动,所以客户端连接被拒。验证通过,符合预期。

5.绑定本地回环地址、开启保护模式-无法连接Redis

① 设置redis.conf

  • protected mode:yes
  • bind:127.0.0.1
  • 没有设置访问密码

② 测试连通性

通过上图可以看出:由于绑定了本地回环地址,只能本地连接,所以客户端在连接redis的时候被拒了。验证通过,与期望结果一致。

6.绑定本地回环地址、关闭保护模式-无法连接Redis

① 设置redis.conf

  • protected mode:yes
  • bind:127.0.0.1
  • 没有设置访问密码

② 测试连通性

通过上图可以看出:由于绑定了本地回环地址,只能本地连接,所以客户端在连接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连接失败或访问被拒的情况,你知道该如何排查、处理了吗?
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、redis配置项bind和protected mode解读
  • 二、测试场景设计
    • 1.验证场景如下:
      • 2.python测试代码如下
      • 三、验证protected mode
        • 1.保护模式生效-连接Redis失败
          • 2.保护模式不生效(设置bindip)-连接Redis成功
            • 3.保护模式不生效(设置访问密码)-连接Redis成功
              • 4.绑定无效IP-无法连接Redis
                • 5.绑定本地回环地址、开启保护模式-无法连接Redis
                  • 6.绑定本地回环地址、关闭保护模式-无法连接Redis
                  • 小结
                  相关产品与服务
                  云数据库 Redis
                  腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档