« Iptables » : différence entre les versions

De wiki jackbot
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 26 : Ligne 26 :


<h2>Pour tout le monde</h2>
<h2>Pour tout le monde</h2>
Prenons l'exemple de ssh. Si vous souhaitez autoriser l'accès à cette machine, il faut ajouter les lignes :
Prenons l'exemple de ssh. Si vous souhaitez autoriser l'accès à une machine, il faut ajouter les lignes :


  #autorisation d'entrer
  #autorisation d'entrer
Ligne 32 : Ligne 32 :
  #autorisation de sortir
  #autorisation de sortir
  iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT
  iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT
<h2>Pour une seule ip</h2>
Si vous voulez qu'un seul ordi de votre réseau puisse se connecter en ssh, on peut restreindre l'accès qu'a une seule addresse :
Si vous voulez qu'un seul ordi de votre réseau puisse se connecter en ssh, on peut restreindre l'accès qu'a une seule addresse :
  #autorisation d'entrer
  #autorisation d'entrer
Ligne 37 : Ligne 39 :
  #autorisation de sortir
  #autorisation de sortir
  iptables -t filter -A OUTPUT -d 192.168.1.42 -p tcp --sport 22 -j ACCEPT
  iptables -t filter -A OUTPUT -d 192.168.1.42 -p tcp --sport 22 -j ACCEPT
<h2>Pour un sous-réseau</h2>
Ou alors autoriser à un sous réseau :
Ou alors autoriser à un sous réseau :
  #autorisation d'entrer
  #autorisation d'entrer

Version du 11 juin 2022 à 07:34

Présentation

Iptables est un moyen de configurer netfilter (pare-feu au niveau du noyau linux) en utilisant différentes tables : INPUT, FORWARD et OUTPUT. Il est cependant aussi possible de créer ses propres tables. Voici un visuel très bien fait, permettant de comprendre les différentes étapes

Iptables-Flowchart.jpg


Configuration de base

La seule bonne manière de faire est de tout bloquer puis de configurer ce que l'on souhaite accepter en entrée/sortie. Bien lire ce paragraphe jusqu'au bout pour éviter les blocages. Pour ce faire il faut commencer par vider les tables avec la commande :

iptables -t filter -F

Puis supprimer toutes les chaînes que l'utilisateur a pu rentrer :

iptables -t filter -X

Et enfin bloquer toutes les entrées/sorties :

iptables -t filter -P INPUT   DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT  DROP

À partir de ce moment là votre ordinateur n'acceptera plus aucune données venant de l'extérieur et interdira également toute sortie. S'il s'agit d'un ordinateur distant auquel vous accédez via ssh, votre connexion sera coupé !! Pour éviter que cela n'arrive il faut ajouter les lignes :

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

qui permettent de ne pas casser les connexions déjà établies.

Ouvrir un port

Maintenant que la base est là, on peut autoriser certaines connexions.

Pour tout le monde

Prenons l'exemple de ssh. Si vous souhaitez autoriser l'accès à une machine, il faut ajouter les lignes :

#autorisation d'entrer
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
#autorisation de sortir
iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT

Pour une seule ip

Si vous voulez qu'un seul ordi de votre réseau puisse se connecter en ssh, on peut restreindre l'accès qu'a une seule addresse :

#autorisation d'entrer
iptables -t filter -A INPUT -s 192.168.1.42 -p tcp --dport 22 -j ACCEPT
#autorisation de sortir
iptables -t filter -A OUTPUT -d 192.168.1.42 -p tcp --sport 22 -j ACCEPT

Pour un sous-réseau

Ou alors autoriser à un sous réseau :

#autorisation d'entrer
iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
#autorisation de sortir
iptables -t filter -A OUTPUT -s 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT

Redirection de ports

En plus de gérer les autorisation d'entrées et sorties iptables permet de faire du routage en redirigeant certains ports en entrée vers une autre adresse ip et/ou un autre port :

#redirection du port 25 vers le serveur courriel
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination 192.168.1.42:25
iptables -A FORWARD -p tcp --dport 25 -j ACCEPT

Mais lorsqu'on fait du routage il est généralement conseillé d'avoir plusieurs interfaces réseau, l'option -i va permettre de spécifier à quelle interface s'applique cette règle :

#redirection du port 25 vers le serveur courriel
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.1.42:25
iptables -A FORWARD -i eth0 -p tcp --dport 25 -j ACCEPT

Passerelle

Une passerelle a pour rôle de transférer les paquets provenant du réseau local, vers l'extérieur. Cependant les serveurs à l'extérieur ne pourront pas répondre directement aux ordinateur du réseau local. Il faut donc qu'ils croient communiquer avec la passerelle. Pour se faire il faut modifier la source des paquets sortant. L'option MASQUERADE, permet de modifier la source d'un paquet en utilisant l'adresse ip d'une interface réseau.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Avec cette ligne de commande, les paquets sortant auront pour source la même ip que l'interface eth0.

Chaînes personnalisées

Il peut être très intéressant d'utiliser des chaînes personnalisées.

Création d'une chaîne

Pour créer une nouvelle chaîne il suffit de taper :

iptables -N nom_de_la_chaine

Par défaut cette chaîne sera vide et n'aura donc aucune utilité.

Remplissage

On peut ajouter des règles à cette chaîne avec :

iptables -A nom_de_la_chaine -p tcp --dport 22 -j ACCEPT

Qui aura donc pour but d'accepter les paquets entrant à destination du port 22 Cependant aucun paquet n'atteindra cette règle ...

Où se trouve une chaîne personnalisée dans le diagramme ?

Bonne question. Pour l'instant, nul part ! Pour associer notre nouvelle chaîne au diagramme il faut utiliser ce genre de commande :

iptables -A INPUT -j nom_de_la_chaine

Ce qui aura pour effet qu'un paquet rentrant passera en premier lieu aux travers des règles INPUT. Mais si aucune correspondance n'est trouvé, à la sortie de INPUT, le paquet sera dirigé vers la chaîne : nom_de_la_chaine. Une chaîne personnalisée peut donc se retrouver n'importe où dans le diagramme suivant les associations qui seront faite.

Suppression d'une chaîne

Dans un premier temps il faut vider la chaîne avec :

iptables -F nom_de_la_chaine

Puis la supprimer avec :

iptables -X nom_de_la_chaine

Blocage d'adresse ip

Cas général

Lorsqu'on a un serveur il arrive que l'on voit des adresses essayant de se connecter, souvent à des fin malveillantes. Pour les bloquer il suffit d'ajouter cette ligne :

iptables -I INPUT -s 155.133.82.146 -j DROP

L'option -I spécifie que cette règle doit passer avant toutes les autres dans la table INPUT, de cette manière on s'assure que même s'il existe une règle permettant l'accès elle ne sera pas appliqué pour cette adresse ip.

Cas de Docker

Avec Docker la règle modifiant la table INPUT n'aura aucun effet, car Docker crée sa propre table pour gérer les entrées/sorties des conteneurs. Par défaut il ouvre les ports spécifiés des conteneurs vers le monde extérieurs sans aucune restriction. Pour en limiter l'accès il faut alors utiliser :

iptables -I DOCKER -s 155.133.82.146 -j DROP

Qui va modifier la table créée par Docker et bloquer l'adresse ip qui tente de se connecter sans cesse.

Automatisation des blocages

fail2ban est un logiciel permettant d'ajouter automatiquement des adresses ip à la liste noire lorsque trop de tentative infructueuse de connexion ont eu lieu.


Sources :