Skip to content

Firewall avec IPTables

I- Introduction :

NetFilter et iptables :

Les noyaux 2.4 et supérieurs de Linux contiennent un logiciel très puissant de filtrage de paquets IP appellé NetFilter et qui utilise iptables. Il remplace ipchains, utilisé sur les noyaux 2.2.

PREROUTING      FORWARD     POSTROUTING
----------> o ----------> o ---------->
            |             |
          INPUT         OUTPUT
            |             |
            V             V
         +------------------+
         |  Applis locales  |
         +------------------+

A partir de ces cinq point d'entrée, NetFilter va être capable de faire :

  • du filtrage de paquets (FILTER)
  • de la translation d'adresses ou de ports (NAT)
  • de la modification de paquets (MANGLE) non abordé ici

II- Passer à l'action :

Configuration de base du firewall :

Première étape : On vide tout.

iptables -F // Vidage des règles dans les chaînes
iptables -X // Suppression des chaînes autres que celles par défaut
iptables -t nat -F // Idem mais pour la table nat
iptables -t nat -X
iptables -t mangle -F // Idem mais pour la table mangle
iptables -t mangle -X

Après avoir tout vidé on interdit toutes les connexions :

iptables -P INPUT DROP // Toutes les entrées sont bloquées
iptables -P OUTPUT DROP // '' sorties
iptables -P FORWARD DROP // '' transmissions
// On peut faire pareil pour les tables NAT et MANGLE

La première règle d'acceptation va être le droit de tout faire sur l'interface lo (loopback) :

iptables -A INPUT -i lo -j ACCEPT // On accepte les entrées sur lo
iptables -A OUTPUT -o lo -j ACCEPT // On accepte les sorties sur lo
iptables -A FORWARD -i lo -j ACCEPT // On accepte le forward en entrée
iptables -A FORWARD -o lo -j ACCEPT // et en sortie

Le firewall fonctionne suivant les règles qu'il contient, vous n'avez pas besoin d'enregistrer votre configuration pour appliquer vos règles

Sauvegarder / restaurer une configuration

Vous pouvez sauvegarder une configuration du firewall pour pouvoir la restaurer quand vous en aurez besoin en tapant cette commande :

iptables-save > votre_fichier

Les règles vont alors être écrites dans ce fichier et pourront être restaurées très facilement :

iptables-restore < votre_fichier

Je vous conseille de sauvegarder vos tables à chaque fois que vous voulez tester une configuration et surtout de sauvegarder la configuration d'origine pour pouvoir la restaurer en cas de problème.

Filtrage des entrées et des sorties :

C'est à partir de là que ça devient intéressant, on va pouvoir accepter seulement certaines entrées et certaines sorties. Par exemple, la navigation sur Internet nécessite d'ouvrir une session TCP sur le port 80 du serveur que l'on veut visiter :

Il va donc falloir autoriser l'envoi de données vers le port TCP 80 et la réception depuis ce même port :

iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

D'autre part, il faut aussi accepter de laisser passer les requêtes DNS car quand on visite un site, on tape son nom (ex : www.google.fr) et non pas son adresse IP :

iptables -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

Si vous ne connaissez pas les principaux numéros de ports TCP et UDP et que vous demandez lesquels vous devez ouvrir ou fermer, affichez ce fichier :

cat /etc/services

Vous pourrez voir le nom du service, le numéro de port qui est associé et le protocole sur lequel il se base. Par exemple :

Protocole pop3 : ports UDP et TCP 110

Protocole telnet : port TCP 23

Ensuite, on peut autoriser une adresse ou un groupe d'adresses à passer à travers notre serveur :

iptables -A FORWARD -i eth0 -o eth1 -s 172.16.0.0/16 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d 172.16.0.0/16 -j ACCEPT

En fait, avec la table Filter, on peut faire une quasi infinité de filtrages :

  • Par adresses MAC
  • Par adresses IP
  • Par interfaces
  • Par protocoles (ICMP, TCP ou UDP)
  • Par ports
  • Par états de connexion
  • Par flag TCP

III- Aller plus loin :

Journalisation (logs) :

Vous pouvez journaliser les connexions qui ont été refusées par le firewall :

iptables -A INPUT -j LOG --log-prefix=[IPTABLES]
iptables -A OUTPUT -j LOG --log-prefix=[IPTABLES]

Filtrage par suivi de connexions :

Iptables sait travailler par état de connexions (utile pour le protocole TCP). Il existe 4 états :

  • L'état NEW vérifie qu'il s'agit d'une demande de connexion TCP
  • L'état ESTABLISHED vérifie que la connexion avec la serveur était déjà établie
  • L'état RELATED vérifie que la connexion fait suite à une connexion déjà établie (re-négociation de ports avec le serveur).
  • L'état INVALID concerne les connexions qui ne sont ni NEW, ni ESTABLISHED, ni RELATED.

Dans l'exemple suivant, personne ne peut entrer pour accéder à un serveur car la chaîne INPUT n'accepte pas les demandes de connexions des clients (pas de NEW).

Par contre, en sortie, on peut demander à se connecter à des serveurs.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

Filtrage d'adresses MAC :

iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55

Limitations :

Pour éviter qu'un attaquant n'envoie des masses de demandes pour submerger votre serveur et lui faire un deni de service (attaques DoS), il faut limiter le nombre de requêtes, par exemple :

iptables -A INPUT -m limit --limit 3/second

NAT : Masquage d'adresses :

Il est également possible de se servir d'iptables pour faire du NAT : Cet exemple montre comment masquer les adresses de toutes les machines du réseau local 192.168.1.0/24 pour leur permettre d'aller sur Internet :

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

IV- En complément :

Distributions spécialisées :

Certaines distribution Linux sont spécialisées dans le filtrage. IPCop est très connue et très utilisée. PFSense est connue également et fonctionne sur BSD. Enfin NuFw de la société Edenwall est un pare-feu très complet.

GuFw et Firestarter : iptables pour les nuls :

Si le but du jeu est de protéger un poste utilisateur sous Linux, vous n'allez pas configurer Iptables pour ça. Des logiciels comme GuFw ou Firestarter s'en chargent pour vous. C'est très simple à installer et à configurer.

Mort aux rootkits !

Vous pouvez installer le logiciel RootKitHunter. Il ira tous les jours à la chasse aux rootkits (logiciels pirates cachés sur votre machine). Si il rapporte du gibier, il vous préviendra par mail.

http://doc.ubuntu-fr.org/rootkit

Listes noires automatiques :

Deux logiciels sont capables de bannir des attaquants quand ceux ci ont trop essayé de se connecter à votre machine (ceci évite les attaques par force brute essayant sur un serveur SSH, par exemple, tous les mots de passe possibles).

Fail2ban :

http://doc.ubuntu-fr.org/fail2ban

DenyHosts :

http://doc.ubuntu-fr.org/denyhosts

Port Knocking (Frappez avant d'entrer !) :

Le port knocking permet de faire une combinaison de demande de connexion sur plusieurs ports avant que le firewall ouvre un port important (typiquement celui du SSH).

Tout est parfaitement expliqué ici :

http://www-igm.univ-mlv.fr/~dr/XPOSE2004/killy/

Liens :

Super site. Tout ce qu'il faut savoir sur Iptables :

http://olivieraj.free.fr/fr/linux/information/firewall/index.html

Linux France :

http://www.linux-france.org/prj/inetdoc/guides/iptables-tutorial/

Page qui va au-delà de iptables :

http://www.alsacreations.com/tuto/lire/622-Securite-firewall-iptables.html