Iptables

De wiki jackbot
Aller à la navigation Aller à la recherche

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 se 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 state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

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

Configuration plus fine

Maintenant que la base est là, on peut autoriser certaines connexions. Si vous souhaitez autoriser l'accès à cette machine par ssh 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 --dport 22 -j ACCEPT

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 -s 192.168.1.42 -p tcp --dport 22 -j ACCEPT

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 --dport 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

Pour créer une passerelle il faut modifier la table nat qui va faire en sorte de rediriger correctement les paquets vers les ordis qui les ont demandés :

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

À noter qu'ici on utiliser l'option -o pour préciser l'interface réseau par laquelle on sort du réseau.

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 :