iptablesルールが既に存在するかどうかを確認するにはどうすればよいですか?


41

インターネットからtcpポートへの接続をブロックするルールをiptablesに追加する必要があります。

私のスクリプトは複数回呼び出される可能性があり、ルールを削除するスクリプトがないため、iptablesルールが既に存在するかどうかをチェックしてから挿入します。

iptablesルールが既に存在するかどうかを確認するにはどうすればよいですか?


または、次のラッパーを使用して、べき
projects

回答:


44

-C --check最近のiptablesバージョンには新しいオプションがあります。

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

古いiptablesバージョンの場合、Garrettの提案を使用します。

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"

12

新しい-Cオプションは、使用時間(TOCTTOU)の競合状態に対して開かれているため、満足のいくものではありません。2つのプロセスが同じルールをほぼ同時に追加しようとしても、-C2回追加されないように保護しません。

だから、それは本当にgrep解決策よりも優れています。の出力に対する正確なテキスト処理ジョブは、その出力がテーブルの状態の信頼できるスナップショットであるため、とiptables-save同じくらい確実に機能します-C

必要なのは、--ensureルールが存在しない場合にのみアトミックにチェックして追加するオプションです。さらに、ルールがまだ存在しない場合に新しいルールが挿入される正しい位置にルールが移動されると便利です(--ensure-move)。たとえばiptables -I 1、チェーンの先頭にルールを作成するために使用されるが、そのルールがすでに7番目の位置に存在する場合、既存のルールは最初の位置に移動する必要があります。

これらの機能がなければ、実行可能な回避策は、この擬似コードに基づいてシェルスクリプトループを記述することだと思います。

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

このコードはスピンする可能性があります。一定の反復回数内で2人以上のレーサーが出ることを保証するものではありません。これを支援するために、ランダム化された指数バックオフスリープをいくつか追加できます。


1
ルールが追加された正確な方法を正確に特定しなければならないという単純な理由により、このコマンドは満足のいくものではないことを付け加えます。...私は私の設定でテストをした、と私は、正確なキーワードと値を指定しなかったので、それはルールを見つけることができませんでした
ファビアンHaddadi

一時的にルールを削除すると、何かが壊れる可能性があります...
Mehrdad

5

これは少し逆に見えるかもしれませんが、私にとってはうまくいきます-最初にルールを削除してみてください。

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

次のようなメッセージが表示されるはずです。

iptables:不適切なルール(そのチェーンに一致するルールが存在しますか?)

次に、通常どおりルールを追加します。

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;


1
べき等のコマンドをシミュレートするためだけに、ファイアウォールに不要な穴を開けることは、おそらく素晴らしい考えではありません。確かに、この穴は一時的なものであることを意図していますが、それでも攻撃者のチャンスを改善します。そして、何かが置換ルールの追加を中断した場合、ホールは無期限に持続する可能性があります。
サンパブロクパー

この戦略は、セキュリティ上の理由から、ものをドロップするルールを受け入れ、ないため、おそらくのみ適して:良い点の@sampablokuper
lucaferrario

私は同じことをすることになりました!
ワルハンセン

4

リストして検索するだけですか?

iptables --list | grep $ip

...または、ただし、ルールが指定されています。使用grep -qすると、何も出力されず、戻り値を確認できます$?


3
iptables-save|grep $ip特にスクリプトでは、より簡単に解析可能な形式であるため、代わりに提案します。必要に応じて、コマンドの正確な構文も確認できます。
ギャレット

1
これらのどちらも実際には質問に答えません。複数のルールiptables-save|grep $ipに非常によく一致する可能性があるためです。おそらくiptables-save完全なルール仕様をチェックするために使用できますが、それはまだ少しハックです:によって返される形式はiptables-save、スクリプト内のルールと正確に一致しない場合があります。iptables-saveオプションを異なる順序で生成したり、物事を追加したりすることができます(など-m tcp)。
ラースク

念頭に置いてベアiptables --listwell-knownポートを解決しようとします。そのため、ポートをgrepする前にそれを確認してください。
ファビアンハ


0

スクリプトからルールが重複しないようにするには、次の行を追加します。

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

最初に上記のコマンドを実行すると、次のメッセージが表示されます

iptables:不適切なルール(そのチェーンに一致するルールが存在しますか?)

これは単なる情報です。ただし、コマンドの後半では、ルールを確実に追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.