Iptables Essentials : règles et commandes courantes du pare-feu
Introduction
Iptables est un pare-feu logiciel pour les distributions Linux. Ce guide de style feuille de triche fournit une référence rapide aux commandes iptables qui créeront des règles de pare-feu utiles dans les scénarios courants et quotidiens. Cela inclut des exemples iptables d'autorisation et de blocage de divers services par port, interface réseau et adresse IP source.
Comment utiliser ce guide
- La plupart des règles décrites ici supposent que votre iptables est défini sur le trafic entrant DROP, via la stratégie d'entrée par défaut, et que vous souhaitez autoriser de manière sélective le trafic entrant.
- Utilisez les sections suivantes qui s'appliquent à ce que vous essayez d'accomplir. La plupart des sections ne sont basées sur aucune autre, vous pouvez donc utiliser les exemples ci-dessous indépendamment
- Utilisez le menu Contenu sur le côté droit de cette page (à grande largeur de page) ou la fonction de recherche de votre navigateur pour localiser les sections dont vous avez besoin
- Copiez et collez les exemples de ligne de commande donnés, en remplaçant les valeurs en surbrillance par les vôtres
Gardez à l'esprit que l'ordre de vos règles est important. Toutes ces commandes iptables
utilisent l'option -A
pour ajouter la nouvelle règle à la fin d'une chaîne. Si vous souhaitez la mettre ailleurs dans la chaîne, vous pouvez utiliser l'option -I
qui permet de spécifier la position de la nouvelle règle (ou la placer en début de chaîne en ne spécifiant pas de numéro de règle ).
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 Web pour corriger votre accès. Si vous utilisez DigitalOcean, vous pouvez lire notre documentation produit de la console de récupération pour plus d'informations. Une fois que vous êtes connecté via la console, vous pouvez modifier vos règles de pare-feu pour autoriser l'accès SSH (ou autoriser tout le trafic). Si vos règles de pare-feu enregistrées autorisent l'accès SSH, une autre méthode consiste à redémarrer votre serveur.
N'oubliez pas que vous pouvez vérifier votre ensemble de règles iptables actuel avec sudo iptables -S
et sudo iptables -L
.
Jetons un coup d'œil aux commandes iptables !
Enregistrement des règles
Les règles Iptables sont éphémères, ce qui signifie qu'elles doivent être enregistrées manuellement pour qu'elles persistent après un redémarrage.
Sur Ubuntu, une façon de sauvegarder les règles iptables consiste à utiliser le package iptables-persistent
. Installez-le avec apt comme ceci :
sudo apt install iptables-persistent
Lors de l'installation, il vous sera demandé si vous souhaitez enregistrer vos règles de pare-feu actuelles.
Si vous mettez à jour vos règles de pare-feu et souhaitez enregistrer les modifications, exécutez cette commande :
sudo netfilter-persistent save
D'autres distributions Linux peuvent avoir d'autres moyens de rendre vos modifications iptables permanentes. Veuillez vous référer à la documentation correspondante pour plus d'informations.
Règles d'inscription et de suppression
Si vous voulez savoir comment répertorier et supprimer des règles iptables, consultez ce didacticiel : Comment répertorier et supprimer des règles de pare-feu Iptables.
Règles généralement utiles
Cette section comprend une variété de commandes iptables qui créeront des règles généralement utiles sur la plupart des serveurs.
Autoriser les connexions de bouclage
L'interface loopback, également appelée lo
, est ce qu'un ordinateur utilise pour transférer les connexions réseau vers lui-même. Par exemple, si vous exécutez ping localhost
ou ping 127.0.0.1
, votre serveur se cinglera en utilisant le bouclage. L'interface de bouclage est également utilisée si vous configurez votre serveur d'applications pour se connecter à un serveur de base de données avec une adresse localhost
. En tant que tel, vous voudrez vous assurer que votre pare-feu autorise ces connexions.
Pour accepter tout le trafic sur votre interface de bouclage, exécutez ces commandes :
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
Autorisation des connexions entrantes établies et associées
Comme le trafic réseau doit généralement être bidirectionnel (entrant et sortant) pour fonctionner correctement, il est courant de créer une règle de pare-feu qui autorise le trafic entrant établi et lié, de sorte que le autorisera le trafic de retour pour les connexions sortantes initiées par le serveur lui-même. Cette commande va permettre que :
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Autorisation des connexions sortantes établies
Vous pouvez autoriser le trafic sortant de toutes les connexions établies, qui sont généralement la réponse aux connexions entrantes légitimes. Cette commande va permettre que :
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
Autoriser le réseau interne à accéder à l'externe
En supposant que eth0
est votre réseau externe et eth1
est votre réseau interne, cela permettra à votre interne d'accéder à l'externe :
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Suppression de paquets invalides
Certains paquets de trafic réseau sont marqués comme invalide. Parfois, il peut être utile de consigner ce type de paquets, mais il est souvent préférable de les supprimer. Faites-le avec cette commande :
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Bloquer une adresse IP
Pour bloquer les connexions réseau qui proviennent d'une adresse IP spécifique, 203.0.113.51
par exemple, exécutez cette commande :
sudo iptables -A INPUT -s 203.0.113.51 -j DROP
Dans cet exemple, -s 203.0.113.51
spécifie une adresse IP source de « 203.0.113.51 ». L'adresse IP source peut être spécifiée dans n'importe quelle règle de pare-feu, y compris une règle allow.
Si vous souhaitez rejeter la connexion à la place, qui répondra à la demande de connexion avec une erreur "connexion refusée", remplacez "DROP" par "REJECT" comme ceci :
sudo iptables -A INPUT -s 203.0.113.51 -j REJECT
Blocage des connexions à une interface réseau
Pour bloquer les connexions à partir d'une adresse IP spécifique, par exemple 203.0.113.51
, à une interface réseau spécifique, par exemple eth0
, utilisez cette commande :
iptables -A INPUT -i eth0 -s 203.0.113.51 -j DROP
C'est le même que l'exemple précédent, avec l'ajout de -i eth0
. L'interface réseau peut être spécifiée dans n'importe quelle règle de pare-feu et constitue un excellent moyen de limiter la règle à un réseau particulier.
Service : SSH
Si vous utilisez un serveur sans console locale, vous souhaiterez probablement autoriser les connexions SSH entrantes (port 22) afin de pouvoir vous connecter et gérer votre serveur. Cette section explique comment configurer votre pare-feu avec diverses règles liées à SSH.
Autoriser tous les SSH entrants
Pour autoriser toutes les connexions SSH entrantes, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions SSH établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser le SSH entrant à partir d'une adresse IP ou d'un sous-réseau spécifique
Pour autoriser les connexions SSH entrantes à partir d'une adresse IP ou d'un sous-réseau spécifique, spécifiez la source. Par exemple, si vous souhaitez autoriser l'intégralité du sous-réseau 203.0.113.0/24
, exécutez ces commandes :
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions SSH établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser le SSH sortant
Si votre politique de pare-feu OUTPUT
n'est pas définie sur ACCEPT
et que vous souhaitez autoriser les connexions SSH sortantes (votre serveur initiant une connexion SSH vers un autre serveur), vous pouvez exécuter ces commandes :
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
Autoriser Rsync entrant à partir d'une adresse IP ou d'un sous-réseau spécifique
Rsync, qui s'exécute sur le port 873, peut être utilisé pour transférer des fichiers d'un ordinateur à un autre.
Pour autoriser les connexions rsync entrantes à partir d'une adresse IP ou d'un sous-réseau spécifique, spécifiez l'adresse IP source et le port de destination. Par exemple, si vous souhaitez autoriser l'ensemble du sous-réseau 203.0.113.0/24
à pouvoir se synchroniser avec votre serveur, exécutez ces commandes :
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions rsync établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Service : Serveur Web
Les serveurs Web, tels qu'Apache et Nginx, écoutent généralement les requêtes sur les ports 80 et 443 pour les connexions HTTP et HTTPS, respectivement. Si votre politique par défaut pour le trafic entrant est configurée pour abandonner ou refuser, vous souhaiterez créer des règles qui permettront à votre serveur de répondre à ces demandes.
Autoriser tous les HTTP entrants
Pour autoriser toutes les connexions HTTP entrantes (port 80), exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions HTTP établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les HTTPS entrants
Pour autoriser toutes les connexions HTTPS entrantes (port 443), exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions HTTP établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les HTTP et HTTPS entrants
Si vous souhaitez autoriser le trafic HTTP et HTTPS, vous pouvez utiliser le module multiport pour créer une règle qui autorise les deux ports. Pour autoriser toutes les connexions HTTP et HTTPS entrantes (port 443), exécutez ces commandes :
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions HTTP et HTTPS établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Service : MySQL
MySQL écoute les connexions client sur le port 3306. Si votre serveur de base de données MySQL est utilisé par un client sur un serveur distant, vous devez vous assurer d'autoriser ce trafic.
Autoriser MySQL à partir d'une adresse IP ou d'un sous-réseau spécifique
Pour autoriser les connexions MySQL entrantes à partir d'une adresse IP ou d'un sous-réseau spécifique, spécifiez la source. Par exemple, si vous souhaitez autoriser l'intégralité du sous-réseau 203.0.113.0/24
, exécutez ces commandes :
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions MySQL établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser MySQL à une interface réseau spécifique
Pour autoriser les connexions MySQL à une interface réseau spécifique, disons que vous avez une interface réseau privée eth1
, par exemple, utilisez ces commandes :
sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions MySQL établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Service : PostgreSQL
PostgreSQL écoute les connexions client sur le port 5432. Si votre serveur de base de données PostgreSQL est utilisé par un client sur un serveur distant, vous devez vous assurer d'autoriser ce trafic.
PostgreSQL à partir d'une adresse IP ou d'un sous-réseau spécifique
Pour autoriser les connexions PostgreSQL entrantes à partir d'une adresse IP ou d'un sous-réseau spécifique, spécifiez la source. Par exemple, si vous souhaitez autoriser l'intégralité du sous-réseau 203.0.113.0/24
, exécutez ces commandes :
sudo iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions PostgreSQL établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser PostgreSQL à une interface réseau spécifique
Pour autoriser les connexions PostgreSQL à une interface réseau spécifique (disons que vous avez une interface réseau privée eth1
, par exemple), utilisez ces commandes :
sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions PostgreSQL établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Prestation : Courrier
Les serveurs de messagerie, tels que Sendmail et Postfix, écoutent sur une variété de ports en fonction des protocoles utilisés pour la livraison du courrier. Si vous utilisez un serveur de messagerie, déterminez les protocoles que vous utilisez et autorisez les types de trafic appropriés. Nous vous montrerons également comment créer une règle pour bloquer le courrier SMTP sortant.
Blocage du courrier SMTP sortant
Si votre serveur ne doit pas envoyer de courrier sortant, vous pouvez bloquer ce type de trafic. Pour bloquer le courrier SMTP sortant, qui utilise le port 25, exécutez cette commande :
sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT
Cela configure iptables pour rejeter tout le trafic sortant sur le port 25. Si vous devez rejeter un service différent par son numéro de port, au lieu du port 25, remplacez ce numéro de port par 25
ci-dessus.
Autoriser tous les SMTP entrants
Pour permettre à votre serveur de répondre aux connexions SMTP sur le port 25, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions SMTP établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les IMAP entrants
Pour permettre à votre serveur de répondre aux connexions IMAP, port 143, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions IMAP établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les IMAPS entrants
Pour permettre à votre serveur de répondre aux connexions IMAPS, port 993, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions IMAPS établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les POP3 entrants
Pour permettre à votre serveur de répondre aux connexions POP3, port 110, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions POP3 établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Autoriser tous les POP3 entrants
Pour permettre à votre serveur de répondre aux connexions POP3S, port 995, exécutez ces commandes :
sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
La deuxième commande, qui autorise le trafic sortant des connexions POP3S établies, n'est nécessaire que si la politique OUTPUT
n'est pas définie sur ACCEPT
.
Conclusion
Cela devrait couvrir la plupart des commandes couramment utilisées lors de la configuration d'un pare-feu iptables. Bien sûr, iptables est un outil très flexible, alors n'hésitez pas à mélanger et assortir les commandes avec différentes options pour répondre à vos besoins spécifiques s'ils ne sont pas couverts ici.
Si vous cherchez de l'aide pour déterminer comment votre pare-feu doit être configuré, consultez ce didacticiel : Comment choisir une politique de pare-feu efficace pour sécuriser vos serveurs.