Linux

試圖使 iptables 無狀態會導致無法預料的過濾

  • August 8, 2016

我試圖通過調整 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

引用自:https://serverfault.com/questions/426029