約100万のIPアドレスをブラックリストに登録するには、IPtablesまたはヌルルートを使用しますか?


22

クライアントが100万個未満の個々のIPアドレス(サブネットなし)のセットをブラックリストに登録する必要があり、ネットワークパフォーマンスが懸念される状況に遭遇しました。IPTablesルールは、ルートよりもパフォーマンスへの影響が少ないと推測しますが、それは単なる推測です。

IPアドレスの長いリストをブラックリストに登録するためのソリューションとして、IPTablesまたはnullルーティングのいずれかを支持する確固たる証拠やその他の正当性はありますか?この場合、すべてが自動化されているため、使いやすさは実際には問題になりません。

11月26日編集

いくつかのテストと開発の後、これらのオプションはどれも機能しないようです。ルート検索とiptablesの両方がルールセットを介して線形検索を実行し、この多くのルールを処理するのに時間がかかりすぎるようです。最新のハードウェアでは、iptablesブラックリストに100万個のアイテムを入れると、サーバーの速度が1秒あたり約2ダースまで低下します。そのため、IPTablesとnullルートが出ています。

ipset、Jimmy Hedmanが推奨しているように、セットで65536個を超えるアドレスを追跡できないことを除いて、素晴らしいと思います。

このように多くのIPをブロックする唯一の解決策は、アプリケーション層でインデックス付きルックアップを実行することです。そうではありませんか?


詳しくは:

この場合の使用例は、IPアドレスの「既知の攻撃者」リストがWebサーバー上の静的コンテンツにアクセスするのをブロックすることです。FWIWでは、Apacheを介したブロックの実行Deny fromは、線形スキャンも実行するため、同様に遅くなります(そうでない場合)。


参考までに:最終的な作業ソリューションは、Apacheのmod_rewriteをberkeley DBマップと組み合わせて使用​​して、ブラックリストに対してルックアップを行うことでした。バークレーDBのインデックス付きの性質により、リストはO(log N)のパフォーマンスに合わせてスケーリングできます。


5
ipset(ipset.netfilter.org)は、この種の問題を処理するために設計されたものではありませんか?
ジミーヘッドマン

@JimmyHedman:それを答えにしてください。そして、3つの方法すべてを実行するベンチマークに提案を追加します。)
MikeyB

あなたが解決しようとしている問題についてもう少し情報を提供できるかどうか興味がありますか?おそらく1MのIPアドレスをブロックすることは問題を解決する方法ではないでしょうか?
SpacemanSpiff

これだけの数のアドレスをブロックする理由を知り、INPUTトラフィックまたはFORWARDトラフィックをフィルタリングするかどうかを知ることは多くの助けになります。
ジュリアーノ

ここでは、ipsetがiptablesルールを通常のiptablesルールよりも約11倍速くする方法を確認できます。daemonkeeper.net/781/mass-blocking-ip-addresses-with-ipsetこのヘルプを願っています。
エイリアントレス

回答:


15

ルックアップの数を減らすために、iptablesを使用してマルチレベルツリーを構築してみてください。

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

など-ネストレベルを追加します。明らかに、ルールを自動的に構築する方法が必要であり、1人以上の犯罪者がいるネットワークだけにチェーンを持たせる必要があります。この方法で、かなり大幅に実行する必要があるルックアップの数を減らすことができます。実際に動作します。


これは動作するように聞こえ、ファイアウォールルールルックアップの時間の複雑さをO(n)からO(log n)に効果的に減らし、iptablesに検索ツリーを効果的に構築します。
ペルフォンツヴァイベルグク

このルートに進むことに決めた場合、何らかのアルゴリズムを使用してIPアドレスのリストからバランスの取れたバイナリ検索ツリーを構築し、その検索ツリーの構造をIPtablesルールのセットとして単純にダンプすることが役立つでしょう。
ペルフォンツヴァイベルグク

@Per von Zweigbergk-確かに...または、より深く検索する必要のない早めにツリーを剪定してください。ただし、その不条理な量のルールのロードには多くの時間がかかります。
PQD

これは非常に良いアプローチです。明らかに、維持するには多少の処理が必要ですが、それは正しい考えだと思います。
タイラー

3
@pQdはiptablesなどで以前に失敗した後、BerkeleyデータベースでRewriteMapを使用してapacheでソリューションを実装しました。しかし、ループでiptablesを使用する私の最速のメカニズムは、1秒あたり約100のルールをロードしましたが、iptables-restoreは約4秒でセット全体を実行しました。これは、最高級のデスクトップコンピューター上にあります。RewriteMapメカニズムは、パフォーマンスに対する検出可能なほど低い影響を与えます。
タイラー

11

これがまさにそのipset目的です。

ウェブサイトhttp://ipset.netfilter.org/から:

あなたがしたい場合は

  • 複数のIPアドレスまたはポート番号を保存し、1回でiptablesによるコレクションと照合します。
  • パフォーマンスを低下させることなく、IPアドレスまたはポートに対してiptablesルールを動的に更新します。
  • 単一のiptablesルールで複雑なIPアドレスとポートベースのルールセットを表現し、IPセットの速度の恩恵を受ける

ipsetが適切なツールかもしれません。

これはnetfilterコアチームメンバーのJozsef Kadlecsik(REJECTターゲットも作成した)によって作成されているため、これは私が考えることができる最良の選択です。

最近のカーネルにも含まれています。


私が見た限りでは、ipsetは65kのIPアドレスで最高です。1Mエントリを処理できるセットタイプはありますか?
タイラー

7
hash:ipセットタイプを使用すると、非常に多くのアドレスを持つことができます。1000000を試してみましたが、パフォーマンスは非常に良好でした。セットをチェックする前に-m state --state ESTABLISHEDルールを設定すると、大量のパケットを処理するときにパフォーマンスを向上させる新しい接続でのみセットをチェックするようにできます。
マシューイフェ

ただし、1Mのアドレスを持つipsetのメモリ使用量が大きくなり始めることは言及する価値があります。netfilterメーリングリストのこの投稿によると、2015年のipsetハッシュサイズの公式H * 40byte + (N/4 + N%4) * 4 * element sizeは、1.5mスロットハッシュの1Mアドレスに対して約64MBになります。apache / berkdbソリューションを使用すると、データがディスクに保存され、アクティブなアドレスのページのみがロードされます。
Mコンラッド

5

私自身はこれをテストしていませんが、あなたの問題の説明を聞いたとき、私は即座に「pf」と考えました(OpenBSDから)。

pfあなたが探しているものだけかもしれないアドレステーブルの概念を持っています。

私が行ったいくつかの非常に大まかな研究によると、これはのスケーリングよりも優れている可能性があるようですipsetPF FAQのランタイムオプションに関する章によるとチューニングなしですぐに使用できるpfは、合計1,000テーブルをサポートし、デフォルトですべてのテーブルで合計200,000エントリをサポートします。(システムの物理メモリが<100MBの場合は100,000)。これは、少なくともこれをテストして、何らかの有用なレベルで機能するかどうかを確認することを検討する価値があると考えるようになります。

もちろん、サーバーをLinuxで実行していると想定しているので、pf(OpenBSDやFreeBSDなど)でOSを実行する別のファイアウォールボックスが必要になります。また、あらゆる種類のステートフルパケットフィルタリングを廃止することで、スループットを改善できる場合があります。


クライアントのサーバーアーキテクチャをBSDに変換することは、実際にはオプションではありません。少なくとも、箱から出して考えてください。
タイラー

2
サーバーアーキテクチャ全体をBSDに変換する必要はありません。実際のサーバーの前にファイアウォールを構築すれば十分です。(VMで行うには簡単です。)
ペルフォンツヴァイベルク

2

FIB_HASHの代わりにFIB_TRIEを使用して調査しましたか。

FIB_TRIEは、プレフィックスカウントに対してはるかに優れたスケーリングを行う必要があります。(/ 32s nullルートはまだプレフィックスであり、非常に具体的です)

使用するには、独自のカーネルをコンパイルする必要があるかもしれませんが、役立ちます。

FIB_TRIEノート


2

後世:ipsetドキュメントによると、セットのデフォルトサイズは65536です。これはオプションで変更できます。

maxelemこのパラメーターは、すべてのハッシュタイプセットのcreateコマンドに有効です。セットに格納できる要素の最大数、デフォルトは65536を定義します。例:ipset create test hash:ip maxelem 2048.

私はまだコメントできないので、これをここに置きます。


1

将来この問題に出くわした人のためのいくつかの役立つメモ:

まず、必要のないトラフィックを分析しないでください。たとえば、TCPトラフィックをブロックしている場合は、SYNパケットのみをフィルタリングします。そのようにして、接続ごとに1回だけフィルターをヒットします。必要に-m state応じて使用できますが、接続追跡には独自のオーバーヘッドがあり、パフォーマンスが問題になる場合は回避することができます。

第二に、100万個のルールをiptablesに入れるには長い時間がかかります:数分。その数のエンティティを追跡する必要がある場合は、おそらくnetfliterから遠ざけることをお勧めします。ルールセットの大きさが違いを生みます。

第三に、目標は線形スキャンを避けることです。しかし、残念ながら、iptablesとiproute2はどちらも本質的に線形です。ルールをバイナリツリースタイルから多数のチェーンに分割して、相談するルールの数を制限できますが、それでも、iptablesはこのサイズの問題にはあまり適していません。動作します、貴重なリソースの無駄です。

第4に、そして最も重要なこととして、ユーザースペースにワークロードをプッシュすることは悪い考えではありません。これにより、独自のタイトなコードを記述したり、問題セットに合わせて市販のソリューションを使用したりできます。前述のように、この問題に対する私自身の解決策は、Apacheのmod_rewriteシステムを介してトリガーされるBDBルックアップを使用することでした。これには、有効なリクエストが送信された後にのみ、セッションごとに1つのルックアップのみをトリガーするという追加の利点がありました。この場合、パフォーマンスは非常に速く、ブロックリストのコストはほとんど無視できました。

-j QUEUEターゲットをとともに使用して、iptablesで同様のユーザー空間操作を行うことができますlibnetfilter_queue。このツールは強力でシンプルであり、文書化が不十分です。公式ドキュメントの一部ではない多くの興味深い資料がウェブ上に散らばっているので、できるだけ多くの情報源からできるだけ多くの情報源を読むことをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.