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