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 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èglesprot
: Le protocole, tel quetcp
,udp
,icmp
, ouall
opt
: Rarement utilisé, cette colonne indique les options IPsource
: L'adresse IP source ou le sous-réseau du trafic, ouanywhere
destination
: L'adresse IP de destination ou le sous-réseau du trafic, ouanywhere
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.