Ipset 與具有大量 IP 範圍清單 (CIDR) 的 Iptables

Ipset 與具有大量 IP 範圍清單 (CIDR) 的 Iptables

我在這裡閱讀了一些關於阻止 IP 位址範圍的答案,並且之前已經用於iptables此目的。建議ipset與 結合使用iptables

我只安裝了IP集但還沒有配置它。

我找到了這個網站ip2location.com產生要依國家/地區禁止的 IP 清單。我選擇了定期定位我們網站的 5 個國家/地區,但這個清單非常龐大,256000 行

  • 使用時這個龐大的列表會減慢我的伺服器速度嗎ipset(在僅使用 IPtables 嘗試此操作之前,我懷疑這麼大的檔案可能會降低效能。)。
  • 如果是這樣的話,有什麼方法可以做到這一點?目前我使用fail2ban,但我認為nginx的配置沒有正確設定(我假設是正規表示式)。無論如何,我需要一種更穩健的方式。
  • 最後,我並不聲稱對 CIDR 的了解足以使這個清單更小(如果可能的話,聚合類似的 IP 範圍)。

例如,有幾個 /21 條目:

185.179.152.0/22

線上工具顯示該解析為:185.179。152.0 至 185.179。155.255

我認為沒有任何簡單的方法可以減少條目,因此請提供有關實施和效能問題的建議。

答案1

有一個名為 的命令列實用程式aggregate。它採用 CIDR 網路區塊清單並將連續區塊聚合到相應的較大區塊中。它還刪除了多餘的網路塊。

例如:

$ aggregate -q << EOF
> 192.168.0.0/24
> 192.168.1.0/24
EOF
192.168.0.0/23

向其提供僅包含 CIDR 區塊的文字文件,它將嘗試聚合它們,從而減小清單的大小。

從手冊頁:

DESCRIPTION
       Takes  a list of prefixes in conventional format on stdin, and performs
       two optimisations to attempt to reduce the length of the prefix list.

       The first optimisation is to remove any supplied prefixes which are su‐
       perfluous because they are already included in another supplied prefix.
       For example, 203.97.2.0/24 would be removed if 203.97.0.0/17  was  also
       supplied.

       The  second  optimisation identifies adjacent prefixes that can be com‐
       bined under a single, shorter-length prefix. For example, 203.97.2.0/24
       and 203.97.3.0/24 can be combined into the single prefix 203.97.2.0/23.

aggregate被打包在大多數主要的 Linux 發行版中,包括 Ubuntu。

(請注意,我從該網站提取了一份列表,並嘗試聚合它們,但沒有發生任何事情,因此它們可能已經聚合。您當然可以使用多個 ipset,這可能是這裡最好的做法。)

答案2

通常 ipset 清單的最大長度為 65536 個元素,因此您可能必須為要阻止的每個國家/地區使用單獨的清單。

使用 hash:net 設置,您可以直接新增要禁止的 CIDR 記錄。您可能想檢查https://www.ipdeny.com/ipblocks/對於國家級區塊

至於你的問題

  • ipset 不應該顯著減慢你的系統 - 它會使用一些內存來保存設置,但否則負載不應該是明顯的
  • 保留fail2ban是件好事,因為攻擊者可以使用任何國家的雲端/vps伺服器

最後,關於使用 iptables 和 ipset 來阻止特定國家/地區有很多類似的問題,因此我不會詳細介紹 iptables 設定詳細資訊 - 只需檢查 https://askubuntu.com/questions/868334/block-china-with-iptables或類似的

答案3

你能用xt_geoipxtables 插件代替?

geoip 與 ipset xt_geoip 使用(可能)最有效的格式,即(非壓縮)打包 blob。將一個國家/地區載入到核心中的成本與磁碟上檔案的成本一樣多。

由於 ipset 不支援任意 IPaddr–IPaddr 範圍,因此需要使用多個網路/前綴長度條目等來近似。此外,如果使用雜湊集類型,您可以假設,根據雜湊和/或樹的性質,某些儲存桶保持為空和/或需要其他元資料。因此,基於 ipset 的 geoip 的記憶體佔用自然會更大。使用者報告1表明在某些情況下它可能會高出兩個數量級(iptreemap)。

xt_geoip 的查找時間為 O(log2(ranges)),因此要尋找 20,000 個範圍內的位址,最多需要 15 次迭代,每次迭代進行位址比較(最多 3 次)。 ipset使用Jenkins3進行散列,本身有一定的時間成本。

迄今尚未進行實證時序測試。

相關內容