インターネットからの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