web-dev-qa-db-ja.com

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

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

スクリプトが複数回呼び出される可能性があり、ルールを削除するスクリプトがないため、iptablesルールが存在するかどうかを確認してから挿入します。それ以外の場合は、INPUTチェーンに多数の重複ルールがあります。

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

42
sevenever

新しい-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"
44
Marc MAURICE

新しい-Cオプションは、チェック時間と使用時間(TOCTTOU)の競合状態が発生する可能性があるため、満足のいくものではありません。 2つのプロセスがほぼ同時に同じルールを追加しようとした場合、-Cはそれらを2回追加することから保護しません。

したがって、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人以上のレーサーが決まった回数のイテレーションで出ることを保証するものではありません。これを支援するために、ランダム化された指数バックオフスリープをいくつか追加できます。

12
Kaz

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

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

次のようなメッセージが表示されます。

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

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

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

5
recurse

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

iptables --list | grep $ip

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

4

スクリプトからのルールの重複を回避するには、以下の行を追加します。

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

上記のコマンドを初めて実行すると、以下のメッセージが表示されます

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

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

0

https://serverfault.com/questions/628590/duplicate-iptable-rules で説明されているように、最初に重複を追加してから削除しますか?最も簡単(隣接する行の場合) あるようです

iptables-save | uniq | iptables-restore
0
serv-inc