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に感謝します。



All Articles