Supprimer une chaîne iptables avec toutes ses règles


31

J'ai une chaîne jointe avec de nombreuses règles comme:

> :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

lorsque j'essaie de supprimer cette chaîne avec:

iptables -X XXXX

mais j'ai obtenu une erreur comme (essayé iptables -F XXXXX avant):

iptables: Trop de liens.

Existe-t-il un moyen simple de supprimer la chaîne en une seule fois?


2
Je n'ai jamais vu de barf iptables comme ça avant d'essayer de rincer.
Tom O'Connor

Juste curieux ... combien de règles est "beaucoup"?
Ladadadada

1
2 many is many :) si j'essaie de supprimer les règles en premier, il aimera taper plusieurs fois: iptables -D OUTPUT -d XXX / 32 -j i_XXXXX_i
timy

3
Essayez ceci:iptables-save | grep -v i_XXXXX_i | iptables-restore
Steven lundi

@StevenMonday pourquoi ne pas écrire comme réponse, c'est la plus utile (alternative faites-le via un fichier et éditez le fichier). La seule chose qu'il ne supprime pas est des tableaux complets ("bruts" de toute façon)
nhed

Réponses:


38

Vous ne pouvez pas supprimer des chaînes lorsque les règles avec '-j CHAINTODELETE' les référencent. Déterminez ce qui fait référence à votre chaîne (le lien) et supprimez-le. Aussi, rincez puis tuez.

-F, --flush [chaîne]

Rincez la chaîne sélectionnée (toutes les chaînes du tableau si aucune n'est indiquée). Cela revient à supprimer toutes les règles une par une.

-X, --delete-chain [chaîne]

Supprimez la chaîne facultative définie par l'utilisateur spécifiée. Il ne doit y avoir aucune référence à la chaîne. Si tel est le cas, vous devez supprimer ou remplacer les règles de référence avant de pouvoir supprimer la chaîne. La chaîne doit être vide, c'est-à-dire ne contenir aucune règle. Si aucun argument n'est donné, il tentera de supprimer toutes les chaînes non intégrées de la table.


Je veux juste trouver un moyen de supprimer la chaîne (a de nombreuses règles de référence '-j CHAINTODELETE') directement, mais d'après votre réponse, cela semble impossible :(
timide

1
Le commentaire de @timy StevenMonday supprimera en une seule fois toutes les références à la chaîne. Peut-être pas idéal, mais sacrément proche.
Jeff Ferland du

12

C'est potentiellement hors sujet, mais c'est ce que j'ai fait après avoir trouvé ce post! Pour certains cas d'utilisation, l'option iptables -D peut être utile. Puisqu'il vous permet d'effacer les règles de référence ajoutées par programmation avec -A (si vous savez précisément comment vous les avez ajoutées).

Par exemple

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

peut être inversé avec

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

Vous avez besoin de deux étapes, mais cela se fait en une seule commande.

Créez un fichier et placez-le dedans.

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Enregistrez le fichier sous "clear-all-rules". Maintenant, faites cette commande:

iptables-restore < clear-all-rules

Vous pouvez maintenant l'effacer à tout moment avec une seule commande.


1
+1 C'est en fait le moyen le plus rapide pour commencer avec une configuration fw propre.
dr01

6

Voici un autre plan. Cela implique trois commandes, pas une, mais avec de la chance, cela devrait fonctionner.

Vider votre iptablesjeu de règles dans un fichier:

iptables-save > /tmp/iptables.txt

Supprimez TOUTES les utilisations (et les références à) la chaîne incriminée:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

Rechargez ensuite l'ensemble de règles:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

Quelque chose dans ce sens les rassemblera tous sur une seule ligne sans supprimer iptables de quelque façon que ce soit.

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

Dans le fichier man iptables, il y a une option -S

S, --list-rules [chaîne] Imprime toutes les règles de la chaîne sélectionnée. Si aucune chaîne n'est sélectionnée, toutes les chaînes sont imprimées comme iptables-save. Comme toutes les autres commandes iptables, elle s'applique à la table spécifiée (le filtre est la valeur par défaut).

En utilisant iptables -S | grep <CHAINNAMEHERE>. Pour des exemples:

root @ root: ~ # iptables -S | grep TRAFFICLOG

-N TRAFFICLOG

-A AVANT -i eth0 -j TRAFFICLOG

vous pouvez alors voir quelles règles bloquent la suppression de la chaîne de la table. Parcourez chaque règle (sauf la iptables -N <CHAINNAMEHERE>et supprimez la règle en utilisant l' -Doption

-D, --delete chain rulenum Supprime une ou plusieurs règles de la chaîne sélectionnée. Il existe deux versions de cette commande: la règle peut être spécifiée sous la forme d'un nombre dans la chaîne (commençant à 1 pour la première règle) ou une règle à faire correspondre.

Par exemple iptables -D FORWARD -i eth0 -j TRAFFICLOG. Une fois que vous avez supprimé chaque règle pour votre chaîne affleurant la chaîne avec l' -Foption iptables -F <CHAINNAMEHERE>.

-F, --flush [chaîne] Vide la chaîne sélectionnée (toutes les chaînes du tableau si aucune n'est donnée). Cela revient à supprimer toutes les règles une par une.

Supprimez ensuite votre chaîne avec l' -Xoption,iptables -X <CHAINNAMEHERE>

-X, --delete-chain [chaîne] Supprime la chaîne facultative définie par l'utilisateur spécifiée. Il ne doit y avoir aucune référence à la chaîne. Si tel est le cas, vous devez supprimer ou remplacer les règles de référence avant de pouvoir supprimer la chaîne. La chaîne doit être vide, c'est-à-dire ne contenir aucune règle. Si aucun argument n'est donné, il tentera de supprimer toutes les chaînes non intégrées de la table.

Iptables est un ensemble d'outils compliqué, donc un tutoriel idéal est nécessaire. Vous pouvez en essayer un sur www.iptables.info


0

Cela crachera les chaînes et les supprimera

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

J'ai constaté que vous pouvez supprimer les règles et la chaîne en modifiant le fichier de règles dans /etc/iptables/rules.v4. Si vous supprimez la chaîne indésirable dans ce fichier, puis rechargez iptables, vous ne devriez plus voir la chaîne lorsque vous effectuez un iptables -L.


Ce fichier existe uniquement sur certaines distributions Linux, puis uniquement sur certaines versions de certaines distributions Linux.
Michael Hampton
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.