為什麼防火牆似乎間歇性運作?

為什麼防火牆似乎間歇性運作?

我在第一台伺服器上有這個 iptables 規則,它的角色是透過 LAN 適配器連接到第二台 mysql 伺服器的客戶端。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT

當我這樣做時,發生的事情是:

service iptables restart

似乎與第二個伺服器的所有MYSQL 連接都可以正常工作,但只能持續一小段時間,通常為1-2 分鐘,但在這1 -2 分鐘內,與nginx(Web 伺服器,80 連接埠)的連接不起作用。 1-2分鐘後,Web伺服器可以工作,而MYSQL不能工作。到目前為止也嘗試過 iptables-save 指令,但沒有任何改變。

這是第二個 mysql 伺服器的防火牆配置:

    *filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

答案1

您應該將預設策略設定為DROP以防萬一您的最後一個包羅萬象的規則被意外刪除;像這樣 :

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]

現在,在第二台伺服器上。

-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

此規則符合目標為 192.168.1.1、來源連接埠為 1024 到 65535、目標連接埠為 3306、狀態為 new 或已建立的連線。你想太多了;如果你想允許 MySQL 連接,你只需要匹配目標端口,並且如果你想將其鎖定到特定的來源 IP 或接口,則可以選擇新增來源和/或介面參數。

-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT

lo已經具有存取權限,因為您的第一條-A INPUT -i lo -j ACCEPT規則將匹配來自環回的任何內容。

-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

好吧,現在您允許整個子網,但這已經更好了並且應該可以工作。

-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT

與上面相同,無論如何已經允許環回。

-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT

現在您允許來自目標連接埠為 3306 的 eth1 的所有內容。

-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

你的輸出策略是接受一切,無論如何,這個規則是毫無意義的。

我很確定你的問題是因為狀態模組已被棄用並且可能被刪除,所以你應該使用 conntrack。

回顧:

第一個伺服器:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT

第二台伺服器:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT

這將允許所有源自 eth1、192.168.1.0/24 的 SSH 連線和 MySQL 連線。請隨意改變這一點。

相關內容