iptablesルールが既に存在するかどうかを確認するには?

iptables

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

私のスクリプトは何度も呼び出される可能性があり、ルールを削除するスクリプトがないので、それを挿入する前にiptablesルールが既に存在するかどうかをチェックしたいのですが、そうしないとINPUTチェーンにたくさんの重複ルールが発生します

iptablesルールが既に存在するかどうかを確認するには?

  49  sevenever  2011-11-22


ベストアンサー

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

# 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"

51  Marc MAURICE  2012-09-20


新しい-Cオプションは、time-of-check-to-time-of-use (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

このコードはスピンする可能性があります。これを助けるために、ランダム化された指数関数的なバックオフスリープをいくつか追加することができます

13  Kaz  2014-07-02


これは少し後ろ向きに見えるかもしれませんが、それは私のために動作します – 最初にルールを削除してみてください

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

似たようなメッセージが届くはずです

iptablesを使用しています。不正なルール (そのチェーンにマッチするルールが存在するか?)

その後、通常通りにルールを追加するだけです

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

6  recurse  2015-11-27


リストアップして検索するだけ?

iptables --list | grep $ip

… あるいは、どのようにルールを指定してもよい。grep -qを使った場合は何も出力されず、$?で戻り値を確認するだけです

4  Jonathon Reinhart  2011-11-22


スクリプトとの重複を避けるために、以下の行を追加します

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

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

iptablesを使用しています。不正なルール (そのチェーンにマッチするルールが存在するか?)

これは参考までに。しかし、コマンドの後半はルールを追加することを確認します

2  laxman vallandas  2019-10-22


https://serverfault.com/questions/628590/duplicate-iptable-rules で説明したように、最初に重複を追加してから削除するのはどうでしょうか。最も簡単な(隣接する行の場合)ようです

iptables-save | uniq | iptables-restore

0  serv-inc  2019-08-11


タイトルとURLをコピーしました