Articles

Exemples simplifiés de Pare-feu Linux iptables

Dans le post précédent, nous avons parlé de la façon de Sécuriser le serveur Linux En utilisant les meilleures Pratiques de durcissement. Certaines personnes m’ont posé des questions sur la section pare-feu, qui était une brève introduction au pare-feu iptables. Aujourd’hui, nous allons discuter en détail du pare-feu Linux iptables et de la façon de sécuriser le trafic de votre serveur à l’aide de ce pare-feu génial.

Table des matières

Iptables sur CentOS 7

Si vous utilisez CentOS 7, vous constaterez que firewalld gère iptables, donc si vous voulez revenir à iptables, vous devez arrêter et masquer firewalld.

$ systemctl stop firewalld$ systemctl mask firewalld

Puis installez le service iptables et activez-le :

$ yum install iptables-services$ systemctl enable iptables

Ensuite, vous pouvez le démarrer :

$ systemctl start iptables

Comment fonctionne le pare-feu Linux

Les fonctions du pare-feu Iptables sont construites sur le Framework Netfilter disponible dans le noyau Linux pour le filtrage des paquets.

Types de pare-feu

Il existe deux types de pare-feu :

Le pare-feu sans état traite chaque paquet seul, cela signifie qu’il ne voit pas d’autres paquets de la même connexion.

Pare-feu avec état ce type de pare-feu se soucie de tous les paquets qui le traversent, il connaît donc l’état de la connexion. Cela donne plus de contrôle sur le trafic.

Netfilter contient des tables. Ces tableaux contiennent des chaînes et les chaînes contiennent des règles individuelles.

Si un paquet correspond à une règle, iptables appliquera l’action de règle à ce paquet.

Les actions peuvent être: acceptez, rejetez, ignorez ou transmettez le paquet à d’autres règles pour plus de traitement.

Netfilter peut traiter le trafic entrant ou sortant en utilisant l’adresse IP et le numéro de port.

La commande iptables gère et configure Netfilter.

Avant de commencer à écrire des commandes de pare-feu, nous devons comprendre un peu la structure du pare-feu afin de pouvoir écrire facilement des règles de pare-feu.

tables de pare-feu iptables

Netfilter dispose de trois tables qui peuvent contenir des règles de traitement.

La table de filtrage iptables est la table principale pour le traitement du trafic.

La seconde est la table nat, qui gère les règles NAT.

La troisième table est la table de mangle pour mutiler les paquets.

Chaînes de table

Chaque table des tables mentionnées ci-dessus contient des chaînes ; ces chaînes sont le conteneur des règles d’iptables.

La table des filtres contient des chaînes de TRANSFERT, D’ENTRÉE et de SORTIE. Vous pouvez créer une chaîne personnalisée pour y enregistrer vos règles.

Si un paquet arrive sur l’hôte, iptables le traitera par des règles de chaîne d’ENTRÉE.

Si le paquet va vers un autre hôte, cela signifie que les règles de la chaîne de sortie le traiteront.

Iptables utilise la chaîne DE TRANSFERT pour gérer les paquets qui ont accédé à l’hôte mais qui sont destinés à un autre hôte.

Stratégie de chaîne

Chaque chaîne de la table de filtres a une stratégie. La stratégie est l’action par défaut prise par iptables.

La stratégie peut être DROP, REJECT et ACCEPT.

La stratégie d’ACCEPTATION permet aux paquets de passer le pare-feu. La stratégie DROP supprime un paquet sans en informer le client. La stratégie de REJET supprime également le paquet et en informe l’expéditeur.

Du point de vue de la sécurité, vous devez supprimer tous les paquets arrivant sur l’hôte et n’accepter que les paquets provenant de sources fiables.

Ajout de règles iptables

Vous pouvez ajouter une nouvelle règle à l’aide de la commande iptables comme ceci:

$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT

Brisons cette commande en morceaux afin que nous puissions tout comprendre à ce sujet.

Le -A signifie que nous ajoutons une nouvelle règle. Par défaut, iptables ajoute toutes les nouvelles règles à la table de filtrage, sauf si vous spécifiez une autre table.

L’indicateur -i spécifie le périphérique auquel la règle sera appliquée. Si vous ne spécifiez pas de périphérique, iptables appliquera la règle à tout le trafic entrant, quels que soient les périphériques.

L’indicateur -p spécifie le protocole du paquet que vous souhaitez traiter, qui est TCP dans notre cas.

L’indicateur –dport spécifie le port de destination, qui est 80.

Le -d spécifie l’adresse IP de destination, qui est 1.2.3.4. Si aucune adresse IP de destination n’est spécifiée, la règle s’appliquera à tout le trafic entrant sur eth1, quelle que soit l’adresse IP.

Le -j spécifie l’action ou l’action de SAUT à effectuer. Ici, nous acceptons les paquets en utilisant la stratégie d’acceptation.

La règle ci-dessus autorise le trafic HTTP entrant, qui se trouve sur le port 80.

Qu’en est-il de l’autorisation du trafic sortant?

$ iptables -A OUTPUT -o eth1 -p tcp --sport 80 -j ACCEPT

Vous pouvez utiliser l’indicateur -A pour ajouter des règles à la chaîne de SORTIE.

L’indicateur -o est utilisé pour le périphérique utilisé pour le trafic sortant.

L’indicateur -sport spécifie le port source.

Vous pouvez utiliser le nom du service comme http ou https au lieu du numéro de port numérique sur sport ou dport. Tous les noms de services sont dans le fichier /etc/services.

Vous devez utiliser le nom du service plutôt qu’un numéro de port, ce qui facilite la lecture des règles.

ordre des règles iptables

Iptables place de nouvelles règles à la fin de la chaîne. Vous pouvez l’ajouter en haut en utilisant l’option -I.

La séquence des règles compte comme vous le verrez maintenant. Vous pouvez insérer vos règles exactement où vous le souhaitez en utilisant le drapeau I.

Regardez les règles suivantes pour comprendre comment l’ordre des règles compte :

$ iptables -I INPUT 3 -i eth1 -p udp -j ACCEPT$ iptables -I INPUT 4 -i eth1 -p udp --dport 80 -j DROP

La première règle accepte tout le trafic UDP qui arrive à eth1, et le nombre 3 est l’ordre des règles.

La deuxième règle supprime le trafic qui entre dans le port 80.

La première règle acceptera tout le trafic, puis la deuxième règle qui devrait supprimer le trafic ne fera rien puisque iptables transmet le trafic dans la première règle.

Vos règles doivent avoir du sens car l’ordre des règles dans la chaîne compte.

Liste des règles iptables

Vous pouvez lister les règles dans une chaîne en utilisant l’indicateur -L:

$ iptables -L INPUT

Vous pouvez afficher les numéros de ligne pour les règles en utilisant des numéros de ligne :

$ iptables -L INPUT --line-numbers

La liste affiche les noms des services. Vous pouvez afficher les numéros de port à la place en utilisant l’option -n:

$ iptables -L INPUT -n --line-numbers

La règle ci-dessus rendra la liste plus rapide car elle empêche iptables de la résolution DNS et des recherches de service.

Vous pouvez lister toutes les règles pour toutes les chaînes comme ceci:

$ iptables -L -n --line-numbers

Pour obtenir le nombre de paquets traités par chaque règle, vous pouvez utiliser l’indicateur -v:

$ iptables -L -v

Vous pouvez également réinitialiser les compteurs à zéro en utilisant l’indicateur -z.

Maintenant, nous pouvons ajouter une nouvelle règle à n’importe quelle chaîne que nous voulons, nous pouvons insérer la règle dans un ordre spécifique, et nous pouvons lister les règles pour n’importe quelle chaîne ou toutes les chaînes, mais qu’en est-il de la suppression d’une règle?

Suppression des règles

Vous pouvez supprimer une règle en utilisant l’indicateur -D :

$ iptables -D INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT

Cette commande supprimera la règle HTTP que vous avez spécifiée précédemment.

Avant de supprimer une règle, assurez-vous simplement de la spécification de la règle en la répertoriant, puis supprimez-la.

Vous pouvez supprimer la règle en utilisant le numéro de commande au lieu d’écrire les spécifications de la règle.

$ iptables -D INPUT 2

Vous pouvez supprimer toutes les règles d’une chaîne spécifique en utilisant l’indicateur -F, ce qui signifie vider toutes les règles.

$ iptables -F INPUT

Si vous oubliez de mentionner le nom de la chaîne lorsque vous utilisez l’indicateur -F, toutes les règles de la chaîne seront supprimées.

Remplacement des règles

Vous pouvez remplacer les règles existantes par votre propre règle en utilisant l’indicateur -R :

$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT

Cette commande remplacera la première règle de la chaîne d’ENTRÉE par la règle typée.

Liste d’une table spécifique

Pour lister une table spécifique, utilisez l’indicateur -t avec le nom de la table comme ceci :

$ iptables -L -t nat

Ici, nous listons les règles dans la table nat.

Chaîne définie par l’utilisateur Iptables

Pour créer une chaîne définie par l’utilisateur, utilisez l’indicateur -N.

$ iptables -N MY_CHAIN

De plus, vous pouvez le renommer en utilisant l’indicateur -E.

$ iptables -E MY_CHAIN NEW_NAME

Et vous pouvez supprimer la chaîne définie par l’utilisateur en utilisant l’indicateur -X.

$ iptables -X MY_CHAIN

Si vous ne mentionnez pas le nom de la chaîne lors de l’utilisation de l’indicateur -X, toutes les chaînes définies par l’utilisateur seront supprimées. Vous ne pouvez pas supprimer les chaînes intégrées comme l’ENTRÉE et la SORTIE.

Redirection vers une chaîne définie par l’utilisateur

Vous pouvez rediriger les paquets vers une chaîne définie par l’utilisateur comme les chaînes intégrées en utilisant l’indicateur -j.

$ iptables -A INPUT -p icmp -j MY_CHAIN

La règle ci-dessus redirigera tout le trafic ICMP vers la chaîne MY_CHAIN.

Définition de la stratégie par défaut pour les chaînes

Vous pouvez utiliser l’indicateur -P pour définir la stratégie par défaut pour une chaîne spécifique. La stratégie par défaut peut être ACCEPTER, REJETER et SUPPRIMER.

$ iptables -P INPUT DROP

Alors maintenant, la chaîne d’entrée déposera n’importe quel paquet à moins que vous n’écriviez une règle pour autoriser tout trafic entrant.

SYN Flooding

L’attaquant envoie des paquets SYN uniquement sans terminer la prise de contact TCP et, par conséquent, l’hôte récepteur aurait de nombreuses connexions ouvertes, et votre serveur devient trop occupé pour répondre aux autres clients.

Nous pouvons utiliser le module limit du pare-feu iptables pour nous protéger des inondations de SYN.

$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT

Nous spécifions ici 10 paquets SYN par seconde seulement. Vous pouvez ajuster cette valeur en fonction des besoins de votre réseau.

Si cela réduit votre réseau, vous pouvez utiliser des cookies SYN.

SYN Cookies

Dans

/etc/sysctl.conf

fichier et ajoutez cette ligne:

net.ipv4.tcp_syncookies = 1

Puis enregistrez et rechargez.

$ sysctl -p

Supprimer les paquets d’État INVALIDES

Les paquets d’état INVALIDES sont des paquets qui n’appartiennent à aucune connexion et vous les supprimez.

$ iptables -A INPUT -m state --state INVALID -j DROP

Cette règle supprimera tous les paquets d’état invalides entrants.

Supprimer des paquets fragmentés

Les paquets fragmentés sont des morceaux cassés de gros paquets mal formés, et vous devez écrire des règles pour les supprimer.

L’indicateur -f indique au pare-feu iptables de sélectionner tous les fragments. Donc, si vous n’utilisez pas iptables comme routeur, vous pouvez supprimer des paquets fragmentés.

$ iptables -A INPUT -f -j DROP

Enregistrer les règles iptables

Si vous redémarrez votre serveur, vous perdrez toutes les règles que vous avez écrites, alors comment les conserver ?

Vous pouvez enregistrer toutes vos règles à l’aide de la commande iptables-save si vous utilisez CentOS ou Red Hat.

iptables-save > /etc/sysconfig/iptables

Sur CentOS 7, vous pouvez enregistrer des règles comme ceci:

$ service iptables save

Vous pouvez enregistrer une table spécifique comme la table de filtre uniquement:

$ iptables-save -t filter

Vous pouvez également utiliser iptables-restore pour restaurer les règles.

Sur les distributions basées sur Debian, vous pouvez utiliser le paquet iptables-persistent pour enregistrer et restaurer les règles.

Tout d’abord, installez-le:

$ apt-get install iptables-persistent

Ensuite, vous pouvez enregistrer et restaurer les règles:

$ netfilter-persistent save
$ netfilter-persistent reload

J’espère que vous trouverez le pare-feu iptables facile. Revenez.

Merci.

Fondateur de LikeGeeks. Je travaille comme administrateur système Linux depuis 2010. Je suis responsable de la maintenance, de la sécurisation et du dépannage des serveurs Linux pour plusieurs clients à travers le monde. J’adore écrire des scripts shell et Python pour automatiser mon travail.