web-dev-qa-db-fra.com

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

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?

33
timy

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. S'il y en a, vous devez supprimer ou remplacer les règles de référence avant que la chaîne puisse être supprimé. 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.

41
Jeff Ferland

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 programme 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
13
Att Righ

Vous avez besoin de deux étapes, mais cela se fait dans la commande one.

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.

9
Avery Payne

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

Videz votre jeu de règles iptables 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
6
Steven Monday

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 le iptables -N <CHAINNAMEHERE> et supprimez la règle en utilisant le -D option

-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. Après avoir supprimé chaque règle de votre chaîne, rincez la chaîne avec le -F option, 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 le -X option, 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

1
Jacob Bryan

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
flickerfly

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.

0
Jay Phillips

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
user1007727