試圖使 iptables 無狀態會導致無法預料的過濾
我試圖通過調整 iptables 以不跟踪 TCP 連接的狀態來提高我的伺服器的性能。我正在看這個指南: http ://cotdp.com/2011/07/nginix-on-a-256mb-vm-slice-24000-tps/
但是,如果我執行以下任何操作,似乎所有傳出連接都被切斷:
刪除此規則:
INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
添加這些:iptables -t raw -I OUTPUT -j NOTRACK iptables -t raw -I PREROUTING -j NOTRACK
在進行任一更改後立即使“ping google.com”返回有關無法找到“google.com”的錯誤(即 DNS 停止解析)。
以下是啟動時載入的規則,但其他規則隨後由 fail2ban 添加:
*篩選 -A 輸入 -i lo -j 接受 -輸入!-i lo -d 127.0.0.0/8 -j 拒絕 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A 輸出 -j 接受 -A 輸入 -p icmp -j 接受 -A 輸入 -p tcp --dport ssh -j 接受 -A 輸入 -p tcp --dport http -j 接受 -A 輸入 -p tcp --dport https -j 接受 -A 輸入 -p tcp --dport smtp -j 接受 -A 輸入 -p tcp --dport ssmtp -j 接受 -A 輸入 -j 拒絕 -A 轉發 -j 拒絕 犯罪
這是 iptables –list 的輸出:
鏈輸入(策略接受) 目標 prot opt 源目標 fail2ban-ssh tcp -- 任何地方任何地方多埠 dports ssh fail2ban-ssh-ddos tcp -- 隨時隨地多埠 dports ssh fail2ban-pam-generic tcp -- 任何地方的任何地方 接受所有——任何地方的任何地方 REJECT all -- 任何地方 loopback/8 reject-with icmp-port-unreachable 接受所有 - 任何地方任何地方狀態相關,已建立 接受 icmp——隨時隨地 ACCEPT tcp -- 任何地方 tcp dpt:ssh ACCEPT tcp -- 任何地方 tcp dpt:www ACCEPT tcp -- 隨時隨地 tcp dpt:https ACCEPT tcp -- 隨時隨地 tcp dpt:smtp ACCEPT tcp -- 隨時隨地 tcp dpt:ssmtp REJECT all - 任何地方都拒絕 - 使用 icmp-port-unreachable Chain FORWARD(政策接受) 目標 prot opt 源目標 REJECT all - 任何地方都拒絕 - 使用 icmp-port-unreachable 鏈輸出(策略接受) 目標 prot opt 源目標 接受所有——任何地方的任何地方 鏈 fail2ban-pam-generic (1 參考) 目標 prot opt 源目標 全部返回——任何地方任何地方 鏈 fail2ban-ssh (1 參考) 目標 prot opt 源目標 全部返回——任何地方任何地方 鏈 fail2ban-ssh-ddos (1 參考) 目標 prot opt 源目標 全部返回——任何地方任何地方
您有一條規則可以阻止所有傳入流量:
-A INPUT -j REJECT
而且您停止了連接跟踪,因此接受已建立連接的數據包的規則不再起作用:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
所以你的 DNS 數據包出去了,沒有被跟踪,然後被第一條規則拒絕。
您需要啟用跟踪才能使第二條規則起作用,或添加規則以允許來自“良好”來源的傳入流量。
Linux 連接跟踪不僅跟踪 TCP 連接,它還跟踪 UDP 偽連接和其他各種東西。
如果沒有 notrack 規則,會發生什麼。
- 您的系統發送一個 DNS 請求,這將創建一個連接跟踪條目。
- DNS 伺服器生成回复
- 回复符合您的“接受已建立和相關”規則。
使用 notrack 規則會發生什麼
- 您的系統會發送 DNS 請求,但不會創建連接跟踪條目。
- DNS 伺服器生成回复
- 回復不符合您的“接受既定和相關”規則。
- 回复失敗並符合您的全面拒絕規則。
那麼如何解決這個問題呢?要麼你必須明確允許響應流量而不依賴於你的狀態跟踪,要麼你必須對你的 notrack 規則有更多的選擇性。
對於 DNS,明確允許響應流量可能是合理的。您知道您的 DNS 伺服器是什麼,並且您可能信任它。
如果您的伺服器通常需要訪問 Internet 上的資源,那麼完全沒有連接跟踪意味著使用效率低得多的防火牆。
我希望您可以通過僅對進出您的網路伺服器的流量應用 notrack 來獲得很多性能優勢,而痛苦要少得多。例如
iptables -t raw -I OUTPUT -p tcp --sport http -j NOTRACK iptables -t raw -I PREROUTING -p tcp --dport http -j NOTRACK