追加されたルールがすでにチェーン内のルールと同じ場合、ルールiptables
番号を付与せずにルールを置き換えることはできますか?それとも既存のルールを上書きしてルールを挿入/追加できますか?私が尋ねる理由は自動的にルールを追加するスクリプトがありますiptables
。
答え1
あなたが求めるものを達成するのに十分近い方法は次のとおりです。iptables
選択してください-C/--check
:
-C, --OKチェーンルール仕様
選択したチェーンに互換性のあるルールがあることを確認してください。このコマンドは、次のようなロジックを使用します。-D既存の iptables 構成を変更せずに一致する項目を検索し、終了コードを使用して成功または失敗を示します。
したがって、自動化されたスクリプトがある場合は、次のことを試してください。
iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
ルールを汚染したくない場合は、次のようにします。
iptables -C FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
ルールが存在することを確認してください。 true が返されると、何も起こりません。 falseが返されると、シェルは2番目のiptables
ルールを実行します。常にこれが行われる場合は、このルールは一度だけ大量に生成されます(ただし、後で注文する方法を参照してください)。使用することもできましたが、-A
役に立つ-I
可能性が高いです。
ルールの場所が本当に重要ですが、他の変更によって現在の正確な場所がわからない場合は、そのためにカスタムチェーンを使用する必要があります。これにより、ルールは常にジャンプ位置から呼び出されます。
iptables -N mychain
iptables -A FORWARD -m comment --comment first_rule
iptables -A FORWARD -m comment --comment initially_second -j mychain
iptables -C mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
iptables -A mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
このように、しばらく前に例外が挿入された場合:
iptables -I FORWARD 2 -s 10.0.3.10 -d 10.0.4.20 -m comment --comment now_second -j DROP
スクリプトは、この例外の前にルールを再挿入してキャンセルしません。