次のような多くのルールがチェーンに追加されています。
> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i
私がこのチェーンを削除しようとすると:
iptables -X XXXX
しかし、(前にiptables -F XXXXXを試しました)のようなエラーが発生しました:
iptables:リンクが多すぎます。
一度のコマンドでチェーンを削除する簡単な方法はありますか?
'-j CHAINTODELETE'を含むルールがチェーンを参照している場合は、チェーンを削除できません。チェーン(リンク)を参照しているものを見つけ、それを削除します。また、フラッシュして殺します。
-F、-flush [チェーン]
選択したチェーンをフラッシュします(何も指定されていない場合は、テーブル内のすべてのチェーン)。これは、すべてのルールを1つずつ削除することと同じです。
-X、-delete-chain [chain]
指定されたオプションのユーザー定義チェーンを削除します。 チェーンへの参照があってはなりません。ある場合、チェーンを削除する前に参照ルールを削除または置き換える必要があります。チェーンは空である必要があります。つまり、ルールが含まれていません。引数が指定されていない場合は、テーブル内のすべての非組み込みチェーンを削除しようとします。
これはトピックから外れている可能性がありますが、この投稿を見つけた後に私がしたことです!一部のユースケースでは、iptables -Dオプションが役立つ場合があります。 -Aを使用してプログラムで追加された参照ルールをクリアできるため(追加方法を正確に知っている場合)。
例えば
iptables -N MYCHAIN
iptables -A INPUT -i interface -j MYCHAIN
iptables -A MYCHAIN -j ACCEPT
で逆にすることができます
iptables -D INPUT -i interface -j MYCHAIN
iptables --flush MYCHAIN
iptables -X MYCHAIN
2つのステップが必要ですが、これはoneコマンドで行います。
ファイルを作成し、その中に配置します。
# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
ファイルを「clear-all-rules」として保存します。次に、次のコマンドを実行します。
iptables-restore < clear-all-rules
これで、1つのコマンドでいつでもクリアできます。
これが代替案です。 1つのコマンドではなく3つのコマンドが含まれますが、運が良ければ機能するはずです。
iptables
ルールセットをファイルにダンプします。
iptables-save > /tmp/iptables.txt
問題のチェーンのすべての使用(およびその参照)を削除します。
sed -i '/i_XXXXX_i/d' /tmp/iptables.txt
次に、ルールセットをリロードします。
iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt
Iptables manファイルにはオプション-S
があります
S、--list-rules [chain]選択したチェーンのすべてのルールを出力します。チェーンが選択されていない場合、すべてのチェーンはiptables-saveのように出力されます。他のすべてのiptablesコマンドと同様に、指定したテーブルに適用されます(フィルターがデフォルトです)。
iptables -S | grep <CHAINNAMEHERE>
を使用する。例えば:
root @ root:〜#iptables -S | grep TRAFFICLOG
-Nトラフィックログ
-Aフォワード-i eth0 -jトラフィックログ
その後、テーブルからのチェーンの削除をブロックしているルールを確認できます。各ルールを確認します(iptables -N <CHAINNAMEHERE>
を除く)。-D
オプションを使用してルールを削除します
-D、--delete chain rulenum選択したチェーンから1つ以上のルールを削除します。このコマンドには2つのバージョンがあります。ルールは、チェーン内の番号(最初のルールは1から開始)または一致するルールとして指定できます。
たとえば、iptables -D FORWARD -i eth0 -j TRAFFICLOG
です。チェーンの各ルールを削除したら、-F
オプションiptables -F <CHAINNAMEHERE>
を使用してチェーンをフラッシュします。
-F、--flush [chain]選択したチェーン(指定されていない場合はテーブル内のすべてのチェーン)をフラッシュします。これは、すべてのルールを1つずつ削除することと同じです。
次に、-X
オプション、iptables -X <CHAINNAMEHERE>
を使用してチェーンを削除します
-X、--delete-chain [chain]指定されたオプションのユーザー定義チェーンを削除します。チェーンへの参照があってはなりません。存在する場合は、チェーンを削除する前に、参照ルールを削除または置き換える必要があります。チェーンは空である必要があります。つまり、ルールが含まれていません。引数が指定されていない場合、テーブル内のすべての非組み込みチェーンを削除しようとします。
Iptablesは複雑なツールセットであるため、理想的なチュートリアルが必要です。 www.iptables.info で試してみることができます
これらの行に沿ったものは、iptablesをまったく停止することなく、それらすべてを1行で取得します。
for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done
/etc/iptables/rules.v4にあるルールファイルを編集することで、ルールとチェーンを削除できることがわかりました。このファイルで不要なチェーンを削除してからiptablesをリロードすると、iptables -Lを実行してもチェーンが表示されなくなります。
これはチェーンを吐き出して削除します
for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i ; done