Si vous ne connaissez pas encore « iptables », c'est LA commande pour gérer les connexions réseau, faire des redirections de port, blacklister une adresse IP ou tout simplement ouvrir ou fermer des ports. C'est ce que l'on appelle un pare-feu ou firewall.

Par défaut « iptables » laisse tout ouvert et ne filtre rien. Notre but c'est de fermer un peu tout ça et de garder le minimum ouvert. Je ne rentrerai pas dans le détails de l'utilisation de « iptables » car bien trop de choses sont à voir mais nous allons l'utiliser d'une manière simple et efficace ce qui vous donnera les bases minimales pour commencer à appréhender « iptables ».

Nous allons paramétrer « iptables » de manière à l'utiliser que pour nos besoins. A l'heure actuelle, seul « apt » (la gestion des paquets Debian) et « ntpdate » (synchronisation de l'heure) font des connexions réseau. Nous allons donc tout bloquer puis ouvrir un passage à « apt » et « ntpdate ».

D'abord on supprime toutes les règles existante (des fois qu'ils y en aurait de rentrées) :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -F INPUT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -F OUTPUT

Maintenant on ferme les portes :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -P INPUT DROP
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -P OUTPUT DROP

Un reflex qu'il faut avoir c'est de toujours autoriser la boucle locale (et ceci doit être toujours la première règle) :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i lo -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o lo -j ACCEPT

Dorénavant nous sommes totalement fermé de l'extérieur. Configurons « iptables » pour laisser « apt ». « apt » aura déjà besoin de faire des requêtes DNS (port 53 en UDP et TCP) pour résoudre les noms tel que « ftp.debian.fr » afin de pouvoir récupérer les listes et les paquets. Normalement un client DNS n'a besoin que du protocole UDP mais ce dernier est laxiste sur sa spécification et autorise aussi le TCP (qui est normalement réservé au transfert de zone DNS) Ouvrons le port DNS en TCP et UDP pour l'entrée et la sortie :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p tcp --sport 53 -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p udp --sport 53 -j ACCEPT
  3. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p tcp --dport 53 -j ACCEPT
  4. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p udp --dport 53 -j ACCEPT

Si vous posséder un serveur DNS ouvrez vous aurez besoin d'ouvrir les ports dans l'autre sens :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p tcp --dport 53 -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p udp --dport 53 -j ACCEPT
  3. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p tcp --sport 53 -j ACCEPT
  4. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p udp --sport 53 -j ACCEPT

De même ouvrons le port 80 en TCP pour que « apt » puisse télécharger les paquets :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p tcp --sport 80 -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p tcp --dport 80 -j ACCEPT

De même pour un serveur web ouvrez les ports dans l'autre sens :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p tcp --dport 80 -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p tcp --sport 80 -j ACCEPT

Maintenant autorisons « ntpdate » qui lui utilise le port 123 en UDP :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -p udp --sport 123 -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -p udp --dport 123 -j ACCEPT

A ce stade nous pourrions nous arrêter là tout es fonctionnel. Mais allons plus loin. Maintenant ajoutons une règle qui dira que toute connexion déjà établie avec le serveur donc déjà autoriser par « iptables » sera elle aussi autorisée (même sur un port fermé par exemple). Cette règle est facultative mais bien utile quand vous tester votre configuration vous permettant de tester avec la règle de log (voir ci-dessous) les paquets qui sont rejetés qui devrait être acceptés.

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -m state --state RELATED,ESTABLISHED -j ACCEPT
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -m state --state RELATED,ESTABLISHED -j ACCEPT

Dernière ces règles nous allons loguer dans le fichier « /var/log/debug » tout les paquets que nous allons bloquer avant de les bloquer :

  1. ALBAN@bebeserv:~$ sudo iptables -t filter -A INPUT -i eth0 -d 10.0.0.2 -j LOG --log-prefix "Iptables INPUT dropped : " --log-level debug
  2. ALBAN@bebeserv:~$ sudo iptables -t filter -A OUTPUT -o eth0 -s 10.0.0.2 -j LOG --log-prefix "Iptables OUPUT dropped : " --log-level debug

Il est est terminer des règles. Maintenant voyons quelques commandes utiles. Sauver votre configuration :

  1. ALBAN@bebeserv:~$ sudo iptables-save > ~/iptables-sauvegarde

Restaurer votre configuration :

  1. ALBAN@bebeserv:~$ sudo iptables-restore ~/iptables-sauvergade

Voir votre configuration complète :

  1. ALBAN@bebeserv:~$ sudo iptables -L -v --line-numbers

Vérifier le log en temps réel (paquets rejetés) : (tapez « [CTRL + C] » pour sortir)

  1. ALBAN@bebeserv:~$ sudo tail -f /var/log/debug

Quand le serveur redémarre vos règles « iptables » seront perdues, il faut donc automatiser la mise en place de ces règles. Allez dans « /etc/network »:

  1. ALBAN@bebeserv:~$ cd /etc/network
  2. ALBAN@bebeserv:/etc/network$

Créez le fichier « iptables » à côté du fichier « interface » :

  1. ALBAN@bebeserv:/etc/network$ sudo nano iptables

Entrez les mêmes lignes que nous avons du taper pour configurer « iptables » (attention aux fautes de frappes !) :

  1. # A modifier en fonction de votre adresse IP
  2. MYIP=10.0.0.2
  3.  
  4. iptables -t filter -F INPUT
  5. iptables -t filter -F OUTPUT
  6.  
  7. iptables -t filter -Z INPUT
  8. iptables -t filter -Z OUTPUT
  9.  
  10. iptables -t filter -P INPUT DROP
  11. iptables -t filter -P OUTPUT DROP
  12.  
  13. iptables -t filter -A INPUT -i lo -j ACCEPT
  14. iptables -t filter -A INPUT -i eth0 -d $MYIP -p tcp --sport 53 -j ACCEPT
  15. iptables -t filter -A INPUT -i eth0 -d $MYIP -p udp --sport 53 -j ACCEPT
  16. iptables -t filter -A INPUT -i eth0 -d $MYIP -p tcp --sport 80 -j ACCEPT
  17. iptables -t filter -A INPUT -i eth0 -d $MYIP -p udp --sport 123 -j ACCEPT
  18. iptables -t filter -A INPUT -i eth0 -d $MYIP -m state --state RELATED,ESTABLISHED -j ACCEPT
  19. iptables -t filter -A INPUT -i eth0 -d $MYIP -j LOG --log-prefix "Iptables INPUT dropped : " --log-level debug
  20.  
  21. iptables -t filter -A OUTPUT -o lo -j ACCEPT
  22. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -p tcp --dport 53 -j ACCEPT
  23. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -p udp --dport 53 -j ACCEPT
  24. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -p tcp --dport 80 -j ACCEPT
  25. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -p udp --dport 123 -j ACCEPT
  26. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -m state --state RELATED,ESTABLISHED -j ACCEPT
  27. iptables -t filter -A OUTPUT -o eth0 -s $MYIP -j LOG --log-prefix "Iptables OUPUT dropped : " --log-level debug

Enregistrez le fichier « [CTRL + O] » et quittez « [CTRL + X] » :

Créez le fichier de démarrage,

  1. ALBAN@bebeserv:/etc/network$ cd /etc/init.d/
  2. ALBAN@bebeserv:/etc/init.d$ sudo nano iptables-conf

Entrez ceci :

  1. #! /bin/sh
  2. set -e
  3.  
  4. iptables_start() {
  5. if [ -f /etc/network/iptables ]; then
  6. . /etc/network/iptables
  7. fi
  8. }
  9.  
  10. iptables_stop() {
  11. iptables -t filter -F INPUT
  12. iptables -t filter -F OUTPUT
  13. iptables -t filter -P INPUT ACCEPT
  14. iptables -t filter -P OUTPUT ACCEPT
  15. }
  16.  
  17. case "$1" in
  18. start)
  19. echo -n "Apply Iptables configuration"
  20. iptables_start
  21. echo "."
  22. ;;
  23. stop)
  24. echo -n "Clear Iptables configuration"
  25. iptables_stop
  26. echo "."
  27. ;;
  28.  
  29. restart)
  30. echo -n "Reloading Iptables configuration"
  31. iptables_stop
  32. iptables_start
  33. echo "."
  34. ;;
  35.  
  36. *)
  37. echo "Usage: /etc/init.d/iptables-conf {start|stop|restart}"
  38. exit 1
  39. esac
  40.  
  41. exit 0

Donnons les bons droits à notre fichier :

  1. ALBAN@bebeserv:/etc/init.d$ sudo chmod +x iptables-conf

Enregistrez et quittez. Rajoutez le script de démarrage dans le mode voulu avec la priorité voulue :

  1. ALBAN@bebeserv:/etc/init.d$ sudo update-rc.d iptables-conf start 99 2 3 4 5 . stop 20 0 1 6 .
  2. [...]

Testons le tout, affichons la configuration actuelle :

ALBAN@bebeserv:/etc/init.d$ sudo iptables -L -v --line-numbers
[...]

Stoppez le firewall :

  1. ALBAN@bebeserv:/etc/init.d$ sudo /etc/init.d/iptables-conf stop
  2. [...]

Vérifiez que tout est vide et autorisé :

  1. ALBAN@bebeserv:/etc/init.d$ sudo iptables -L -v --line-numbers
  2. [...]

Démarrons le firewall :

  1. ALBAN@bebeserv:/etc/init.d$ sudo /etc/init.d/iptables-conf start
  2. [...]

Vérifions que toutes les règles sont bien présentes :

  1. ALBAN@bebeserv:/etc/init.d$ sudo iptables -L -v --line-numbers
  2. [...]

Modifions nous même la configuration actuelle :

  1. ALBAN@bebeserv:/etc/init.d$ sudo iptables -F INPUT
  2. [...]
  3. ALBAN@bebeserv:/etc/init.d$ sudo iptables -L -v --line-numbers
  4. [...]

Redémarrons le firewall pour vérifier que tout revient comme nous l'avions configuré :

  1. ALBAN@bebeserv:/etc/init.d$ sudo /etc/init.d/iptables-conf restart
  2. [...]
  3. ALBAN@bebeserv:/etc/init.d$ sudo iptables -L -v --line-numbers
  4. [...]

Voilà c'est terminé pour ce chapitre !

  1. ALBAN@bebeserv:/etc/init.d$ cd ~
  2. ALBAN@bebeserv:~$