Iptables
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
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 --sport 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 --sport 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 --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.
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.