web-dev-qa-db-ja.com

CentOS 4GB RAM、デュアルコア2.3ghzのiptablesに10,000エントリ?

FreePBX/AstriskがインストールされたLinuxボックスを実行しています。 ip2locationのリストを使用して中国と香港をブロックしました。 com /blockvisitorsbycountry.aspxWebサイト。私のfail2banは、ブロックを使用して3〜9分ごとにオフになりましたが、現在、通常は1日8〜10回の試行が非常に限られています。もっとブロックしたいのですが、テーブルにさらに10kを追加すると、システムを石器時代に戻す可能性があるのではないかと心配しています。どう思いますか?

1
Chad Taylor

心配しないでください、最悪の場合、それは鉄器時代のパフォーマンスになります。 (にやにや)

カーネルが単一のパケットごとに実行する必要のある多数のnetfilterルールは、システムパフォーマンスとリソース消費(CPUとメモリの両方)に悪影響を及ぼします。良い点は、問題を最小限に抑えるために使用できるトリックがいくつかあることです。

  1. 一般的な場合の「短絡」ルール:受信するパケットの90%以上は、既存の確立された接続または関連する接続の一部になります。したがって、-m state --state ESTABLISHED,RELATED -j ACCEPTルールbefore任意のフィルターリストルールを設定することで、これらすべてのパケットを長いフィルターリストに通す必要がなくなります。
  2. 特定のポートのみをフィルタリングする:Webサーバーを実行しているが、SSHブルートフォース攻撃のみが心配な場合は、フィルターリストを個別に配置することで、フィルターリストを介してすべてのHTTPトラフィックを処理する必要がなくなります。チェーンし、次のように、ポート22のトラフィックのみをフィルターに送信します。

    iptables -N geofilter
    iptables -I geofilter -s <ip range> -j DROP
    [etc etc etc]
    iptables -I INPUT -p tcp --dport 22 -j geofilter
    
  3. フィルタルールの「ツリー構造」:10,000個のフィルタリングルールがある場合がありますが、一致するのはそのうちの1つだけです。したがって、ツリー構造を使用して、たとえば各/ 8のすべてのルールを独自のチェーンに配置することにより、1つのパケットが通過する必要のあるルールの数を減らすことができます。前のgeofilterの例を拡張します。

    iptables -N geofilter_1
    iptables -N geofilter_2
    [etc etc etc all the way to geofilter_223]
    iptables -I geofilter -s 1.0.0.0/8 -j geofilter_1
    iptables -I geofilter -s 2.0.0.0/8 -j geofilter_2
    [etc etc etc]
    iptables -I geofilter_1 -s 1.2.3.0/24 -j DROP
    iptables -I geofilter_1 -s 1.5.9.0/18 -j DROP
    [etc etc etc for all rules in 1/8]
    iptables -I geofilter_2 -s 2.42.0.0/16 -j DROP
    [etc etc etc for all rules in 2/8]
    [continue pattern for all /8s]
    

    つまり、フィルタリングルールを通過する必要のあるパケットは、最大で223ルール(すべてのgeofilterルール)を通過する必要がありますが、8ごとのフィルターリストには多くのルールが含まれています。 。 (なぜgeofilterチェーンに254、255、または256のルールではなく223のルールがあるのか​​は、賢明な読者のための演習として残されています)。複数のレベルのツリーを作成することで、これをさらに効率的にすることができます。/4で分割し、次に/ 8で分割し、次に/ 12で分割するなどです。コストとメリットのトレードオフに合わせて、レベルをいくつでも追加できます。チェーンごとに異なる方法で行うこともできます。最初は/ 4で単一レベルに分割し、次に数百を超えるルールを持つチェーン、/ 8で分割し、まだ =数百を超えるルールがあり、/ 12で分割されます。

  4. 集計ルール:使用しているアドレスのリストが最適に集計されていないことを合理的に賭けます。それらが単一の国のためのものであったとしても、いくつかの国のリストをまとめると、あなたがまとめることができる異なる国から来た隣接するブロックがあるかもしれません。例として、中国の誰かが192.0.2.0/25を持っていて、香港の誰かが192.0.2.128/25を持っているとしましょう(はい、現実的なブロックではありませんが、RFC5737はドキュメント用に/ 24しか提供しません)。これを192.0.2.0/24に集約して、ルールを保存できます。

    これを開始すると、リスト内のルールの数を減らすことができることがよくあります大幅に。 (次のルールと組み合わせると、ルールリストを半分以上減らすことができます。)集計の実装は簡単です。 netmaskツールは、ブロックの任意のリストを取得し、CIDRブロックの最小限のリストを返します。

    netmask -c 192.0.2.0/25 192.0.2.128/25 192.0.3.0/24 192.0.1.0/25
      192.0.1.0/25
      192.0.2.0/23
    
  5. 否定的なルール:多くの場合、多数の小さなブロックが1つに集約され、多く大きなブロック、例外中央の1つの小さなチャンクになります。場合によっては、なんとかして世界の別の場所に逃げたいくつかの厄介な小さな/ 22を除いて、ほぼ全体の/ 8または/ 10が1つの国に割り当てられます。その場合、ホワイトリストに登録された小さなブロックのカップルに対してACCEPTルールを設定し、その後に、より大きなブロックをカバーするためのDROPルールを設定できます。最適なブロックを作成するには、ある程度のプログラミングが必要ですが、それはロケット科学ではありません。

注意すべき点の1つは、IPブロックは、特にIPv4のこれらの「終了時間」において、かなり定期的にジオロケーションを変更することです。このルールセットをただ解雇して忘れないようにしてください。地理リストの更新されたコピーを取得し、それらに基づいてフィルターリストを再構築します。そうしないと、ある日、フィルタリングしたブロックが自分のISPによって引き継がれ、以前にブロックしたIPアドレスが割り当てられたため、自分のサーバーから自分自身をロックアウトすることになります。 (実話)

10
womble

iptablesルールの主な問題は、ルールが順番に実行され、ルールセットのオッズが大きい場合、パケットにアクセスを許可するか拒否する前に、かなりの数のルールを解析する必要があることです。

Wombleの答え は、ルールを巧妙に順序付けることによって、その処理ペナルティを減らすためのかなりの数の戦略をすでに説明しています。最も重要なものは、 ステートフルファイアウォール 構成の使用のみです。新しい接続は完全なルールセットに対して検査され、その接続を確立する最初のパケットが検査および承認されると、同じ接続内の後続のすべてのパケットにアクセスが許可されます。

ビスタをブロックするDROPルールがいくつかあると仮定します。

# Source: http://www.ip2location.com/free/visitor-blocker
iptables -A INPUT -s 1.0.1.0/24 -j DROP
iptables -A INPUT -s 1.0.2.0/23 -j DROP
iptables -A INPUT -s 1.1.0.0/24 -j DROP
iptables -A INPUT -s 1.1.2.0/23 -j DROP
iptables -A INPUT -s 1.1.8.0/21 -j DROP
iptables -A INPUT -s 119.15.136.0/21 -j DROP
iptables -A INPUT -s 119.16.0.0/16 -j DROP
iptables -A INPUT -s 119.18.192.0/20 -j DROP
iptables -A INPUT -s 119.18.208.0/21 -j DROP

これらのルールは、 ipset ユーティリティを使用して、 single iptables rule に減らすことができます。

IPセットは、カーネルによって維持されるネットワークアドレスや範囲のリストであり、それに対するマッチングは、iptablesのシーケンシャルマッチングルールよりもはるかに高速です。

最初にIPセットを作成します( manual は、ランダムなサイズのネットブロックに対してタイプhash:netを推奨します):

ipset create blacklist-china hash:net hashsize 4096

ブロックするCIDR範囲を追加します。

ipset add blacklist-china 1.0.1.0/24
ipset add blacklist-china 1.0.2.0/23
ipset add blacklist-china 1.1.0.0/24
ipset add blacklist-china 1.1.2.0/23
ipset add blacklist-china 1.1.8.0/21
ipset add blacklist-china 119.15.136.0/21
ipset add blacklist-china 119.16.0.0/16
ipset add blacklist-china 119.18.192.0/20
ipset add blacklist-china 119.18.208.0/21

これで、ファイアウォール構成は次のようになります。

 iptables -m set --match-set blacklist-china src -j DROP
6
HBruijn

さらに別の方法は、iptablesのxt_geoipモジュールを使用することです。 ipsetsに対するパフォーマンスについてはテストしていませんが(ソースを正しく理解している場合、xt_geoipはd&cバイナリ検索を使用し、ipsetsはハッシュを使用します)。これの利点はおそらく簡単に更新できることです。

たとえば、Ubuntuはこれをデフォルトで xtables-addons-dkms で出荷しています。

3
Fox