383 votes

Comment puis-je supprimer des règles spécifiques d'iptables ?

J'héberge des services spéciaux HTTP et HTTPS sur les ports 8006 et 8007 respectivement. J'utilise iptables pour "activer" le serveur, c'est-à-dire pour acheminer les ports HTTP et HTTPS entrants :

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006 
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007  
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007 

Cela fonctionne comme un charme. Cependant, je voudrais créer un autre script qui désactive à nouveau mon serveur ; c'est-à-dire restaurer iptables à l'état dans lequel il était avant d'exécuter les lignes ci-dessus. Cependant, j'ai du mal à trouver la syntaxe pour supprimer ces règles. La seule chose qui semble fonctionner est une purge complète :

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Mais cela supprimera également d'autres règles iptables, ce qui n'est pas souhaité.

4 votes

J'ai constaté qu'il est préférable d'utiliser -I au lieu de -A pour ACCEPT lignes. En effet, en général, la dernière ligne (dans le cas de INPUT par exemple) est une DROP ou REJECT et tu veux que ta règle passe avant ça. -A place la nouvelle règle après la dernière règle, tandis que -I le met au début.

552voto

Eli Rosencruft Points 1775

Exécutez les mêmes commandes mais remplacez le "-A" par "-D". Par exemple :

iptables -A ...

devient

iptables -D ...

9 votes

Si vous avez plusieurs règles du même type, elle ne les supprimera pas toutes.

6 votes

Essayez d'exécuter cette commande -D plusieurs fois, et elle les supprimera tous.

5 votes

J'ai exécuté la même commande, mais avec -D au lieu de -I. Mais j'obtiens BAD RULE (il existe une règle correspondante)...

507voto

domi27 Points 2557

Vous pouvez également utiliser le numéro de la règle ( --nombre de lignes ) :

iptables -L INPUT --line-numbers

Exemple de sortie :

Chain INPUT (policy ACCEPT) 
    num  target prot opt source destination
    1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain 
    2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain 
    3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps 
    4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

Donc si vous voulez supprimer la deuxième règle :

iptables -D INPUT 2

Mise à jour

Si vous utilisez une table spécifique (par exemple nat), vous devez l'ajouter à la commande de suppression (merci à @ThorSummoner pour le commentaire).

sudo iptables -t nat -D PREROUTING 1

0 votes

Je préfère cette solution à la solution choisie parce qu'elle donne les numéros de ligne et qu'elle est plus facile à utiliser. Merci !

5 votes

Les deux solutions sont intéressantes, mais celle-ci ne fonctionnera pas dans un contexte de script lorsque le numéro de ligne est inconnu. L'autre solution est donc plus générale, et donc plus correcte, selon moi.

2 votes

Si vous ne connaissez pas la ligne, vous pouvez utiliser un commentaire (comme la réponse parmi) ou faire un grep pour votre règle : iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1

37voto

GOST Points 427

La meilleure solution qui fonctionne pour moi sans aucun problème ressemble à ceci :
1. Ajouter une règle temporaire avec quelques commentaires :

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2. Lorsque la règle s'est ajoutée et que vous souhaitez la supprimer (ou tout avec ce commentaire), faites-le :

iptables-save | grep -v "${comment}" | iptables-restore

Ainsi, vous supprimerez à 100% toutes les règles qui correspondent au commentaire $ et laisserez les autres lignes intactes. Cette solution fonctionne depuis 2 mois avec environ 100 changements de règles par jour - aucun problème.

2 votes

Au cas où vous n'auriez pas iptables-save/restore : iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done

0 votes

Pour une utilisation réelle : CRON 1) supprimer vieux spamhaus interdictions iptables, 2) saisir spamhaus.org/drop 3) rechercher les adresses IP CIDR et iptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"

2 votes

@Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e" ;) comme ce

25voto

Wladdy Lopez Points 315

Lister d'abord toutes les règles iptables avec cette commande :

iptables -S

il énumère comme :

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Ensuite, copiez la ligne souhaitée, et remplacez simplement -A avec -D pour supprimer ça :

iptables -D XYZ -p ...

2 votes

Attention ! Cette réponse est incomplète. Extrait du manuel à propos de "-S" : " Comme toute autre commande iptables, elle s'applique à la table spécifiée (le filtre est la valeur par défaut). ". Donc, dans le cas de l'utilisation de ce commutateur - doit être répété pour toutes les tables : nat, mangle, etc

1 votes

Dans mon cas, j'obtiens iptables: Bad rule (does a matching rule exist in that chain?). Et maintenant ?

1 votes

Ah, j'ai compris - ma commande de suppression n'avait pas la spécification de la table. Donc, dans le cas où vous listeriez toutes les règles de la table nat avec sudo iptables -S -t nat et que vous souhaitez supprimer l'une des règles renvoyées, il ne suffit pas de copier. Vous devez ajouter -t nat par exemple sudo iptables -D ... -t nat .

13voto

JackWu Points 330

Utilisez -D voici comment man explique :

-D, --delete chain rule-specification
-D, --delete chain rulenum
    Delete  one  or more rules from the selected chain.  
    There are two versions of this command: 
    the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

Réalisez-vous cette commande, comme toutes les autres commandes( -A , -I ) fonctionne sur certaines tables. Si vous ne travaillez pas sur la table par défaut ( filter ), utilisez -t TABLENAME pour spécifier cette table cible.

Supprimer une règle pour correspondre

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Remarque : cette opération ne supprime que la première règle trouvée. Si vous avez beaucoup de règles correspondantes (cela peut arriver dans iptables), exécutez cette opération plusieurs fois.

Supprimer une règle spécifiée comme un numéro

iptables -D INPUT 2

En plus de compter le nombre, vous pouvez lister le numéro de ligne avec --line-number par exemple :

iptables -t nat -nL --line-number

0 votes

J'ai trouvé que celui-ci avec --line-number est le meilleur

0 votes

Oui ! Superbe ! Je ne veux pas de l'ensemble iptables -F

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X