我在第一台伺服器上有這個 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 連線。請隨意改變這一點。