
私は、ネットワークの監視、制御などのために設計した一連のスクリプトを持っています。これらのスクリプトで私が行うことの 1 つは、 のような iptables チェーンを作成することですiptables -N mychain
。次に、必要に応じてメイン テーブルにルールを挿入し、パケットをカスタム チェーンに送信して、そこにどのような目的を持たせたいかを決めます。
私の質問は、「更新」を行うスクリプトがあります。言い換えると、すべてのルールを削除して最初からやり直すことです。これは、奇妙な異常が発生した場合に役立ちます。iptables の一部を管理するものがあっても、手動で管理する人が多いです。(これが、すべての作業を別のテーブルで実行したいと思った理由です。)
チェーンをクリアしたい場合、それは簡単ですiptables -F mychain
。しかし、私がしない知っている方法は、組み込みチェーン(INPUT、OUTPUT など)でそのチェーンを参照する作成したルールをすべて削除することです。
私のアプリにバグがあったか、ユーザーがいじってテーブルをいじってしまったために、何らかの理由で INPUT チェーンにルールが 2 回追加されたと仮定します。これで、パケットはチェーンを 2 回通過することになります。つまり、2 回カウントされ、2 回ルーティングされるなどです。
この問題の明らかな解決策は、メイン チェーンを調べて、ジャンプ ターゲットがカスタム チェーンであるルールをすべて削除することです。しかし、その方法がわかりません。
以下に、想定される最悪の状況の例を示します。
iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST
悪意のある、または知識のない管理者が最下位の 3 つのルールを作成したと仮定します。
これで、発行するiptables -D INPUT -j TEST
と、作成したルールが削除されます。ただし、使用時のパラメータが一致する必要があるため、他のルールは削除されません-D
。そのため、自分のルールを慎重に削除したとしても、さまざまな理由でパケットが複数回そこに行き着く可能性があります。
メインチェーンをフラッシュすることは必ずしも適切ではありません。繰り返しますが、コマンドラインでiptablesを使用するのは一般的です(私自身もいつもそうしています)ので、盲目的にクリアするだけでは毎たとえ一時的なルールであっても、誰かが正当な理由で追加したものをルールによって削除できる場合があります。
明らかな解決策は、何らかの方法でどれでもチェーンの宛先となるルールを検索しTEST
、それらのルールを削除します。ただし、iptables のマニュアル ページには、これを実行できるコマンドは見つかりませんでした。
私が見た限り、どのユーザーにも当てはまる最も近いものは ですiptables -S
。iptables -S
出力を解釈するためのパーサーを作成して使用することもできますが、これは少し余分な作業になります。何らかのワイルドカード方式でルールを削除するより正確な方法があるかどうか疑問に思っていました。繰り返しますが、ジャンプ ターゲットが任意のチェーンであるルールをすべて削除します。
削除したいチェーンがあるが、そのチェーンが別の場所に参照を持っている場合、同様の状況が発生する可能性があります。その参照がどこにあるかを把握し、おそらくその参照も削除できるようにしたいでしょう。
これは可能ですか? それとも、出力を解釈するためのパーサーを書かなければならないのでしょうかiptables -S
?
答え1
これはかなり簡単です。iptables-saveを使用して現在のルールセットをファイルまたはstdoutに書き出し、-j YOURCHAIN
iptables-restoreを使用してすべてを削除し、結果をロードします。
これはパイプとしてやりたくなる
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
ただし、保存と復元を同時に実行してもうまく機能するかどうかはわかりません。保存と復元を分けた方が安全です。ルールセットへの途中更新が失われる小さな重要な領域が存在します。
答え2
おそらく構成全体を再ロードする以外に、これを解決する簡単な方法はないと思います。
おそらく、チェーンにドロップ ポリシーを追加することを検討する必要があります。そうすれば、少なくとも、熱心であれば、それほど熱心でない人にとっては問題が発生し、議論が巻き起こる可能性があります。
技術的な観点から、さまざまなコマンドの出力を解析する必要がある場合は、--line-num が役立つ場合がありますが、インデックスが毎回変更されないように、逆の順序 (高いものから低いもの) で削除することを忘れないでください。
答え3
高度な操作が必要な場合はiptables
、優れたPythonライブラリpython-iptables は、Python のプロジェクトでよく使用されます。は一見の価値があるかもしれません。 のプログラム インターフェイス (読み取りと変更の両方) を提供しますnetfilter
。 との相互運用性は、バイナリを呼び出してその出力を解析するのではなく、 C ライブラリ ( 、、および拡張機能)iptables
を使用することで実現されます。iptables
libiptc
libxtables
iptables
iptables