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