建立一個IPTABLES鏈,除非資料包來自某個端口,否則其規則將被忽略?

建立一個IPTABLES鏈,除非資料包來自某個端口,否則其規則將被忽略?

我想確認以下幾點。如果我創建一條鏈,其第一條規則是:

iptables -I INPUT -p tcp -m multiport --dports 25,465 -j name

這是否意味著鏈中任何進一步指定的規則都不會被檢查,除非資料包來自這些連接埠?

我正在使用fail2ban,並創建了一個帶有禁止規則的過濾器,該規則指定端口 25、465,使用-m multiport --dports 25,465.但這個過濾器最終會創建足夠的規則,有時該ksoftirqd過程會使用大量 CPU,並且網路會變得很慢。我注意到當伺服器在其他連接埠上發生大量 I/O 時會發生這種情況。

我假設每個資料包都在查看我的鏈中的所有規則。我希望可以透過添加上面看到的第一條規則來避免這種情況,以便不發送到連接埠 25 和 465 的封包不會費心檢查該鏈中的其餘規則。如果這不能做到這一點,我將不勝感激知道任何其他可能的解決方案。

答案1

不是“從”,而是“到”。--dports清單目的地端口。您所寫的規則表示:「如果封包傳送到我在 TCP 連接埠 25 或 465 上偵聽的服務,則在鏈中處理它name」。它將如何處理取決於該鏈的內容。如果不匹配任何最後行動該鏈中的( ACCEPT, REJECT, DROP) 規則,或如果它與操作相符的規則RETURN,則其處理將在呼叫鏈 ( INPUT) 中繼續,並使用該規則之後的規則。

預設情況下,fail2ban建立一個鍊和一個規則,該規則僅針對發送到特定連接埠的封包呼叫該鏈(除非您使用...-allports操作,這不是預設的)。在該鏈中,它為每個被禁止的 IP 新增了一條 DROP 規則。因此,例如,網頁伺服器資料包不會被發送到為sshd提供的監獄創建的鏈進行處理。因此,按照您建議的方式故意將某些連接埠「排除」在fail2ban處理之外是沒有成效的;它已經像這樣工作了。

為了避免使用fail2ban創建具有太多規則的鏈,請調查IP集相關行動。它不是創建一條鏈,而是f2b-jailname創建一個IP設定符合的單一規則引用 ipset。每個被禁止的 IP 都會加入到 ipset 中,而不是在鏈中建立單獨的規則。 ipset具有O(1)複雜度特性,這表示它的處理速度不依賴其中的項數;它最多可以包含 65536 個項目。

簡而言之,要使用它,您需要覆蓋您的監獄的預設banaction = iptables值。banaction = iptables-ipset您永遠不應該修改發行版提供的設定檔;相反,創建/etc/fail2ban/jail.local您添加覆蓋的文件:

[postfix]
bantime = 1h
enabled = true
banaction = iptables-ipset

(這將使用提供的postfix郵件過濾器,並對所有smtpd類型的服務做出反應。如果您使用其他郵件伺服器,請進行相應調整。)

實現更好的防火牆效率的其他方法是開始使用nftables框架而不是iptables.具有IP集的特點融合的,並且您可以使用 .fail2ban 來使用它banaction = nftables。大型設備的效率增益將大致相同。

相關內容