Comment répertorier et supprimer les règles du pare-feu Iptables

introduction

Iptables est un pare-feu qui joue un rôle essentiel dans la sécurité du réseau pour la plupart des systèmes Linux. Alors que de nombreux tutoriels iptables vous apprendront https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-candsandshow pour créer des règles de pare-feu pour sécuriser votre serveur], celui-ci portera sur sur un aspect différent de la gestion du pare-feu: lister et supprimer des règles.

Dans ce tutoriel, nous expliquerons comment effectuer les tâches iptables suivantes:

  • Règles de liste

  • Effacer les compteurs de paquets et d’octets

  • Supprimer les règles

  • Chaînes vides (supprimer toutes les règles d’une chaîne)

  • Vider toutes les chaînes et les tables, supprimer toutes les chaînes et accepter tout le trafic

Conditions préalables

Avant de commencer à utiliser ce didacticiel, vous devez avoir un compte superutilisateur distinct, non root, un utilisateur disposant de privilèges sudo et configuré sur votre serveur. Si vous devez le configurer, suivez le guide approprié:

Voyons comment lister les règles en premier. Il existe deux manières différentes d’afficher vos règles iptables actives: dans un tableau ou sous forme de liste de spécifications de règles. Les deux méthodes fournissent à peu près les mêmes informations dans différents formats.

Liste des règles par spécification

Pour lister toutes les règles iptables actives par spécification, exécutez la commande + iptables + avec l’option + -S +:

sudo iptables -S
Example: Rule Specification Listing-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Comme vous pouvez le constater, la sortie ressemble à la commande utilisée pour la créer, sans la commande + iptables + précédente. Cela ressemblera également aux fichiers de configuration des règles iptables, si vous avez déjà utilisé + iptables-persistent + ou + + iptables save +.

Liste spécifique à la chaîne

Si vous souhaitez limiter la sortie à une chaîne spécifique (+ INPUT,` + OUTPUT`, + TCP, etc.), vous pouvez spécifier le nom de la chaîne directement après l’option` + -S + . Par exemple, pour afficher toutes les spécifications de règles dans la chaîne `+ TCP +, exécutez la commande suivante:

sudo iptables -S
Example: TCP Chain Rule Specification Listing-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Jetons un coup d’œil à la méthode alternative pour afficher les règles iptables actives, sous forme de tableau de règles.

Liste des règles sous forme de tableaux

Lister les règles iptables dans la vue table peut être utile pour comparer différentes règles les unes par rapport aux autres,

Pour sortir toutes les règles iptables actives dans une table, exécutez la commande + iptables + avec l’option + -L +:

sudo iptables -L

Cela affichera toutes les règles actuelles triées par chaîne.

Si vous souhaitez limiter la sortie à une chaîne spécifique (+ INPUT,` + OUTPUT`, + TCP, etc.), vous pouvez spécifier le nom de la chaîne directement après l’option` + -L + `.

Jetons un coup d’œil à un exemple de chaîne INPUT:

sudo iptables -L
Example: Input Chain Rule Table ListingChain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
UDP        udp  --  anywhere             anywhere             ctstate NEW
TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP       icmp --  anywhere             anywhere             ctstate NEW
REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable

La première ligne de sortie indique le nom de la chaîne (INPUT, dans ce cas), suivi de sa stratégie par défaut (DROP). La ligne suivante comprend les en-têtes de chaque colonne du tableau et est suivie des règles de la chaîne. Voyons ce que chaque en-tête indique:

  • * cible *: Si un paquet correspond à la règle, la cible spécifie ce qu’il faut en faire. Par exemple, un paquet peut être accepté, abandonné, enregistré ou envoyé à une autre chaîne pour être comparé à d’autres règles

  • * prot *: Le protocole, tel que + tcp +, '+ udp + , + icmp + , ou + tous + `

  • * opt *: rarement utilisé, cette colonne indique les options IP

  • * source *: adresse IP source ou sous-réseau du trafic, ou + n’importe où +

  • * destination *: l’adresse IP de destination ou le sous-réseau du trafic, ou + n’importe où +

La dernière colonne, qui n’est pas libellée, indique les * options * d’une règle. C’est-à-dire toute partie de la règle qui n’est pas indiquée par les colonnes précédentes. Cela peut être n’importe quoi, depuis les ports source et destination, jusqu’à l’état de connexion du paquet.

Afficher le nombre de paquets et la taille globale

Lors de la liste des règles iptables, il est également possible d’afficher le nombre de paquets et la taille totale des paquets en octets correspondant à chaque règle. Ceci est souvent utile lorsque vous essayez de vous faire une idée approximative des règles qui correspondent aux paquets. Pour ce faire, utilisez simplement les options + -L + et + -v +.

Par exemple, regardons à nouveau la chaîne INPUT, avec l’option + -v +:

sudo iptables -L  -v
Example: Verbose ListingChain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
   0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
   0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
 396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW
17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW
 396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED

Notez que la liste a maintenant deux colonnes supplémentaires, + pkts + et + octets +.

Maintenant que vous savez comment répertorier les règles de pare-feu actives de différentes manières, voyons comment réinitialiser les compteurs de paquets et d’octets.

Réinitialiser le nombre de paquets et la taille globale

Si vous souhaitez effacer ou mettre à zéro les compteurs de paquets et d’octets de vos règles, utilisez l’option + -Z +. Ils réinitialisent également si un redémarrage se produit. Ceci est utile si vous voulez voir si votre serveur reçoit un nouveau trafic correspondant à vos règles existantes.

Pour effacer les compteurs de toutes les chaînes et règles, utilisez l’option + -Z + par elle-même:

sudo iptables -Z

Pour effacer les compteurs de toutes les règles d’une chaîne spécifique, utilisez l’option + -Z + et spécifiez la chaîne. Par exemple, pour effacer les compteurs de chaîne INPUT, exécutez la commande suivante:

sudo iptables -Z INPUT

Si vous souhaitez effacer les compteurs d’une règle spécifique, spécifiez le nom de la chaîne et le numéro de la règle. Par exemple, pour mettre à zéro les compteurs de la 1ère règle de la chaîne INPUT, exécutez ceci:

sudo iptables -Z INPUT 1

Maintenant que vous savez comment réinitialiser les compteurs de paquets et d’octets iptables, examinons les deux méthodes pouvant être utilisées pour les supprimer.

Supprimer la règle par spécification

L’un des moyens de supprimer les règles iptables consiste à spécifier une règle. Pour ce faire, vous pouvez exécuter la commande + iptables + avec l’option + -D + suivie de la spécification de la règle. Si vous souhaitez supprimer des règles à l’aide de cette méthode, vous pouvez utiliser la sortie de la liste des règles, + iptables -S +, pour obtenir de l’aide.

Par exemple, si vous souhaitez supprimer la règle qui supprime les paquets entrants non valides (+ -A INPUT -m conntrack --ctstate INVALID -j DROP +), vous pouvez exécuter cette commande:

sudo iptables -D

Notez que l’option + -A +, utilisée pour indiquer la position de la règle au moment de la création, doit être exclue ici.

Supprimer la règle par chaîne et par numéro

L’autre moyen de supprimer les règles iptables consiste à * chaîne * et * numéro de ligne *. Pour déterminer le numéro de ligne d’une règle, répertoriez-les dans le format de tableau et ajoutez l’option + - line-numbers +:

sudo iptables -L --line-numbers
[secondary_output Example Output: Rules with Line Numbers]
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

Cela ajoute le numéro de ligne à chaque ligne de la règle, indiqué par l’en-tête * num *.

Une fois que vous savez quelle règle vous souhaitez supprimer, notez la chaîne et le numéro de ligne de la règle. Puis exécutez la commande + iptables -D + suivie de la chaîne et du numéro de règle.

Par exemple, si nous voulons supprimer la règle d’entrée qui supprime les paquets non valides, nous pouvons voir que c’est la règle + 3 + de la chaîne + INPUT +. Nous devrions donc lancer cette commande:

sudo iptables -D

Maintenant que vous savez comment supprimer des règles de pare-feu individuelles, voyons comment «vider» les chaînes de règles.

Chaînes Flush

Iptables offre un moyen de supprimer toutes les règles d’une chaîne ou de "purger *" une chaîne. Cette section couvrira les différentes façons de le faire.

Rincer une seule chaîne

Pour vider une chaîne spécifique, qui supprimera toutes les règles de la chaîne, vous pouvez utiliser l’option + -F +, ou l’équivalent + - flush +, et le nom de la chaîne à vider.

Par exemple, pour supprimer toutes les règles de la chaîne + INPUT +, exécutez la commande suivante:

sudo iptables -F

Rincer toutes les chaînes

Pour vider toutes les chaînes, ce qui supprimera toutes les règles du pare-feu, vous pouvez utiliser l’option + -F +, ou l’équivalent + - flush +, par lui-même:

sudo iptables -F

Rincer toutes les règles, supprimer toutes les chaînes et accepter tout

Cette section vous montrera comment vider toutes vos règles, tables et chaînes de pare-feu et autoriser tout le trafic réseau.

Commencez par définir les stratégies par défaut pour chacune des chaînes intégrées sur + ACCEPT +. La raison principale est de vous assurer que votre serveur ne sera pas verrouillé via SSH:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Puis effacez les tables + nat + et + mangle +, effacez toutes les chaînes (+ -F +) et supprimez toutes les chaînes autres que celles par défaut (+ -X +):

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

Votre pare-feu autorisera désormais tout le trafic réseau. Si vous listez vos règles maintenant, vous verrez qu’il n’y en a pas et que seules les trois chaînes par défaut (INPUT, FORWARD et OUTPUT) restent.

Conclusion

Après avoir suivi ce didacticiel, vous devez savoir comment répertorier et supprimer vos règles de pare-feu iptables.

N’oubliez pas que toutes les modifications apportées à iptables via la commande + iptables + sont éphémères et doivent être enregistrées pour être persistantes lors des redémarrages du serveur. Cela est couvert dans la section Saving Rules du didacticiel Règles de pare-feu communes et commandes.