問題
我在服務器上有兩個 Redis 實例,服務端口號分別是 6379 和 6380,Redis 服務器地址假設為 10.0.0.12。其中 6379 這個實例不需要密碼即可訪問,6380 需要密碼訪問。
在正常使用幾天后,本機突然無法訪問 6379 這個實例,telnet 無法訪問到端口。但是遠程服務器 10.0.0.13 可以訪問 Redis 服務器的 6379 實例。
查找原因
想了所有的可能以后,隱約覺得問題可能在防火墻上,之前從沒關心過防火墻設置,確實也沒動過這里,但還是要看一看。
先看一下防火墻設置的規則,在 10.0.0.12 Redis 所在的服務器上執行:
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.0.0.13 0.0.0.0/0 tcp dpt:6379
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:60115
有問題了,這里第一條規則,確保了 10.0.0.13 可以訪問 Redis 6379 端口。解釋了為什么遠程服務器可以訪問 6379 Redis 實例。
第二條規則有點不一樣,DROP 是什么意思呢?查了一下文檔:DROP 丟棄數據包不予處理。丟棄的是所有的數據包哦,所以,從 10.0.0.13 以外所有的服務器訪問 6379 都是不通的。
解決方法
既然找到了問題,那就把這條防火墻規則刪除看看。
上面我們看到防火墻設置了 3 條規則,其中第 2 條是需要刪除的,刪除的命令是:
iptables -D INPUT 2
執行完以后,再看一下規則。
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 10.0.0.13 0.0.0.0/0 tcp dpt:6379
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:60115
Drop 那條已經被刪除了。
再訪問 Redis 6379 端口就沒有問題了。
最后我的疑惑是:這條防火墻規則到底是誰設置的?