
さまざまなメトリック (例: インターフェイスの帯域幅の使用状況) を監視し、それに応じてルールを変更するスクリプトを作成していますiptables
。これらの変更は、少なくとも 1 秒あたり 2 回、最大で 1 秒あたりに発生する可能性があります4 * number of interfaces
。
問題は、ルールの変更をどのように処理するかがわからないことiptables
です。再コンパイルされてスクリプトが CPU に大きな負荷をかけるのでしょうか? または、ルールの変更中にまだ処理中のパケットはどうなるのでしょうか? それらはドロップされるのでしょうか? そういった懸念があります。
iptables ルールが急速に変化すると問題が発生しますか?
編集: 私の特定のアプリケーションでは、すべてのルールがすでに設定されています。特定のルールを有効または無効にする (追加または削除する) というものです。つまり、テーブルが時間の経過とともに大きくなり、極端に大きくなることはありません。
答え1
ルールをどうやって変えるのですか?
コマンドを繰り返し呼び出しますかiptables
? iptables の動作方法により、パフォーマンスに大きな影響が出ます。
- ネットフィルタのテーブル/チェーン全体を取得する
- 要求に応じて1つの変更を実行する
- ネットフィルタテーブル/チェーン全体をカーネルにロードし直す
それは起こるだろう一つ一つの iptables
呼び出し。
問題は、ルールにどのような変更を加えるのかということです。
送信元アドレスや宛先アドレスに基づいてルールを追加/削除する場合は、ipset
代わりに を使用する必要があります。
ただし、他のパラメータをその場で変更する(たとえば、rate
一致の頻度を増やす/減らす、QoS フラグを変更するなど)などの理由でルールを追加/削除する場合は、おそらくipset
適さないでしょう。
一方、スクリプトが変更を実行する場合一斉に次のようにすることも検討してください:
- ネットフィルタのテーブル/チェーン全体を取得する
- ユーティリティを使用することもできます
iptables-save
が、スクリプトの記述方法によっては、それを実行できるライブラリがあるかもしれません。
- ユーティリティを使用することもできます
- 必要な変更をすべて一度に実行
- ネットフィルタテーブル/チェーン全体をカーネルにロード(コミット)します。
- ユーティリティを使用する
iptables-restore
か、ステップ1と同様に、それを実行できるライブラリを使用できます。
- ユーティリティを使用する
編集:
ああ、ルールはすでに表にあるので、条件一致オン/オフを切り替えます。
-m condition --condition $NAME
ルールに挿入しますiptables
。
これにより、ファイルが作成されます。ファイルに が含まれている場合は一致が成功し、そうでない場合はファイルに が含まれている場合は/proc/net/ipt_condition/$NAME
一致が成功します。1
0
(もちろん、否定を使用して!
一致を反転することもできます。)
例えば:
iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT
ルールを有効にするには:
echo 1 > /proc/net/ipt_condition/allow_880
無効にするには:
echo 0 > /proc/net/ipt_condition/allow_880
(好きな名前を自由に使用できますが、簡単に識別できる名前にすることをお勧めします。名前には最大長の制限がありますが、どれくらいだったかは覚えていません。)
編集1a:
すでにテーブルを作成している場合、編集する最も簡単な方法は、の出力を保存しiptables-save
、それを編集し(条件一致を必要とするルールに追加し)、またはを使用してファイル全体をロードすることiptables-restore
です。iptables-apply
覚えておいてください: 1 つの条件ファイルで複数のルールを制御できます。本当に必要な場合を除き、ルールごとに 1 つのファイルを用意する必要はありません。
編集1b:
@AB がコメントで述べたように (ありがとう!)、-m condition
ディストリビューションに組み込まれている iptables の標準機能ではない可能性があります。その場合は、たとえば、追加のパッケージをインストールする必要がある可能性がありますxtables-addons
。
iptables
(申し訳ありませんが、私は Gentoo を使用しており、 Gentoo 上のパッケージはカーネルの .config に単純に従うため、これについては忘れていました。)
答え2
この場合、nftables の方が適している可能性があります。nftables は、複雑なルール セットや頻繁な変更がある場合に特に、iptables よりも効率的でスケーラブルになるように設計されています。Linux カーネルへの統合と合理化された構文により、より優れたパフォーマンスを提供します。