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?
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.
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
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.
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
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
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
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.
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