Netfilter/Iptables introduction

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Le document qui suit est une introduction à la mise en place d'un pare-feu filtrant à l'aide de la commande iptables.

Introduction

Netfilter/IpTables est une solution complète de firewall.

Netfilter est le module qui apporte à Linux les fonctions de pare-feu, de traduction d'adresse et d'historisation du trafic réseau. Netfilter fonctionne en mode noyau. Il intercepte et manipule les paquets IP avant et après le routage.

Iptables Iptables est un logiciel libre de l'espace utilisateur Linux. C'est la commande qui permet à un administrateur réseaux de configurer Netfilter en espace utilisateur. Iptables configure la gestion des paquets réseaux IPv4. Pour la gestion des paquets réseaux IPv6, on utilise la commande ip6tables.

Différentes tables peuvent être définies. Chaque table contient plusieurs chaînes prédéfinies et peut aussi contenir des chaînes définies par l'utilisateur.

Préambule

En principe, le paquet 'iptables' est installé d'origine sous Debian mais si ce n'était pas le cas, rien de plus simple à faire :

# apt-get install iptables

La majeure partie des commandes se feront à partir de la console.

Il est recommandé de ne pas faire cette installation, ni une éventuelle modification par le biais de SSH, mais en "direct" machine. Au cas ou vous envisageriez de le faire via SSH, pensez à autoriser la connexion SSH avant d'interdire quoi que ce soit...

Ces commandes seront entrées sous la forme :

login@nom_machine:~$ sudo la_commande_à_taper

Ou

root@nom_machine:~# la_commande_à_taper

Il est préférable d'utiliser 'sudo' plutôt que de taper en tant que 'root', pour des raisons de sécurité mais il est possible que certaines commandes ne soient pas prises en compte de cette façon. Il vous faudra alors taper en tant que 'root' (su et mot de passe = # au lieu de $).

Installation

A l'origine, le pare-feu est installé mais il est ouvert à toutes les communications, c'est en quelque sorte, une 'passoire' et de ce fait, il ne rempli pas ses objectifs. Dans un premier temps, il va nous falloir installer un 'script' qui sera le "donneur d'ordre"

Créez le fichier 'parefeu' :

touch /etc/init.d/parefeu

Rendez ce fichier (pour l'instant, vide) exécutable avec :

chmod +x /etc/init.d/parefeu

Editez le fichier (nano, vim, etc.)

nano /etc/init.d/parefeu

  1. !/bin/sh
      1. BEGIN INIT INFO
  1. Provides: iptables
  2. Required-Start:
  3. Should-Start:
  4. Required-Stop:
  5. Should-Stop:
  6. Default-Start: 2 3 4 5
  7. Default-Stop: 0 1 6
  8. Short-description: iptables
  9. Description: Firewall
      1. END INIT INFO
  10. chargement/déchargement d'iptables

case "$1" in 'start') /sbin/iptables-restore < /etc/config_parefeu RETVAL=$?

'stop') /sbin/iptables-save > /etc/config_parefeu RETVAL=$?

'clean')

  1. clean le parefeu pendant que la machine tourne
  2. ça peut être une faille de sécurite si on l'exécute lors de l'extinction avant l'arrêt des interfaces
  3. pensez à refaire un start après sinon la sauvegarde se fera automatiquement à l'extinction

/sbin/iptables -t filter -F /sbin/iptables -t nat -F /sbin/iptables -t mangle -F /sbin/iptables -t raw -F /sbin/iptables -t filter -P INPUT ACCEPT /sbin/iptables -t filter -P OUTPUT ACCEPT /sbin/iptables -t filter -P FORWARD ACCEPT /sbin/iptables -t nat -P PREROUTING ACCEPT /sbin/iptables -t nat -P POSTROUTING ACCEPT /sbin/iptables -t nat -P OUTPUT ACCEPT /sbin/iptables -t mangle -P PREROUTING ACCEPT /sbin/iptables -t mangle -P OUTPUT ACCEPT /sbin/iptables -t mangle -P POSTROUTING ACCEPT /sbin/iptables -t mangle -P FORWARD ACCEPT /sbin/iptables -t mangle -P INPUT ACCEPT /sbin/iptables -t raw -P OUTPUT ACCEPT /sbin/iptables -t raw -P PREROUTING ACCEPT RETVAL=$?

'restart') $0 stop && $0 start RETVAL=$?

  • )

echo "Usage: $0 { start | stop | restart | clean}" RETVAL=1

esac exit $RETVAL

Sauvegardez

Réinitialiser le pare-feu à blanc avec :

/etc/init.d/parefeu clean

Pour les utilisateurs de Squeeze

Si vous rencontrez un problème avec le update-rc.d, il faudra modifier l'entête du script pour qu'elle ressemble à ça:

### BEGIN INIT INFO

  1. Provides: iptables
  2. Required-Start: mountall
  3. Should-Start: $local_fs
  4. Required-Stop:
  5. Should-Stop:
  6. X-Start-Before: networking
  7. X-Stop-After: networking
  8. Default-Start: S
  9. Default-Stop: 0 6
  10. Short-description: iptables
  11. Description: Firewall
      1. END INIT INFO

Configuration

Tapez les séquences suivantes (une à la fois) suivi de 'Entrée'

"Pour un hôte (station ou serveur) non routeur":

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Si on veut un serveur FTP

iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

Si on souhaite utiliser SSH

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

Si on souhaite installer un serveur Web

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Si on veut rendre CUPS accessible

iptables -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT

Si on souhaite utiliser Jabber

iptables -A INPUT -p tcp -m tcp --dport 5222 -j ACCEPT

"Pour une machine faisant office de routeur avec NAT" :

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -A INPUT -i ethx -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

Si on veut un serveur FTP:

iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

Si on souhaite utiliser SSH:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

Si on souhaite installer un serveur Web:

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Si on veut rendre CUPS accessible:

iptables -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT

Si on souhaite utiliser Jabber:

iptables -A INPUT -p tcp -m tcp --dport 5222 -j ACCEPT

Si on souhaite utiliser Openvpn:

iptables -A FORWARD -i tun0 -o eth0 -m state --state NEW -j ACCEPT

Commandes indispensables pour faire du routage:

iptables -A FORWARD -i ethy -o ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o ethy -j ACCEPT
iptables -t nat -A POSTROUTING -o ethy -j MASQUERADE

Où ethx correspond à l'interface du LAN et ethy correspond à l'interface relié à Internet (ou à votre "box)

Sauvegarde et automatisation

Sauvegardez le pare-feu une première fois (simulation d'un signal d'arrêt) avec :

/etc/init.d/parefeu stop

Activez 'parefeu' avec (Respectez bien les espacements et les points):

update-rc.d parefeu start XX S . stop YY 0 6 .

Remplacez XX par le nombre immédiatement inférieur à celui qui indique la priorité de 'networking' dans /etc/rcS.d.

$ ls /etc/rcS.d | grep S**networking 

(renvoie chez moi "S15networking". Il conviendra donc de remplacer XX par 14

Remplacez YY par le nombre immédiatement supérieur à celui qui indique la priorité de 'networking' dans /etc/rc0.d

$ ls /etc/rc0.d | grep K**networking

(renvoie chez moi "K07networking". Il conviendra donc de remplacer YY par 08

Ainsi, le parefeu sera actif avant l'activation des interfaces réseau configurées en auto dans /etc/network/interfaces et le restera jusqu'à leur désactivation

Note: Depuis Squeeze les scripts sont calculés suivant les dépendances avec insserv donc le nombre n'a pas vraiment d'importance.

Modifications

Nous allons aborder maintenant la façon de modifier notre pare-feu

Ajouter une règle :

- on connaît le nom du port à autoriser, taper :

iptables -A INPUT -p tcp -m tcp --dport www -J ACCEPT (où 'www' est le nom du serveur http)

- on connaît le numéro du port, taper :

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT (où '80' est le N° de ce même http)

Pour connaître le numéro d'un grand nombre de port, tapez :

less /etc/services

Pour les explications des différentes options, vous pourrez avantageusement consulter : man iptables ou iptables --help

Enlever une règle :

taper ce qui suit pour connaître le numéro de ligne de cette règle

iptables -L --line-numbers

puis taper

iptables -D INPUT (ou FORWARD) N° (où 'N°' doit être le chiffre ou nombre en tête de la ligne à supprimer)

Vous pourrez modifier l'exemple présenté plus haut à votre convenance (ajouter ou retirer ce que vous voudrez). Toutefois, il convient de ne pas supprimer les deux lignes suivantes :

-A INPUT -i lo -j ACCEPT ((Ce sont les communications IP entre processus locaux s'exécutant sur la machine et c'est critique)).
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ((ça permet le retour vers la machine des infos demandées auprès des sites web. En l'absence de cette règle, la navigation deviendrait difficile. C'est relativement important )).

Après chaque modification, il vous faudra sauvegarder de nouveau votre pare-feu avec :

/etc/init.d/parefeu stop

ou attendre un redémarrage qui fera la même chose automatiquement.

Si vous voulez revenir à l'état que vous aviez au présent démarrage, vous tapez :

/etc/init.d/parefeu start

Si vous voulez revenir à un pare-feu vierge, vous tapez :

/etc/init.d/parefeu clean

Ce qui précède concerne la partie 'Filter' d'un pare-feu. Ça assure un minimum de protection mais c'est loin d'être exhaustif. Je laisse à d'autres, plus 'pointus' que moi, le soin d'expliquer les parties plus complexes, telles que Raw, Mangle et Nat. J'espère que ce 'tuto', réservé aux débutants, vous aura permis de mieux appréhender le pare-feu sous Debian.

L'aide de tous les amis du forum et particulièrement celle du Papa de Lillo, a été indispensable à sa rédaction. Merci à eux !

Liens externes