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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 同一内网下其他主机无法连接redis-server的原因可能有:protected-mode(保护模式)已开启、bind绑定了无效的主机地址、bind设置了本地回环地址。

前言


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

一、redis.conf中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代码远程连接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:no
  • 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连通性:

importredisclassRedisHandler:
def__init__(self, host, port=6379, db=0):
self.client=redis.StrictRedis(host=host, port=port, db=db)  # 生成客户端连接,StrictRedis()默认使用连接池,不必再单独使用ConnectPooldefset_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)
defget_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连接失败或访问被拒的情况,你知道该如何排查、处理了吗?
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
弹性计算 测试技术 持续交付
阿里云云效产品使用合集之如何进行自动化测试
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3天前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
15 1
|
1天前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
1月前
|
NoSQL Java Linux
Redis6入门到实战------ 六、Redis_Jedis_测试
这篇文章介绍了如何使用Jedis客户端连接Redis,并进行基本的数据类型操作测试,包括字符串、列表、集合、哈希和有序集合的相关API使用示例。
Redis6入门到实战------ 六、Redis_Jedis_测试
|
1月前
|
NoSQL Java Linux
Jedis测试redis。(redis在linux虚拟机中)
该博客文章提供了使用Jedis客户端连接Linux虚拟机中的Redis服务器的步骤,包括Maven依赖配置、测试用例编写以及测试结果的截图。
|
30天前
|
前端开发 JavaScript 测试技术
[译] React 测试驱动开发:从用户故事到产品
[译] React 测试驱动开发:从用户故事到产品
|
1月前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
|
1月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
|
1月前
|
DataWorks 安全 测试技术
DataWorks产品使用合集之调用starrock的测试环境和生产环境是否需要两个资源组
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
1月前
|
存储 缓存 NoSQL
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决
Redis深度解析:部署模式、数据类型、存储模型与实战问题解决