web-dev-qa-db-fra.com

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

J'héberge des services HTTP et HTTPS spéciaux sur les ports 8006 et 8007 respectivement. J'utilise iptables pour "activer" le serveur; c'est-à-dire pour router 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, j'aimerais créer un autre script qui désactive à nouveau mon serveur; c'est-à-dire restaurer l'état d'iptables avant les lignes ci-dessus. Cependant, j'ai du mal à trouver la syntaxe pour supprimer ces règles. La seule chose qui semble fonctionner est un flush complet:

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

299
Jeroen

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

iptables -A ...

devient

iptables -D ...
427
Eli Rosencruft

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

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 souhaitez supprimer la deuxième règle:

iptables -D INPUT 2

Mise à jour

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

Sudo iptables -t nat -D PREROUTING 1
410
domi27

La meilleure solution qui fonctionne sans problème pour moi est la suivante:
1. Ajouter une règle temporaire avec un commentaire:

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

2. Lorsque la règle a été ajoutée et que vous souhaitez la supprimer (ou tout le contenu de ce commentaire), faites:

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

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

29
ETech

Commencez par lister 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

Copiez ensuite la ligne souhaitée et remplacez simplement -A par -D pour le supprimer:

iptables -D XYZ -p ...
4
Wladdy Lopez

Utilisez la commande -D, voici comment la page man l'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 cette commande, comme toute autre commande (-A, -I) fonctionne sur certaines tables. Si vous ne travaillez pas sur la table par défaut (table 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: Ceci ne supprime que la première règle trouvée. Si plusieurs règles correspondent (cela peut arriver dans iptables), exécutez ceci plusieurs fois.

Supprimer une règle spécifiée sous forme de nombre

iptables -D INPUT 2

Outre le comptage du nombre, vous pouvez répertorier le numéro de ligne avec le paramètre --line-number, par exemple:

iptables -t nat -nL --line-number
3
cizixs

Supposons que, si vous souhaitez supprimer les règles NAT,

Répertoriez les IPtables ajoutées en utilisant la commande ci-dessous,

# Sudo iptables -L -t nat -v

Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
    0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

Si vous souhaitez supprimer la règle nat des IPtables, exécutez simplement la commande,

# Sudo iptables -F -t nat -v

Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

Ensuite, vous pouvez vérifier que

# Sudo iptables -L -t nat -v
1
lakshmikandan