Tutoriel iptables : sécurisez un VPS avec un pare-feu Linux

Iptables est un outil de pare-feu Linux qui vous permet de contrôler le trafic qui atteint votre VPS en configurant des règles pour autoriser, bloquer, transférer et filtrer les paquets.

Il s’appuie sur le framework netfilter intégré au noyau Linux et reste l’une des solutions de pare-feu les plus utilisées sur les serveurs Linux.

Iptables organise les règles en tables, chaînes, critères de correspondance et cibles. Pour configurer votre pare-feu en toute sécurité, commencez par autoriser SSH et les connexions établies avant d’appliquer des règles DROP. Vous devez également enregistrer explicitement les règles pour les conserver après un redémarrage.

UFW et nftables constituent également des alternatives adaptées selon vos besoins.

Les principales étapes pour configurer iptables sont les suivantes :

  1. Vérifiez et installez iptables.
  2. Affichez les règles existantes.
  3. Autorisez SSH avant d’appliquer des règles restrictives.
  4. Ajoutez les règles de pare-feu de base.
  5. Ouvrez les ports des services courants.
  6. Supprimez ou videz les règles.
  7. Enregistrez les règles de manière permanente.

Qu’est-ce qu’iptables ?

Iptables est un outil de pare-feu en ligne de commande qui gère les règles de pare-feu Linux par l’intermédiaire de netfilter, un système de filtrage des paquets directement intégré au noyau Linux. Chaque paquet qui entre dans votre serveur ou qui en sort passe par netfilter, tandis qu’iptables fournit les règles qui déterminent son traitement.

Iptables gère le trafic IPv4. Pour le trafic IPv6, vous devez utiliser ip6tables, qui reprend la même syntaxe mais fonctionne avec un ensemble de règles distinct.

Le fonctionnement d’iptables repose sur cinq concepts fondamentaux :

ConceptDescription
TableEnsemble de chaînes regroupées selon leur fonction. Les principales tables sont filter, nat et mangle.
ChaîneListe de règles au sein d’une table. Les chaînes intégrées comprennent INPUT, OUTPUT et FORWARD.
RègleCondition à laquelle un paquet est comparé. Si le paquet correspond à cette condition, iptables applique la cible.
Critère de correspondanceCritères utilisés pour évaluer un paquet : adresse IP source, port de destination, protocole, etc.
CibleAction effectuée lorsqu’un paquet correspond à une règle : ACCEPT, DROP, RETURN ou REJECT.

La plupart des configurations de base pour la sécurité des VPS utilisent la table filter, qui contient trois chaînes par défaut. INPUT gère les paquets entrants destinés au serveur. OUTPUT gère les paquets sortants du serveur. FORWARD gère les paquets acheminés vers une destination autre que le serveur.

Comment fonctionne iptables ?

Iptables compare chaque paquet aux règles d’une chaîne, de haut en bas. Dès qu’un paquet correspond à une règle, celle-ci s’applique et iptables cesse d’examiner les règles suivantes de la chaîne. L’ordre est donc important : une règle placée plus haut peut autoriser ou bloquer le trafic avant que les suivantes ne soient évaluées.

Vous pouvez ajouter des règles de deux manières : l’option -A ajoute une règle à la fin d’une chaîne, tandis que l’option -I permet d’en insérer une à un emplacement précis. Cette dernière est utile lorsqu’une règle doit être évaluée avant celles qui existent déjà. Si vous ajoutez une règle DROP générale avant celle qui autorise SSH, vous perdrez l’accès au serveur. Ajouter les règles dans le bon ordre permet d’éviter ce problème.

Ajoutez toujours les règles d’autorisation indispensables, en particulier celle de SSH, avant toute règle qui bloque ou rejette le trafic.

Quelle est la différence entre iptables, ip6tables et nftables ?

Iptables gère les règles de pare-feu IPv4. ip6tables gère celles d’IPv6 avec la même syntaxe de commande, mais les deux ensembles de règles sont totalement distincts : une règle iptables n’a aucun effet sur le trafic IPv6, et inversement.

Nftables est le framework de pare-feu Linux plus récent qui remplace à la fois iptables et ip6tables. Il gère IPv4 et IPv6 au sein d’un même ensemble de règles et utilise une syntaxe plus claire. Sur les versions récentes d’Ubuntu, les commandes iptables peuvent s’exécuter de manière transparente via un backend nftables. Dans ce cas, les règles iptables sont en réalité stockées et traitées par nftables.

Si vous préférez simplifier la gestion du pare-feu sous Ubuntu sans écrire directement de règles iptables, UFW est présenté plus loin dans ce guide.

Comment configurer iptables sur un VPS Ubuntu

Pour configurer le pare-feu d’un VPS avec iptables en toute sécurité, ajoutez les règles dans un ordre précis : vérifiez d’abord les règles existantes, puis autorisez SSH, les connexions établies et les ports des services nécessaires avant de bloquer le moindre trafic.

Appliquez les règles DROP en dernier. Si vous ne respectez pas cet ordre, vous risquez de perdre l’accès à un serveur auquel vous ne pourrez plus vous connecter.

1. Vérifiez et installez iptables

Iptables est préinstallé sur la plupart des distributions Linux. Ce tutoriel utilise principalement un VPS Ubuntu comme exemple. Pour vérifier si iptables est déjà disponible sur votre système, exécutez :

iptables --version

Si la commande renvoie un numéro de version, iptables est déjà installé. Sur les versions récentes d’Ubuntu, la sortie peut faire référence au backend nftables, ce qui signifie que les commandes iptables sont traitées par nftables. Dans les deux cas, la syntaxe reste la même.

Si iptables n’est pas installé, exécutez :

sudo apt update

sudo apt install iptables

2. Affichez les règles iptables existantes

Vérifiez les règles existantes avant d’en ajouter de nouvelles. Une règle peut déjà autoriser ou bloquer le trafic que vous souhaitez configurer. L’ajout de règles en double ou contradictoires peut entraîner un comportement imprévisible.

Affichez toutes les règles actuelles avec des informations détaillées et les numéros de ligne :

sudo iptables -L -v -n --line-numbers

L’option -n affiche les adresses IP et les numéros de port sous forme numérique au lieu de les résoudre en noms d’hôtes, ce qui est plus rapide et plus lisible. Les numéros de ligne indiquent la position de chaque règle dans la chaîne. Vous en aurez besoin pour supprimer ou insérer des règles à des emplacements précis.

Les compteurs de paquets et d’octets dans la sortie indiquent si du trafic correspond effectivement à chaque règle, ce qui facilite le dépannage.

3. Autorisez SSH avant de modifier les règles du pare-feu

Warning

Si vous appliquez des règles de pare-feu restrictives avant d’autoriser SSH, vous perdrez l’accès à votre VPS. Aucun message d’erreur ne s’affichera : la connexion sera simplement interrompue et vous ne pourrez plus accéder au serveur.

Autorisez SSH avant d’ajouter toute règle DROP ou REJECT. Le port SSH par défaut est le port 22 :

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Si vous avez modifié le port SSH de votre VPS, remplacez 22 par le numéro de port correspondant. En cas de doute, vérifiez la configuration de votre serveur en ouvrant ce fichier :

sudo nano /etc/ssh/sshd_config

Les mots de passe constituent la méthode d’authentification SSH la plus courante, mais il est plus sûr de configurer des clés SSH avant de renforcer les restrictions de votre pare-feu.

Après avoir ajouté la règle SSH, gardez votre session actuelle ouverte et testez l’accès depuis une deuxième fenêtre de terminal avant d’enregistrer des règles restrictives. Si la deuxième connexion réussit, vous pouvez continuer en toute sécurité.

4. Ajoutez les règles de pare-feu iptables de base

Les règles suivantes complètent votre pare-feu par ordre de priorité. Ajoutez-les dans l’ordre indiqué ci-dessous pour éviter de bloquer le trafic dont vous avez besoin.

Autorisez le trafic sur localhost

Le trafic de l’interface de bouclage reste à l’intérieur du serveur. Le bloquer interromprait les communications internes entre les services exécutés sur la même machine, par exemple entre une application web et une base de données locale :

sudo iptables -A INPUT -i lo -j ACCEPT

Autorisez les connexions établies et associées

Cette règle autorise le trafic associé aux connexions que votre serveur a déjà initiées ou acceptées. Sans elle, les réponses aux requêtes sortantes seraient bloquées :

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Autorisez HTTP et HTTPS

Ouvrez les ports 80 et 443 pour autoriser le trafic web :

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Bloquez une adresse IP spécifique

Pour bloquer tout le trafic provenant d’une seule adresse IP :

sudo iptables -A INPUT -s 192.0.2.1 -j DROP

Bloquez une plage d’adresses IP

Utilisez le module iprange pour bloquer le trafic provenant d’une plage d’adresses :

sudo iptables -A INPUT -m iprange --src-range 192.0.2.1-192.0.2.254 -j DROP

Bloquez les paquets non valides

Les paquets non valides n’appartiennent à aucune connexion connue et sont souvent utilisés dans les attaques réseau. Bloquez-les avant qu’ils n’atteignent vos services :

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Bloquez tout autre trafic entrant

Ajoutez cette règle en dernier. Elle bloque tout trafic entrant qui n’a pas correspondu à une règle ACCEPT précédente. Si vous la placez avant vos règles d’autorisation, elle bloquera tout le trafic, y compris SSH :

sudo iptables -A INPUT -j DROP

5. Ouvrez les ports des services courants avec iptables

Chaque service exécuté sur votre VPS utilise un port spécifique. Iptables nécessite une règle explicite pour autoriser le trafic sur ce port :

ServiceProtocolePortRemarques
SSHTCP22Modifiez le port par défaut si possible
HTTPTCP80Nécessaire pour le trafic web non chiffré
HTTPSTCP443Nécessaire pour le trafic web chiffré
MySQLTCP3306Limitez l’accès aux adresses IP de confiance
PostgreSQLTCP5432Limitez l’accès aux adresses IP de confiance
SMTPTCP25Uniquement si vous exploitez un serveur de messagerie
IMAPTCP993Uniquement si vous exploitez un serveur de messagerie

N’ouvrez jamais les ports de base de données tels que les ports 3306 et 5432 sur internet. Limitez plutôt leur accès à une adresse IP de confiance ou à une interface réseau privée :

sudo iptables -A INPUT -p tcp --dport 3306 -s 192.0.2.1 -j ACCEPT

Remplacez 192.0.2.1 par l’adresse IP de la machine qui doit accéder à la base de données.

6. Supprimez ou videz les règles iptables

La suppression d’une règle précise ne modifie pas le reste de votre configuration, tandis que le vidage supprime toutes les règles en une seule fois.

Supprimez une règle spécifique

Pour supprimer une règle sans affecter les autres, utilisez son numéro de ligne. Commencez par afficher les règles avec leurs numéros :

sudo iptables -L INPUT --line-numbers

Supprimez ensuite la règle à la position souhaitée. Pour supprimer la règle nº 3 de la chaîne INPUT :

sudo iptables -D INPUT 3

Videz toutes les règles

Pour supprimer toutes les règles en une seule fois, utilisez l’option -F :

sudo iptables -F

Warning

Vider les règles d’un VPS distant supprime toutes les règles d’autorisation et de blocage. Si la politique par défaut des chaînes est DROP, le vidage vous fera perdre l’accès au serveur. Si la politique par défaut est ACCEPT, tous les ports seront exposés. Vérifiez votre politique par défaut avant de vider les règles.

DROP ou REJECT

Pour bloquer le trafic, vous avez deux possibilités. DROP écarte silencieusement le paquet : l’expéditeur ne reçoit aucune réponse et la connexion finit par expirer. REJECT rejette le paquet et renvoie un message d’erreur à l’expéditeur. Cette méthode facilite le dépannage, mais confirme également à l’expéditeur que le port existe.

Utilisez DROP pour les règles destinées aux services accessibles depuis Internet lorsque vous ne souhaitez pas divulguer d’informations sur votre serveur. Utilisez REJECT dans les environnements internes ou de développement, où un retour plus rapide est utile.

7. Enregistrez les règles iptables de manière permanente

Par défaut, les règles iptables sont stockées en mémoire et ne sont pas conservées après un redémarrage. Pour les conserver après le redémarrage du VPS, enregistrez-les dans un fichier.

Installez iptables-persistent

Le paquet iptables-persistent enregistre et charge automatiquement les règles. Sous Ubuntu, son installation entraîne également celle de netfilter-persistent, le service sous-jacent qui charge les règles enregistrées au démarrage :

sudo apt install iptables-persistent

Pendant l’installation, vous serez invité à enregistrer vos règles IPv4 et IPv6 actuelles. Choisissez Oui dans les deux cas.

Enregistrez les règles manuellement

Si vous avez installé iptables-persistent, le répertoire /etc/iptables/ existe déjà. Après avoir ajouté ou modifié des règles, enregistrez-les pour les conserver après les redémarrages :

sudo netfilter-persistent save

Cette commande enregistre respectivement les règles IPv4 et IPv6 dans /etc/iptables/rules.v4 et /etc/iptables/rules.v6.

Restaurez les règles manuellement

Pour recharger les règles enregistrées sans redémarrer le serveur :

sudo iptables-restore < /etc/iptables/rules.v4

sudo ip6tables-restore < /etc/iptables/rules.v6

Vérifiez les règles après le redémarrage

Après avoir redémarré votre VPS, vérifiez que les règles ont été correctement chargées :

sudo iptables -L -v -n

La sortie doit correspondre aux règles que vous avez enregistrées avant le redémarrage.

Comment configurer le NAT et la redirection de ports avec iptables

Le NAT et la redirection de ports sont utilisés lorsque votre VPS fait office de passerelle, de routeur, de point de terminaison VPN ou sert à transférer du trafic, en acheminant des paquets entre différents réseaux ou en redirigeant le trafic d’un port vers un autre. Ces règles utilisent la table nat, et non la table filter utilisée dans les étapes précédentes.

La redirection de ports nécessite également d’activer le transfert IP au niveau du noyau. Pour l’activer temporairement :

sudo sysctl -w net.ipv4.ip_forward=1

Pour rendre cette modification permanente, ajoutez la ligne suivante dans /etc/sysctl.conf :

net.ipv4.ip_forward=1

Appliquez ensuite la modification :

sudo sysctl -p

Pour rediriger le trafic arrivant sur le port 80 vers un autre hôte de votre réseau :

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.0.2.1:80

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

Si la politique de votre chaîne FORWARD est définie sur DROP, vous devez également autoriser explicitement le trafic acheminé :

sudo iptables -A FORWARD -p tcp -d 192.0.2.1 --dport 80 -j ACCEPT

iptables ou UFW : quel outil de pare-feu choisir ?

Iptables vous offre un contrôle direct sur tous les aspects de votre pare-feu, notamment l’ordre des règles, le NAT, la redirection de ports, les chaînes personnalisées et la compatibilité avec les scripts existants. Ce niveau de contrôle a toutefois un coût : la syntaxe est assez lourde, l’ordre des règles ne laisse aucune place à l’erreur et une mauvaise configuration sur un VPS distant peut vous faire perdre immédiatement l’accès au serveur.

UFW (Uncomplicated Firewall) est une interface pour iptables qui simplifie les tâches courantes de gestion du pare-feu sous Ubuntu. Si vous devez uniquement autoriser SSH, HTTP et HTTPS, vous pouvez configurer un pare-feu sous Ubuntu avec UFW à l’aide de quelques commandes, sans risquer de commettre d’erreur dans l’ordre des règles.

Nftables est le framework plus récent destiné à remplacer iptables à long terme. Il gère IPv4 et IPv6 dans un même ensemble de règles et utilise une syntaxe plus claire, mais nécessite de se familiariser avec un nouveau framework en partant de zéro.

Le choix dépend de vos besoins :

  • Utilisez UFW si vous avez uniquement besoin de règles de base, comme celles qui autorisent SSH, HTTP et HTTPS sur un VPS Ubuntu.
  • Utilisez iptables si vous avez besoin de règles personnalisées, du NAT, de la redirection de ports, d’un ordre strict des règles ou d’une compatibilité avec des scripts existants.
  • Utilisez nftables si vous configurez un nouveau serveur et souhaitez adopter un framework de pare-feu moderne sans les contraintes des systèmes hérités.

Comment dépanner les règles iptables

Lorsque les règles iptables ne fonctionnent pas comme prévu, commencez par examiner les règles actives avec un affichage détaillé et les numéros de ligne :

sudo iptables -L -v -n --line-numbers

Vérifiez quatre éléments : l’ordre des règles, les numéros de ligne, les compteurs de paquets et d’octets, ainsi que le backend actif.

L’ordre détermine quelle règle s’applique en premier. Des règles ACCEPT ou DROP mal placées constituent la cause la plus fréquente de comportements inattendus. Les compteurs indiquent si le trafic correspond effectivement à une règle, ce qui vous permet de déterminer si celle-ci fonctionne ou si le trafic la contourne complètement.

Sur les versions récentes d’Ubuntu, vérifiez également si iptables fonctionne via le backend nftables, car cela peut influer sur la manière dont les règles sont stockées et appliquées.

Rétablissez l’accès après un blocage SSH

Perdre l’accès à votre VPS via SSH est l’une des erreurs de configuration d’iptables les plus problématiques. Une erreur de connexion SSH refusée après l’application des règles de pare-feu signifie généralement qu’une règle trop restrictive bloque le port 22 avant que la règle ACCEPT ne soit atteinte.

Les utilisateurs d’un VPS Hostinger peuvent rétablir l’accès à leur serveur depuis le terminal hPanel accessible dans un navigateur web, sans connexion SSH. Depuis ce terminal, vous pouvez supprimer la règle de blocage ou vider toutes les règles pour rétablir l’accès.

Réinitialisez les règles si nécessaire

La réinitialisation de toutes les règles avec iptables -F est utile lorsque votre ensemble de règles est devenu trop complexe à dépanner ou lorsque vous souhaitez repartir d’une configuration vierge.

Points clés à retenir sur l’utilisation d’iptables

Iptables reste un choix fiable pour contrôler précisément un pare-feu, créer des règles personnalisées, configurer le NAT et la redirection de ports, et assurer la compatibilité avec les scripts existants.

Pour une configuration simple de VPS Ubuntu où vous devez uniquement autoriser SSH, HTTP et HTTPS, UFW permet d’obtenir le même résultat avec moins de complexité. Si vous configurez un nouveau serveur à partir de zéro, il est intéressant de vous familiariser avec nftables, qui s’impose comme le successeur moderne d’iptables à long terme.

Les règles de pare-feu contrôlent le trafic qui peut atteindre votre VPS, mais elles n’empêchent pas les tentatives de connexion répétées provenant d’adresses dont le trafic est autorisé par ces règles. Pour bloquer automatiquement les attaques par force brute, configurez Fail2Ban en complément de vos règles iptables afin de renforcer la sécurité de votre configuration.

Tout le contenu des tutoriels de ce site est soumis aux normes éditoriales et aux valeurs rigoureuses de Hostinger.

Faradilla, plus connue sous le nom de Ninda, possède 10 ans d’expérience en tant que linguiste et 5 ans en tant que spécialiste du marketing de contenu chez Hostinger. Elle aime suivre les tendances technologiques et aider les autres à résoudre leurs problèmes. Pendant son temps libre, Ninda aime apprendre de nouvelles langues et s’intéresser aux sciences de la vie, ainsi que regarder des vidéos d’animaux. Pour en savoir plus sur Ninda, retrouvez-la sur LinkedIn.

Ce que disent nos clients

Commentaires

7 responses

Write a response

Veuillez remplir les champs obligatoires.Veuillez cocher la case de la confidentialité.Veuillez remplir les champs obligatoires et accepter la case de confidentialité.

Thank you! Your comment has been successfully submitted. It will be approved within the next 24 hours.
Author
GANTUA Flobert

November 13 2020

c'était très bien et très intéressant. Vous avez très bien expliquer ! Merci !

Author
eric DIENOT

October 01 2021

Bonjour, Super tuto, clair et efficace, il m'a bien aidé pour repartir sur une conf iptables propre. En effet je ne sais pas pourquoi firewalld (opensuse15.12/kde) bloque nmblookup de samba alors que tous les ports tcp/udp sont ouverts. Donc je désactive firewalld et utilise iptables. De plus Firewalld utilise la notion de 'zone' mais avec une seule carte réseau ça ne sert a rien. Il faudrait que les zones correspondant a des ranges IP entrants et sortant, comme par exemple zone home:192.168.0.0, zone trusted: une liste ip, zone dmz: la dmz....Hors firewalld ne propose pas ces réglages. Avec iptables on peut faire ce genre de regles même si ça ne s'appelle pas Zone... Bonne journée à tous!

Author
DARI Moussa

January 17 2023

bien clair ,je vous remercie !