ipsetを使用したNetfilterのパフォーマンスの改善

iptables -Linuxファイアウォールへのインターフェース( netfilter )。 iptablesルールが多数あると、負荷が非常に高くなり、問題が発生する可能性があります。 この記事では、iptablesのパフォーマンスに影響するものと、それを改善する方法について説明します。

負荷の主な原因


そもそも、何が大量のルールで負荷を引き起こすのでしょうか? カーネルによって処理される各ネットワークパケットは、各チェーンのルールのリスト全体を比較する必要があるためです。 以下は、netfilterチェーンとパケットがそれらを通過する順序を反映した図です。



この図は、特定のパケットがどのチェーンを通過するかを示しており、負荷を評価できます。 1つの簡単なルールを見てみましょう。

-A INPUT -s 10.1.1.1/32 -p tcp --dport 25 -j DROP

このルールは、IPアドレス10.1.1.1からローカルマシンのポート25へのすべてのパケットをドロップするようにファイアウォールに指示します。 テーブル(-t)を指定していないため、デフォルト(-tフィルター)が使用されます。これが必要です。 DROPアクションが常に実行されるとはほど遠いことは明らかです。 ただし、送信元IPアドレスの比較は、ローカルマシンに入るパケットで行われます 。 そして、そのようなルールが何千もあるとしたら?

どうする


次に、ファイアウォールを高速化する方法について考えてみましょう。 最初の答えは明らかです-ルールの数を減らします。 しかし、特に元々正しく構成されていた場合は、録音を真剣に最適化できるとは考えられません。 どこかに、複数のIPアドレスのルールの代わりに、サブネットごとに1つのルールを記述できます。 どこかで、複数のポートのルールの代わりに、 -m multiport --dportsおよび--dports / --sports a,b,c (a、b、cはポート番号)を使用できます。 などなど。

分岐ルール、追加チェーン


もう1つのオプションがあります-ルールブランチの使用。 その本質は、同じタイプのルールが個別のチェーンにグループ化され、メインチェーンには、パケットの一般的な機能に応じてパケットを個別のチェーンにリダイレクトする1つのルールが残っていることです。 例を挙げましょう。 3つのルールがあります。

-A INPUT -s 10.1.1.1/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.2/32 -p icmp -j ACCEPT
-A INPUT -s 10.1.1.3/32 -p icmp -j ACCEPT


これらのルールを統一するものは何ですか? 同じプロトコルはicmpです。 これに基づいて、グループルールに関する記事をご覧ください。 一般に、この場合、ipsetを使用する方が効率的ですが、それについては後で詳しく説明します。 グループ化するには、新しいチェーンを作成してから、このチェーンにパケットを送信するルールを作成する必要があります。
チェーンPROT_ICMPを作成します。

iptables -N PROT_ICMP

このチェーンでルールを定義します。

-A PROT_ICMP -s 10.1.1.1/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.2/32 -j ACCEPT
-A PROT_ICMP -s 10.1.1.3/32 -j ACCEPT


ご覧のとおり、このチェーンのプロトコル(-p)をチェックしなくなりました。 ICMPパケットのみをこのチェーンに送信します。 最後に、すべてのICMPパケットをこのチェーンに送信します。

-A INPUT -p icmp -g PROT_ICMP

これで、ICMPでない場合、着信パケットは3つではなく1つのルールのみを通過します。

ipset


次に、次の状況を想定します。

-A INPUT -s 10.1.1.1/32 -j DROP
-A INPUT -s 10.1.1.2/32 -j DROP
-A INPUT -s 10.1.1.3/32 -j DROP


同じタイプの複数のルール。ただし、それらをグループ化したり、追加のチェーンを作成したりすることはできません。 そのような場合、多数のIPアドレスやポートをチェックする必要がある場合、 ipset助けになります。 ipsetは、 ip_setカーネルモジュール 、多数の補助ライブラリ、およびパラメーターを設定するためのipsetユーティリティです。 ディストリビューションのリポジトリには確実に存在するため、インストールに問題はありません。
次のように使用します。
*リストが作成されます:

ipset -N dropips iphash
dropips-リスト名、iphash-リストタイプ。 リストのタイプはman ipsetで見ることができ、それらはあらゆる好みに対応しています-ip-addresses、subnets、ports、mac-addressesを操作するためのものです。 iphashはIPアドレスの保存に使用されます;ハッシュの使用により、重複したIPアドレスがリストに追加されるのを防ぎます。
* IPアドレスがリストに追加されます。

ipset -A dropips 10.1.1.1

*リストを使用するためのルールが作成されます。

iptables -A INPUT -m set --set dropips src -j DROP
-m setはipsetモジュールの使用を示し、 --set dropipsはIPアドレスのリストを示し、 srcはIPソースのみを--set dropipsする必要があることを示し--set dropips 。 したがって、dropipsリストで指定されたIPアドレスからのすべてのパケットは破棄されます。

この記事では、カーネルのネットワークパラメーターの調整については説明しませんでしたが、ファイアウォールルールの合理的な構成に焦点を当てました。 ネットワークのチューニングに関する多くの情報を見つけることができます、これらはさまざまなネットです* Mem *、多数の接続の場合、conntrackを使用する-パラメータnet.netfilter.nf_conntrack_max、net.netfilter.nf_conntrack *タイムアウトなど

ご清聴ありがとうございました。
タイプミスを指摘してくれたivlisに感謝します。

Source: https://habr.com/ru/post/J108691/


All Articles