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

De Get Docs
Aller à :navigation, rechercher

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 comment créer des règles de pare-feu pour sécuriser votre serveur, celui-ci se concentrera sur un aspect différent de la gestion du pare-feu : lister et supprimer des règles.

Dans ce didacticiel, 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
  • Flush chains (supprimer toutes les règles d'une chaîne)
  • Vider toutes les chaînes et tables, supprimer toutes les chaînes et accepter tout le trafic

Remarque : Lorsque vous travaillez avec des pare-feu, veillez à ne pas vous exclure de votre propre serveur en bloquant le trafic SSH (port :22, par défaut). Si vous perdez l'accès en raison des paramètres de votre pare-feu, vous devrez peut-être vous y connecter via une console hors bande pour réparer votre accès.


Conditions préalables

Ce didacticiel suppose que vous utilisez un serveur Linux avec le iptables commande installée et que votre utilisateur a sudo privilèges.

Si vous avez besoin d'aide pour cette configuration initiale, veuillez consulter notre guide Configuration initiale du serveur avec Ubuntu 20.04. Il est également disponible pour Debian et CentOS.

Règles d'inscription par spécification

Voyons d'abord comment lister les règles. 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 des formats différents.

Pour répertorier toutes les règles iptables actives par spécification, exécutez la commande iptables commande avec le -S option:

sudo iptables -S
Output-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 voir, la sortie ressemble exactement aux commandes qui ont été utilisées pour les créer, sans le précédent iptables commande. Cela ressemblera également aux fichiers de configuration des règles iptables, si vous avez déjà utilisé iptables-persistent ou iptables save.

Liste d'une chaîne spécifique

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 le -S option. Par exemple, pour afficher toutes les spécifications de règle dans le TCP chaîne, vous exécuterez cette commande :

sudo iptables -S TCP
Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Examinons maintenant la manière alternative de visualiser les règles iptables actives : sous forme de tableau de règles.

Répertorier les règles sous forme de tableaux

La liste des règles iptables dans la vue tableau peut être utile pour comparer différentes règles les unes par rapport aux autres. Pour afficher toutes les règles iptables actives dans une table, exécutez la commande iptables commande avec le -L option:

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 le -L option.

Prenons un exemple INPUT chaîne:

sudo iptables -L INPUT
OutputChain 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. Passons en revue ce que chaque en-tête indique :

  • target: Si un paquet correspond à la règle, la cible spécifie ce qu'il convient d'en faire. Par exemple, un paquet peut être accepté, supprimé, enregistré ou envoyé à une autre chaîne pour être comparé à d'autres règles
  • prot: Le protocole, tel que tcp, udp, icmp, ou all
  • opt: Rarement utilisé, cette colonne indique les options IP
  • source: L'adresse IP source ou le sous-réseau du trafic, ou anywhere
  • destination: L'adresse IP de destination ou le sous-réseau du trafic, ou anywhere

La dernière colonne, qui n'est pas étiquetée, indique les options d'une règle. Il s'agit de toute partie de la règle qui n'est pas indiquée par les colonnes précédentes. Il peut s'agir de n'importe quoi, des ports source et de destination à l'état de connexion du paquet.

Affichage du nombre de paquets et de la taille globale

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

Par exemple, regardons le INPUT chaîne à nouveau, avec le -v option:

sudo iptables -L INPUT -v
OutputChain 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 bytes.

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éinitialisation du nombre de paquets et de la taille agrégée

Si vous souhaitez effacer ou remettre à zéro les compteurs de paquets et d'octets pour vos règles, utilisez la -Z option. Ils se réinitialisent également en cas de redémarrage. Ceci est utile si vous voulez voir si votre serveur reçoit un nouveau trafic qui correspond à vos règles existantes.

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

sudo iptables -Z

Pour effacer les compteurs de toutes les règles d'une chaîne spécifique, utilisez la -Z option et spécifiez la chaîne. Par exemple, pour effacer le INPUT les compteurs de chaîne exécutent cette commande :

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 première règle de la INPUT chaîne, 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 qui peuvent être utilisées pour les supprimer.

Suppression de règles par spécification

L'un des moyens de supprimer des règles iptables consiste à spécifier une règle. Pour ce faire, vous pouvez exécuter le iptables commande avec le -D option 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 un peu d'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 INPUT -m conntrack --ctstate INVALID -j DROP

Notez que le -A L'option, qui est utilisée pour indiquer la position de la règle au moment de la création, doit être exclue ici.

Suppression de règles par chaîne et numéro

L'autre façon de supprimer les règles iptables est par sa chaîne et numéro de ligne. Pour déterminer le numéro de ligne d'une règle, répertoriez les règles sous forme de tableau et ajoutez le --line-numbers option:

sudo iptables -L --line-numbers
OutputChain 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 règle, indiqué par le num entête.

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. Exécutez ensuite le iptables -D commande 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 invalides, nous pouvons voir que c'est la règle 3 de la INPUT chaîne. Nous devrions donc exécuter cette commande :

sudo iptables -D INPUT 3

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

Chaînes de rinçage

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

Avertissement : Veillez à ne pas vous verrouiller hors de votre serveur via SSH en vidant une chaîne avec une stratégie par défaut de drop ou deny. Si tel est le cas, vous devrez peut-être vous y connecter via la console pour corriger votre accès.


Rincer une seule chaîne

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

Par exemple, pour supprimer toutes les règles du INPUT chaîne, exécutez cette commande :

sudo iptables -F INPUT

Rinçage de toutes les chaînes

Pour vider toutes les chaînes, ce qui supprimera toutes les règles de pare-feu, vous pouvez utiliser le -F, ou l'équivalent --flush, option seule :

sudo iptables -F

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

Avertissement : Cela désactivera efficacement votre pare-feu. Vous ne devez suivre cette section que si vous souhaitez recommencer la configuration de votre pare-feu.


Tout d'abord, définissez les stratégies par défaut pour chacune des chaînes intégrées sur ACCEPT. La principale raison de le faire est de s'assurer que vous ne serez pas bloqué de votre serveur via SSH :

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

Rincer ensuite le nat et mangle tables, rincer 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 seulement les trois chaînes par défaut (INPUT, FORWARD, et OUTPUT) rester.

Conclusion

Après avoir suivi ce tutoriel, vous avez vu comment lister et supprimer vos règles de pare-feu iptables.

N'oubliez pas que tout changement d'iptables via le iptables sont éphémères et doivent être enregistrées pour persister lors des redémarrages du serveur. Ceci est traité dans la section Sauvegarde des règles du didacticiel sur les règles et commandes communes du pare-feu.