Linux 中安裝redis 外網可訪問

安全劍客發表於2020-08-06
在   中安裝了redis 服務。在 Windows 中安裝了 xampp 環境,以供 PHP 執行。

Linux 中安裝redis 外網可訪問Linux 中安裝redis 外網可訪問
PHP 程式碼如下:

connect('192.168.1.4', 6379);
$redis->set('tag', 'hello');
echo 'name:', $redis->get('tag');
?>

執行以上程式碼時,報錯如下:

Fatal error: Uncaught exception ‘RedisException’ with message ‘Redis server went away’ in xxxx
RedisException: Redis server went away in xxxxxx
解錯誤分析及解決辦法

錯誤的原因很簡單,就是沒有連線上 redis 服務,由於 redis 採用的安全策略,預設會只准許本地訪問。需要透過簡單配置,完成允許外網訪問。

修改 redis 的配置檔案,將所有 bind 資訊全部遮蔽。

# bind 192.168.1.100 10.0.0.1 
# bind 192.168.1.8 
# bind 127.0.0.1

修改完成後,需要重新啟動 redis 服務。

修改 Linux 的防火牆(iptables),開啟你的 redis 服務埠,預設是 6379。

-A INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT 
…… 
-A INPUT -j REJECT –reject-with icmp-host-prohibited

請注意,一定要將 redis 的防火牆配置放在 REJECT 的前面。然後執行 service iptables restart。

至此,訪問剛剛上面的程式碼,就能夠連結到 redis 服務,並且能夠正確顯示了。

關於bind

翻看網上的文章,此處多翻譯為"指定 redis 只接收來自於該 IP 地址的請求,如果不進行設定,那麼將處理所有請求,在生產環境中最好設定該項"。這種解釋會 totally 搞糊塗初學者,甚至是錯誤的。該處的英文原文為:

# If you want you can bind a single interface, if the bind option is not 
# specified all the interfaces will listen for incoming connections. 
# bind 127.0.0.1

該處說明 bind 的是interface,也就是說是網路介面。伺服器可以有一個網路介面(通俗的說網路卡),或者多個。打個比方說機器上有兩個網路卡,分別為 192.168.205.5 和 192.168.205.6,如果 bind 192.168.205.5,那麼只有該網路卡地址接受外部請求,如果不繫結,則兩個網路卡口都接受請求。

OK,不知道講清楚沒有,在舉一個例子。在我上面的實驗過程中,我是將bind項註釋掉了,實際上我還有一種解決方案。由於我redis伺服器的地址是 192.168.1.4 。如果我不註釋bind項,還有什麼辦法呢?我可以做如下配置:

# bind 192.168.1.4

這裡很多人會誤以為繫結的ip應該是請求來源的ip。其實不然,這裡應該繫結的是你redis伺服器本身接受請求的ip。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2709692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章