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é.
Exécutez les mêmes commandes mais remplacez le "-A" par "-D". Par exemple:
iptables -A ...
devient
iptables -D ...
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
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
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.
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 ...
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.
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.
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
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