大規模な IP 範囲リスト (CIDR) を持つ Iptables を使用した Ipset

大規模な IP 範囲リスト (CIDR) を持つ Iptables を使用した Ipset

IP アドレス範囲のブロックに関する回答をいくつかここで読みましたが、以前にもこの目的で使用しました。と組み合わせてiptables使用​​することをお勧めします。ipsetiptables

インストールしただけですipsetまだ設定していません。

このサイトを見つけました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 ブロックのみを含むテキスト ファイルを入力すると、それらの集約が試行され、リストのサイズが縮小されます。

man ページから:

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.

aggregateUbuntu を含むほとんどの主要な Linux ディストリビューションにパッケージ化されています。

(その Web サイトからリストを取得して集約しようとしましたが、何も起こらなかったため、すでに集約されている可能性があります。複数の ipset を使用することもできますが、ここではそれがおそらく最善の方法です。)

答え2

通常、ipset リストの最大長は 65536 要素なので、ブロックする国ごとに個別のリストを使用する必要がある場合があります。

hash:netセットを使用すると、禁止したいCIDRレコードを直接追加できます。https://www.ipdeny.com/ipblocks/国レベルのブロック

ご質問については

  • ipset はシステムを大幅に遅くすることはありません。セットを保持するためにメモリをいくらか使用しますが、それ以外の負荷は目立たないはずです。
  • 攻撃者はどの国のクラウド/VPSサーバーでも使用できるため、fail2banは維持しておくのがよいでしょう。

最後に、iptablesとipsetを使用して特定の国をブロックすることに関する同様の質問がたくさんあるので、iptablesの設定の詳細については説明しません。 https://askubuntu.com/questions/868334/block-china-with-iptablesまたは類似

答え3

お使いいただけますか翻訳元代わりに xtables アドオンを使用しますか?

geoip と ipset xt_geoip は、(おそらく) 最も効率的な形式である (圧縮されていない) パックされた BLOB を使用します。 1 つの国をカーネルにロードするには、ディスク上のファイルと同じだけのコストがかかります。

ipset は任意の IPaddr-IPaddr 範囲をサポートしていないため、たとえば複数の Network/Prefixlength エントリを使用して近似する必要があります。さらに、ハッシュ セット タイプを使用する場合、ハッシュやツリーの性質上、一部のバケットが空のままになったり、追加のメタデータが必要になったりすることが想定されます。したがって、ipset ベースの geoip のメモリ フットプリントは当然大きくなります。ユーザー レポート1特定のケースでは 2 桁高くなる可能性があることを示しています (iptreemap)。

xt_geoip の検索時間は O(log2(ranges)) なので、20,000 の範囲内でアドレスを検索するには、アドレス比較 (最大 3 回) を含む反復が最大 15 回必要です。ipset はハッシュに Jenkins3 を使用しますが、これには独自の時間コストがあります。

これまでのところ、経験的なタイミングテストは実施されていません。

関連情報