Firewall et partage de connexion : Iptables

10 Jun. 2007
Auteur : Hyacinthe MENIET
Responsable : TrustRobot
Score ( voter ) :
Connexes : Même auteur | Même responsable | Historique
Avant d'aller plus loin, je rappelle que votre distribution est probablement livrée avec un outil permettant de paramétrer un firewall + partage de connexion internet. Si ce n'est pas votre cas, ou si vous désirez savoir comment ça marche, lisez la suite. Je ferai, la part belle à la configuration manuelle, bien qu'il existe des outils graphiques pour cela.

Lorsque vous disposez d'une connexion unique à Internet à partager à plusieurs, vous avez globalement le choix entre 2 stratégies : un proxy ou le masquerading (nat : Network Address Translation). Même sans partager une connexion (à fortiori si vous en partagez une), il peut-être, sécurisant d'avoir un firewall à domicile.

Un proxy est un mandataire, lorsque votre ordinateur serveur fait proxy, cela signifie que les clients ne se connectent pas directement à Internet, mais demande au proxy de télécharger pour eux les pages dont ils ont besoin. Un proxy quelqu'il soit ne couvre qu'une gamme limitée de protocole, généralement http et ftp.

Le masquerading (nat) est une translation d'adresse source, c'est à dire qu'il remplace les adresses source des paquets d'un réseau local, par l'IP de la passerelle. Il conserve cependant des traces des transactions pour acheminer vers chacun le paquet qui lui est destiné. Ainsi, toutes vos machines apparaissent sur Internet comme une seule et même machine.

Sous Linux le masquerading et le firewall se font à partir d'un seul et même couple de logiciels : Netfilter/Iptables. Ces 2 logiciels sont déjà installés ou du moins présents sur vos cdroms. S'ils ne sont pas installés, il suffit généralement d'installer le paquet : iptables. Tapez : iptables - L dans un terminal, il devrait vous afficher les règles courantes.

Netfilter/Iptables forment un couple infernal, qui fournit une solution complète pour faire du firewalling, du nat(partage de connexion) et du mangle. Netfilter est directement intégré au noyau 2.6, tandis que iptables est une commande qui permet de gérer les règles de son firewall.

Notez enfin que le Nat ne se limite pas qu'au masquerading (partage de connexion) mais permet également de faire l'opération inverse : translation d'adresse de destination.

1. Configuration de Netfilter :

1.1 Compilation du noyau

Si vous êtes l'heureux utilisateur d'une Mandriva 10 et plus, Debian (avec noyau 2.6), Slackware 10 et plus avec noyau 2.6 et Fedora core 2 et plus, vous pouvez passer au 1.2. Pour les autres ou pour ceux qui veulent comprendre comment ça marche, assurez-vous que votre noyau est compilé avec les options suivantes :
Device Drivers -->
[*] Networking support -->
Networking options -->
<M> Packet socket
[*] Packet socket: mmapped IO
[*] Network packet filtering (replaces ipchains) --->
[*] Network packet filtering debugging 
IP: Netfilter Configuration --->
<M> Connection tracking (required for masq/NAT)
<M> FTP protocol support
<M> IRC protocol support
<M> TFTP protocol support
<M> IP tables support (required for filtering/masq/NAT)
<M> limit match support
<M> TCPMSS target support
<M> Connection state match support
<M> Packet filtering
<M> REJECT target support
<M> ULOG target support
<M> Full NAT
<M> MASQUERADE target support
<M> LOG target support

1.2 Chargement des modules

Chargez maintenant les paramètres en module (voir /lib/modules/votre_noyau/kernel/net/ipv4/netfilter). Concrètement tapez :
# modprobe ip_tables # modprobe ip_nat_ftp # modprobe ip_nat_irc # modprobe iptable_filter # modprobe iptable_mangle # modprobe iptable_nat
Pour ne plus avoir à le faire manuellement, rajoutez ces lignes à la fin de votre /etc/rc.d/rc.local. Une autre solution, consiste bien-sûr à utiliser l'outil de votre distribution pour qu'ils soient chargés à chaque amorçage.

2. Théorie sous-jacente à Iptables :

Je fournis dans le 3/ un script "près à l'emploie" qui n'est pas une panacée mais permet d'avoir un firewall fonctionnel et évolutif. Il est abondamment commenté, pour faciliter, la compréhension, néanmoins un peu de généralité ne vous fera pas de mal, je pense.

Iptables manipule 3 tables : la table filter, la table nat et la table Mangle. Une table est formée de chaîne par défaut, auxquelles il faut rajouter celles que vous créez. Pour chaque chaîne, il faut définir une politique par défaut, puis rajouter des règles pour gérer les cas particuliers. Tout ceci n'est évidemment pas exhaustif, mais vous permettra, de construire un firewall, rapidement.

3. Pratique de Iptables :

On peut assigner les règles à iptables à la volée, mais il est bien plus pratique de tout regrouper dans un fichier qui sera lu au démarrage de la machine par exemple.

La politique la plus conseillée, est la suivante : tout interdire sans exception, du moins tout ce qui rentre. Puis accepter au cas par cas certaines choses indispensables. Je vais supposer dans la suite que mon PC sur lequel je monte le firewall a pour adresse locale 1921.68.0.1 et donc fait partie du réseau 1921.68.0.x.

Mon réseau est formé d'une passerelle, sur laquelle tournent mon firewall, ainsi que mes serveurs apache, proftp, ssh, bind, donkey, samba ... C'est donc lui qui est connecté à Internet et partage sa connexion par nat avec les clients Windows ou Linux.

Mes clients (Windows ou Linux), accèdent donc à Internet de manière transparente, avec des clients : mail, web, ftp, donkey ... tout en étant protégés par le firewall. Est-ce utile de préciser que les firewalls ne protégent pas des virus ? Le script est consultable ICI. Le firewall base sa protection sur les interfaces réseau, les adresses sources et distination des paquets ainsi que les protocoles. Il y'a moyen de faire encore plus fins, consultez la documentation officielle. Pour lancer le script, tapez :
cd /où_est_le_script/ ./firewall start
Il accepte, un certains nombre d'arguments, start pour démarrer, stop pour l'arrêter, restart pour le redémarrer et status pour voir les règles en cours.

4. Lancement du firewall au démarrage :

Pour lancer le firewall à l'amorçage de la machine, il vous suffit de le mettre dans /usr/bin/ et de le rendre exécutable, en root, par :
chmod 744 /usr/bin/firewall
Finissez en rajoutant les lignes qui suivent dans votre /etc/rc.d/rc.local (après les lignes de chargement de module, bien-sûr) :
if [ -x /usr/bin/firewall ]; then
/usr/bin/firewall start
fi 
Au prochain démarrage, le firewall sera lancé.

5. Configurer les clients pour le NAT :

Ce qui suit concerne les personnes, qui font du masquerading (partage de connexion) en plus du firewall. Si votre serveur, fait proxy ou ne fait pas de masquerading, passez au 6/

6. Liens et conclusion :

Quelques liens vers de la documentation sur Iptables : quel que soit, le niveau de votre firewall, un firewall n'est pas une fin en soi. C'est juste un maillon (fort) dans une politique de défense contre des personnes malveillantes. Un peu de bon sens permet souvent de limiter pas mal de casse.