45

ルールを簡単に追加および削除できるようにするだけでなく、既存のルールをクエリする必要があります。これを行うためのAPIは見つかりませんでした。足りないものはありますか?

私が解決策に最も近いのは、iptables-save | iptables-xmlルールを追加/削除するためにiptablesコマンド自体をクエリして手動で呼び出すために使用することです。私が検討したもう1つの解決策は、アプリケーションのデータベースからルールセット全体を再生成し、チェーン全体をフラッシュしてから、再度適用することです。しかし、これをアトミックに行う方法がない限り、パケットをドロップしたくないので、これを避けたいと思います。もっと良い方法があるのだろうかと思います。

CのAPIは素晴らしいでしょう。ただし、これをスタンドアロンのsuidプログラムに組み込むことを計画しているので、これを任意の言語で実行するライブラリも問題ありません。

4

9 に答える 9

23

netfilter FAQから:

残念ながら、その答えは次のとおりです。

今、あなたは「しかし、libiptcはどうですか?」と思うかもしれません。メーリングリストで何度も指摘されているように、libiptcはパブリックインターフェイスとして使用されることを意図したものではありませんでした。安定したインターフェースを保証するものではなく、Linuxパケットフィルタリングの次の化身でそれを削除する予定です。libiptcは低層であるため、とにかく合理的に使用できません。

このようなAPIには根本的な不足があることを十分に認識しており、その状況の改善に取り組んでいます。それまでは、system()を使用するか、iptables-restoreのstdinへのパイプを開くことをお勧めします。後者の方がパフォーマンスが向上します。

于 2008-09-20T22:14:52.873 に答える
13

iptables-save と iptables-restore を使用してルールを照会および再生成することは、最も効率的な方法です。これらは、以前はシェル スクリプトでしたが、現在は非常に効率的に動作する C プログラムです。

ただし、iptables の保守をより簡単にするツールがあることを指摘しておく必要があります。ほとんどの動的ルールセットは、次のように実際には何度も繰り返される同じルールです。

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT

ポート 22 にアクセスできるポートを変更するたびにこれらのルールを置き換える (ポート ノッキングなどに便利) 代わりに、ipsets を使用できます。ビズ:

ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24

セットは、IP アドレス、ネットワーク、ポート、MAC アドレスを保持でき、それらのレコードにタイムアウトを設定できます。(1 時間だけ何かを追加したいと思ったことはありませんか?)。

あるセットを別のセットと交換するアトミックな方法さえあるため、更新とは、新しい一時セットを作成し、それを既存のセットの名前として交換することを意味します。

于 2008-09-20T23:49:28.467 に答える
9

iptables の REST API であるrfwの使用を検討してください。これは、潜在的に同時発生する可能性のあるさまざまなソースから iptables コマンドをシリアル化し、その場で iptables をリモートで実行します。

rfw は、複数のボックスでファイアウォール ルールを更新しようとする分散システム用に設計されていますが、localhost インターフェイス上の単一のマシンでも実行できます。次に、この場合はプレーン HTTP で実行できるため、SSL と認証のオーバーヘッドを回避できます。

サンプル コマンド:

PUT /drop/input/eth0/11.22.33.44

これは以下に対応します:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP

ルールを挿入および削除したり、現在のステータスをクエリして既存のルールを JSON 形式で取得したりできます。

GET /list/input

免責事項: 私はそのプロジェクトを開始しました。MITライセンスのオープンソースです。

于 2014-03-25T22:49:40.860 に答える
5

私が理解している限り(参照はそれについて言及していないようですが)、iptables-restoreアトミックです。最後に、COMMIT行が読み取られると、(内部インターフェースでは使用することを想定していない)呼び出しが行わiptablesれ、新しいルールセットで呼び出されます。iptc_commitlibiptcsetsockopt(SO_SET_REPLACE)

それはあなたが得ることができるのと同じくらいアトミックに聞こえます:1つのカーネル呼び出しで。ただし、より知識のある当事者がこれに異議を唱えるよう招待されています。:-)

編集:あなたの説明が正しいことを確認できます。iptables-restoreカーネルでアトミック操作として実行されます。

さらに具体的に言うと、「のみ」の操作はCPUごとにアトミックです。ルールセットBLOB全体をCPUごとに保存するため(キャッシュの最適化のため)。

于 2008-09-20T22:13:15.593 に答える
3

これらのルールを管理するためのAPIは意図的にありません。あなたはそうしたくないはずです。か何か。

/ sbin / iptablesの実行のパフォーマンスを気にする、十分に動的なルールが必要な場合は、他の方法があります。

  • 「最近の」一致やIPセットの一致などを使用すると、ルールセットを変更せずに、ブラック/ホワイトリストからIPアドレスを追加/削除できます。
  • NFQUEUEを使用してフィルタリングするために、パケットをユーザースペースに渡すことができます
于 2008-09-20T22:02:27.897 に答える
2

今朝目覚めると、ロシアからサービス拒否 (DOS) 攻撃を受けていました。彼らは何十もの IP ブロックから私を攻撃していました。IP の大規模なプールまたは何らかのプロキシ リスト/サービスがあったに違いありません。IP をブロックするたびに、別の IP が表示されました。最後に、スクリプトを探したところ、独自のソリューションを作成する必要があることがわかりました。以下は少しアグレッシブですが、TOP LOAD LEVEL を 200 を超えて実行していました。

これは、リアルタイムで DOS をブロックするために私が書いた簡単なスクリプトです。

cat  **"output of the logs"** | php ipchains.php **"something unique in the logs"**

==> PHP スクリプト:

<?php

$ip_arr = array();

while(1)
{
   $line = trim(fgets(STDIN)); // reads one line from STDIN
   $ip = trim( strtok( $line, " ") );

   if( !array_key_exists( $ip, $ip_arr ) )
      $ip_arr[$ip] = 0;

   $regex = sprintf( "/%s/", $argv[1] );

   $cnt = preg_match_all( $regex, $line );

   if( $cnt < 1 ) continue;

   $ip_arr[$ip] += 1;

   if( $ip_arr[$ip] == 1  )
     {
//     printf( "%s\n", $argv[1] );
//     printf( "%d\n", $cnt );
//     printf( "%s\n", $line );

       printf( "-A BLOCK1 -s %s/24 -j DROP\n", $ip );

       $cmd = sprintf( "/sbin/iptables  -I BLOCK1  -d %s/24 -j DROP", $ip );
       system( $cmd );
     }
}

?>

仮定:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output.
于 2013-04-18T21:56:23.997 に答える
0

MarkRの権利、あなたはこれを行うべきではありません。最も簡単な方法は、スクリプトからiptablesを呼び出すか、iptablesconfigを記述して「復元」することです。

それでも、必要に応じて、iptablesのソースを読んでください。iptablesは、一致とテーブルを共有オブジェクトとして使用します。ソースまたはそれらを使用できます。

Linuxネットフィルターには、/ usr / include /netfilter*の下にいくつかのインクルードファイルもあります。これらはやや低レベルの関数です。それはiptablesが使用するものです。これは、iptablesなしで取得できるAPIに限りなく近いものです。

しかし、このAPIは「乱雑」です。iptablesのみが使用するように設計されていることに注意してください。十分に文書化されておらず、非常に具体的な問題が発生する可能性があり、APIは警告なしにかなり迅速に変更される可能性があるため、アップグレードするとコードが破損する可能性があります。

于 2008-09-20T22:13:11.943 に答える
0

netfilter の議論によると、短期的な解決策であることはわかっていますが、短期的には、Python でラップされた iptc を次のように使用できます。

https://github.com/ldx/python-iptables

私の最近のプロジェクトでいくつか試してみたところ、非常に効果的であることがわかりました。

于 2020-10-21T12:40:39.213 に答える