25+ commandes iptables les plus courantes avec exemples



Si vous utilisez un système Linux, vous avez à votre disposition de multiples options pour assurer la sécurité de votre appareil. L’une d’elles est iptables, un outil de pare-feu en ligne de commande, offrant une grande souplesse et une protection efficace.

Cependant, étant donné qu’il s’agit d’un utilitaire en ligne de commande, il implique une certaine courbe d’apprentissage.

Ainsi, que vous soyez un administrateur système ou un utilisateur Linux en phase d’apprentissage, cet article est pour vous. Nous allons passer en revue les commandes iptables les plus courantes, en vous fournissant des exemples concrets.

Qu’est-ce que iptables ?

Iptables est un pare-feu logiciel intégré aux systèmes Linux. Il permet aux utilisateurs de définir des politiques qui ont un impact direct et indirect sur le flux de données internet.

Autrement dit, vous pouvez utiliser iptables pour établir des règles qui bloquent ou autorisent le trafic selon le port, l’adresse IP source, les interfaces réseau, etc.

Une fois les règles établies, tout le trafic doit les respecter. Ainsi, pour chaque nouvelle connexion, iptables vérifiera les règles prédéfinies qui correspondent. Si une règle s’applique, elle sera mise en œuvre pour la connexion. En l’absence de règles correspondantes, la règle par défaut sera appliquée.

Pour utiliser iptables, vous devez entrer la commande suivante :

$ iptables -L -n -v 

Les paramètres de cette commande ont les significations suivantes :

  • -L sert à lister toutes les règles.
  • -n permet un affichage numérique pour une performance accrue.
  • -v permet un affichage détaillé.

Si vous exécutez la commande iptables sans aucun paramètre, le résultat suivant s’affichera :

iptables v1.8.7 (nf_tables): no command specified

Try `iptables -h' or 'iptables --help' for more information.

Si vous rencontrez une erreur indiquant que la commande « iptables » est introuvable, vous devez l’installer.

Pour installer iptables sur votre distribution Linux, utilisez la commande suivante :

$ sudo apt-get install iptables

Le résultat suivant sera affiché car iptables est déjà préinstallé dans ma distribution Linux :

#output
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
iptables is already the newest version (1.8.7-1ubuntu5).
iptables set to manually installed.
0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.

Qu’est-ce qu’un pare-feu ?

Les pare-feu constituent la forme la plus élémentaire de protection pour les systèmes, les réseaux et les ordinateurs personnels. Ils peuvent être matériels ou logiciels et fonctionnent en appliquant des règles.

La plupart des pare-feu sont hautement personnalisables, ce qui permet de créer ou de modifier les règles. Par exemple, comme les paquets provenant d’internet utilisent des ports pour accéder à un système, une analyse basée sur les ports peut être utile pour les filtrer. De plus, vous pouvez autoriser ou bloquer des services selon l’adresse IP source ou l’interface réseau.

Si vous utilisez Linux, vous avez accès à iptables. Vous pouvez également utiliser un pare-feu Linux autonome pour renforcer la protection de votre système.

Pourquoi utiliser iptables pour configurer le pare-feu ?

Mais pourquoi utiliser iptables ? Il existe pourtant des outils de pare-feu en ligne de commande alternatifs tels que ufw et firewalld, ainsi que des pare-feu Linux autonomes, plus faciles à utiliser et offrant davantage de fonctionnalités.

Alors, qu’est-ce qui rend iptables si attrayant pour la configuration d’un pare-feu ? Voici quelques raisons :

  • Il offre une grande flexibilité dès le départ, permettant de définir des règles au niveau du paquet.
  • Il est relativement simple à utiliser une fois que l’on comprend son fonctionnement.
  • Il permet de bloquer facilement le trafic indésirable.
  • Il permet de rediriger les paquets vers une autre adresse IP.
  • Il protège vos systèmes contre les attaques par déni de service (DoS).

Et bien plus encore !

Comprendre l’architecture d’iptables et sa relation avec Netfilter

Pour bien comprendre iptables, il faut se familiariser avec son architecture. Cela permet de mieux appréhender les différents composants d’iptables et de les utiliser efficacement pour écrire des règles de pare-feu.

Quand on parle d’iptables, Netfilter est également à considérer. On peut voir Netfilter comme le grand frère d’iptables. Il s’appuie sur iptables et offre un éventail de fonctionnalités plus large pour gérer votre pare-feu. Il utilise notamment iptables pour fournir d’excellentes capacités de pare-feu.

Iptables est une interface en ligne de commande qui interagit avec les points d’accroche du noyau Netfilter. Ces points d’accroche interagissent avec la pile réseau Linux, influençant les paquets au niveau le plus bas.

Voici l’architecture d’iptables :

Les tables

L’architecture d’iptables commence par les tables. Ces tables servent à organiser les règles. Chaque table est classée selon le type de décision qu’elle prend. En d’autres termes, une table simplifie le traitement des paquets en associant une manière spécifique de les traiter.

Les différentes tables proposées par iptables sont :

  • La table de filtrage : elle spécifie le type de décision pour le filtrage de paquets, c’est-à-dire si un paquet doit atteindre sa destination ou non.
  • La table NAT : elle spécifie le type de décision pour la traduction d’adresse. Le routage des paquets est déterminé en fonction des réseaux NAT. Par exemple, si un paquet ne peut accéder à NAT, il cherchera un réseau non-NAT.
  • La table Mangle : elle gère les besoins de traitement spéciaux des paquets. Vous pouvez la configurer pour modifier les informations d’en-tête du paquet, comme les valeurs TTL.
  • La table brute : elle permet de manipuler dynamiquement le pare-feu iptables. Vous pouvez acheminer les paquets en fonction de leur « état » avant que le noyau Linux ne commence à suivre leur état. Elle est principalement utilisée pour marquer les paquets, qu’ils soient suivis par le système de suivi de connexion ou non. Si un paquet n’est pas suivi, il est défini sur la cible NOTRACK.

Les chaînes

Ensuite, nous avons les « chaînes » à l’intérieur des « tables ».

Ces chaînes gèrent l’inspection approfondie des paquets à différents moments de leur parcours. Par exemple, vous pouvez les inspecter quand ils arrivent à un port ou une interface réseau. De cette manière, une décision peut être prise avant que le paquet ne soit transmis à un processus du système.

Tout comme les tables, vous avez différentes chaînes. Celles-ci incluent :

  • La chaîne PREROUTING : elle gère les paquets qui viennent d’arriver à l’interface réseau.
  • La chaîne INPUT : elle gère le comportement des connexions entrantes. Une fois cela fait, elles sont transmises au processus local.
  • La chaîne OUTPUT : elle gère les paquets produits par les processus.
  • La chaîne FORWARD : elle gère les paquets qui ne sont pas destinés aux systèmes locaux. Elle agit comme un transporteur pour d’autres systèmes de destination, comme un routeur.
  • La chaîne POSTROUTING : elle gère les paquets sur le point de quitter l’interface réseau.

Toutes les chaînes ne sont pas disponibles dans chaque table. Par exemple, la chaîne FORWARD n’est disponible que dans les tables mangle, filter et security. De même, la chaîne POSTROUTING est disponible dans mangle et nat (SNAT). Seule la chaîne OUTPUT est présente dans toutes les tables.

Les cibles

Enfin, nous avons la « cible ». Lorsqu’un paquet arrive, il passe par les chaînes pour voir quelle règle lui correspond le mieux. Si une règle est trouvée, l’action correspondante est exécutée, et le paquet est envoyé vers la cible, scellant son sort.

Dans de nombreux cas, un paquet ne correspond à aucune règle. C’est là qu’intervient la stratégie par défaut, qui est aussi une cible.

Les cibles peuvent être ACCEPT, DROP et REJECT. Ce sont des cibles terminales qui décident du sort du paquet.

  • ACCEPT : accepte les paquets.
  • DROP : abandonne le paquet, empêchant l’expéditeur de savoir si le système est présent ou non.
  • REJECT : rejette le paquet.

Il existe également des cibles non terminales, principalement utilisées pour stocker des informations sur le paquet.

Commandes iptables les plus courantes avec exemples

Avant de commencer à exécuter les commandes iptables, assurez-vous de :

  • Avoir les droits d’administrateur pour exécuter les commandes. Si une commande échoue pour cause de privilèges administratifs insuffisants, relancez la commande en la précédant de la commande sudo.
  • Cet article n’est pas un tutoriel sur la configuration d’iptables sur Ubuntu.
  • Nous utiliserons la commande iptables qui fonctionne avec IPv4. Si vous comptez travailler avec IPv6, vous devrez utiliser ip6tables à la place.

Vérification de l’état d’iptables

Pour vérifier l’état actuel d’iptables, utilisez la commande suivante :

$ iptables -L -n -v
#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Le résultat ci-dessus contient beaucoup d’informations. Il indique que le pare-feu est inactif, car toutes les chaînes sont actuellement définies sur ACCEPT et n’ont pas de règles.

Vous devrez ajouter des règles pour activer le pare-feu.

Ajout de règles à la chaîne

Lorsque vous ajoutez une règle, elle est toujours ajoutée à la chaîne. Par conséquent, vous devez utiliser l’option -A (Ajouter). La syntaxe est la suivante :

$ sudo iptables - A

Si vous l’exécutez telle quelle, le résultat suivant sera affiché :

iptables v1.8.7 (nf_tables): option "-A" requires an argument

Try `iptables -h' or 'iptables --help' for more information.

Les arguments que vous pouvez utiliser pour ajouter des règles sont :

  • – i : Il représente l’interface. Vous pouvez mentionner l’interface pour laquelle vous ajoutez des règles, comme ppp0 ou eth0.
  • – p : Il représente le protocole. Vous mentionnez le protocole réseau à utiliser pour filtrer les paquets. Par exemple, ICMP, TCP, UDP, etc. Si vous voulez que la règle s’applique à tous les protocoles, mentionnez « all ».
  • – s : C’est l’argument source, qui mentionne la source du trafic (comme l’adresse IP ou le nom d’hôte).
  • – dport : dport représente le port de destination, où vous mentionnez le numéro de port auquel le paquet est destiné.
  • – j : Enfin, nous avons l’argument TARGET où vous pouvez mentionner le nom TARGET, ACCEPT, DROP ou RETURN.

Il est important d’écrire la commande dans l’ordre suivant :

$ sudo iptables -A <nom-de-chaine> -i <nom-interface> - p <nom-protocole> - s <source> --dport <numéro-de-port> -j <cible>

Enregistrement des modifications dans iptables

Une fois une règle ajoutée, vous pouvez l’enregistrer avec la commande iptables -save.

$ sudo iptables -save

Le résultat est le suivant :

[email protected]:~$ sudo iptables-save

# Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable

-A OUTPUT -o lo -j ACCEPT

COMMIT

# Completed on Sun May 14 13:37:34 2023

Persistance manuelle des règles

Par défaut, iptables n’enregistre pas les règles. Ainsi, si vous redémarrez votre ordinateur, toutes les règles seront supprimées. Pour éviter de reconfigurer iptables, vous devrez utiliser les commandes suivantes.

Pour les règles IPv4, utilisez la commande :

$ sudo iptables-save > /etc/iptables/rules.v4

Pour les règles IPv6, utilisez la commande :

$ sudo iptables-save > /etc/iptables/rules.v6

Règles persistantes automatiquement

Pour que les règles persistent même après un redémarrage, et ce, automatiquement, vous devrez installer le paquet iptables-persistent.

Pour ce faire, exécutez la commande suivante :

$ sudo apt-get install iptables-persistent

Cela ouvrira la fenêtre suivante. Appuyez sur Entrée sur .

Comme nous travaillons avec la table IPv4, seules les règles IPv4 seront affichées. Si vous travaillez avec IPv6, la fenêtre correspondante s’affichera.

Remarque : Le paquet ne charge que vos règles iptables enregistrées. Ainsi, chaque fois que vous modifiez iptables, vous devrez l’enregistrer avec la commande iptables -save.

Règles de rechargement après le redémarrage

Une fois les règles enregistrées, vous devez les restaurer avec la commande suivante :

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

Et

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

Activation du trafic sur Localhost / Activation du bouclage

Pour activer le trafic sur Localhost, utilisez la commande suivante :

$ sudo iptables -A INPUT -i lo -j ACCEPT

Ici, lo représente l’interface de bouclage pour toutes les communications localhost.

De même, nous pouvons autoriser les paquets à sortir via l’interface de bouclage.

$ sudo iptables -A OUTPUT -o lo -j ACCEPT

Pour vérifier comment cela a modifié les règles, exécutez iptables -L -n -V

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Activation du trafic sur des ports particuliers

Vous pouvez activer le trafic pour ACCEPTER ou REJETER sur des ports particuliers.

Par exemple, les ports SSL, HTTP et SSH sont importants pour le bon fonctionnement de vos applications. Vous pouvez ajouter des règles au paquet ACCEPT via les numéros de port pour vous assurer qu’ils fonctionnent comme prévu.

Pour SSL, utilisez la commande suivante.

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

Pour HTTPS, utilisez la commande suivante.

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

Pour autoriser tout le trafic HTTPS à l’interface eth0.

$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

$ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Pour SSH, utilisez la commande suivante.

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

Et pour accepter TOUT le trafic SSH entrant sur l’interface eth0, exécutez ce qui suit :

$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

$ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Un autre exemple serait d’activer le trafic de port sur un port spécifique pour votre application personnalisée. Disons le port 233.

Pour ouvrir des connexions sur ce port, exécutez :

$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT

De même, vous pouvez désactiver les connexions sur un port particulier à l’aide de l’option cible REJECT.

Bloquons toutes les connexions au port 392.

$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT

Pour vérifier, exécutez la commande iptables -L -n -v.

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:233

    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:392 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

 0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0

Supprimer les règles existantes

Pour supprimer les règles existantes, vous pouvez exécuter la commande suivante :

$ iptables -F

ou

$ iptables --flush

Remarque : Si vous n’avez pas enregistré vos règles, elles seront perdues définitivement et ne pourront pas être restaurées avec iptables -restore

Supprimer des règles avec des numéros de ligne

Pour supprimer une règle spécifique, vous devrez obtenir la liste des règles avec des numéros.

$ sudo iptables -L --line-numbers
#output

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination

1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

2    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https

4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:233

5    REJECT     tcp  --  anywhere             anywhere             tcp dpt:392 reject-with icmp-port-unreachable

Exécutez la commande suivante si vous souhaitez supprimer la règle numéro 4 de la chaîne INPUT.

$ sudo iptables -D INPUT 4

Et si vous exécutez de nouveau la commande iptables -n -v -L.

#output

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:392 reject-with icmp-port-unreachable

Afficher uniquement les règles de chaîne INPUT ou OUTPUT

Pour afficher uniquement les règles de la chaîne INPUT, exécutez la commande suivante.

$ sudo iptables -L INPUT -n -v --line-numbers
#ouput

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

num   pkts bytes target     prot opt in     out     source               destination

1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

4        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:392 reject-with icmp-port-unreachable

De même, si vous souhaitez afficher uniquement les règles de chaîne OUTPUT, exécutez :

$ sudo iptables -L OUTPUT -n -v --line-numbers
#output

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

num   pkts bytes target     prot opt in     out     source               destination

1        0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0

Dém