tft每日頭條

 > 圖文

 > redis 配置測試

redis 配置測試

圖文 更新时间:2024-12-20 09:21:00
前言

昨天介紹了《Windows&Linux&MacOS如何快速搭建Redis》。搭建完成,往往會出現同一内網下其他主機無法連接redis-server的情況,原因可能有:protected-mode(保護模式)已開啟、bind綁定了無效的主機地址、bind設置了本地回環地址......為了徹底弄清楚protected-mode和bind對遠程訪問redis-server的影響,我特地設計了一些測試場景,像測試産品需求一樣測試這兩項配置。

一、redis配置項bind和protected mode解讀

同軟件測試的流程一樣,在測試設計前,需要先弄懂産品需求(redis配置項bind和protected-mode)是什麼

redis 配置測試(像測試産品需求一樣測試Redis配置項protected)1

  • 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

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連通性:

    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 mode1.保護模式生效-連接Redis失敗

    ① 設置redis.conf

    • protected mode:yes,即開啟狀态
    • bind:注釋掉,未綁定任何IP
    • 沒有設置訪問密碼

    ② 測試連通性

    執行後報錯如下:

    redis 配置測試(像測試産品需求一樣測試Redis配置項protected)2

    通過上圖可以看出:

    連接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 配置測試(像測試産品需求一樣測試Redis配置項protected)3

    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 配置測試(像測試産品需求一樣測試Redis配置項protected)4

    5.綁定本地回環地址、開啟保護模式-無法連接Redis

    ① 設置redis.conf

    • protected mode:yes
    • bind:127.0.0.1
    • 沒有設置訪問密碼

    ② 測試連通性

    redis 配置測試(像測試産品需求一樣測試Redis配置項protected)5

    通過上圖可以看出:由于綁定了本地回環地址,隻能本地連接,所以客戶端在連接redis的時候被拒了。驗證通過,與期望結果一緻。

    6.綁定本地回環地址、關閉保護模式-無法連接Redis

    ① 設置redis.conf

    • protected mode:yes
    • bind:127.0.0.1
    • 沒有設置訪問密碼

    ② 測試連通性

    redis 配置測試(像測試産品需求一樣測試Redis配置項protected)6

    通過上圖可以看出:由于綁定了本地回環地址,隻能本地連接,所以客戶端在連接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連接失敗或訪問被拒的情況,你知道該如何排查、處理了嗎?

    更多幹貨,歡迎WX關注【測試開發實戰】

    ,

    更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

    查看全部

    相关圖文资讯推荐

    热门圖文资讯推荐

    网友关注

    Copyright 2023-2024 - www.tftnews.com All Rights Reserved