Netfilter

Un article de WikisAdmins.



Sommaire

Introduction

Netfilter est l'ensemble de modules qui permet l’interception pour contrôle voire modification des paquets sur les systèmes à base du noyau Linux depuis sa version 2.4 (Les versions 2.0 et 2.2 disposaient d'Ipchains[1]). Netfilter permet notamment au système les fonctions de pare-feu à états (stateful firewall), de traduction d'adresses, de journalisation et de régulation du flux des paquets.

Iptables est la commande qui vas permettre à l'administrateur réseaux d'instaurer des règles organisées en tables à l'usage de Netfilter. C'est règles seront fonction des besoins du/des réseau(x) local(-aux) dont il est responsable.

Fonctionnement

Comme tous les pare-feu, Netfilter fonctionne selon le principe "Tout ce qui n'est pas autorisé est interdit". Cela permet de savoir précisément les portes que l'on laisse ouverte. La mise en place d'un pare-feu passe donc par au moins trois étapes obligatoires :

  • supprimer les éventuelles anciennes règles qui pourraient parasiter le fonctionnement des nouvelles.
  • bloquer toutes les entrées de paquets sur le système.
  • Ouvrir le système sur les réseaux avec parcimonie.

Hooks

Netfilter dispose cinq points d'accroche (hooks : littéralement "crochets") sur le trajet des paquets dans la pile IP du système Linux.

A chacune de ces étapes, Netfilter aura une action (CIBLE) sur le paquet :

  • Supprimer le paquet (DROP)
  • Accepter le paquet (ACCEPT)
  • Modifier le paquet (MASQUERADE, LOG|ULOG, MARK...)

Chaînes

Chaînes prédéfinies

A chacun de ces hooks est associé une chaîne prédéfinie :

Hook Chaîne Description
NF_IP_PRE_ROUTING PREROUTING Le paquet est en entré de pile et n'a encore subit aucune modification.
NF_IP_LOCAL_IN INPUT Le paquet est prêt à être envoyé aux couches applicatives.
NF_IP_FORWARD FORWARD Le paquet est redirigé d'une interface physique à une autre (fonction de passerelle).
NF_IP_LOCAL_OUT OUTPUT Le paquet à été modifié par les couches applicatives.
NF_IP_POSTROUTING POSTROUTING Le paquet sort de la pile IP et est prêt à être réexpédier sur l'interface.

Chaînes utilisateurs

Il est possible à l'utilisateur root d'ajouter à ces chaînes prédéfinies, ses propres chaînes : des chaînes utilisateur. Elles permettront à l'utilisateur root d'organiser les règles plus élégamment.

Règles

Une chaîne est composée de règles. La règle est une série de critères à laquelle doit correspondre ou non, le paquet :

  • interface source ou destination (options iptables : -i et -o)
  • adresse IP source ou destination (options iptables : -s et -d)
  • port source ou destination (options iptables : -sport et -dport)
  • type de trame
  • nombre de paquets
  • paquets marqués
  • ...

Si le paquet répond aux critères, la règle définira s'il faudra ou non lui appliquer la cible (ou action).

Cibles

A chaque règle est associée une action (appelée "CIBLE" dans la nomenclature de Netfilter) à effectuer si la règle doit s'appliquer.

Les principales actions sont :

  • DROP : détruit le paquet
  • ACCEPT : autorise le paquet
  • REJECT : refuse le paquet et le signale à son expéditeur (inutilisé sur l'internet)
  • MASQUERADE : Masque l'origine du paquet pour lui permettre de circuler d'un réseau à un autre : généralement entre le réseau privé (local) et le réseau public (l'internet)
  • LOG/ULOG : les caractéristiques du paquets sont journalisé soit dans le fichier /var/log/messages habituel, soit vers le processus ulogd.
  • MARK : marque le paquet en y ajoutant une information
  • Un chaîne utilisateur : le paquet est envoyé à une chaîne définie par l'utilisateur.

Tables

Les chaînes composées de règles sont organisées en tables.

Il existe quatre tables :

  • Filter : permet le rôle de pare-feu en supprimant ou acceptant le paquet
  • Nat : permet le rôle de passerelle en masquant les adresses des paquets
  • Mangle : permet notamment de faire de la QoS (Quality of Service) en marquant les paquets
  • Raw : permet de contourner le suivi de connexion

Table Filter

Comme son nom l'indique la table Filter organise la fonction de filtrage de paquets. Les paquets sont soit interdits (DROP ou REJECT) ou autorisés (ACCEPT), soit redirigés. Elle utilise trois chaines pour cela :

  • INPUT : contrôle les paquets à destination des applications
  • OUTPUT : contrôle les paquets sortant des applications
  • FORWARD : contrôle les paquets devant être aiguillé d'une interface à une autre.

Le principe de filtrage d'un pare-feu doit être : tout ce qui n'est pas autorisé doit être interdit.

Table Nat

La table Nat (NAT pour Network Adress Translation) permet d'utiliser une machine linux munie de deux interfaces physiques en passerelle Internet. Elle a besoin de trois chaînes :

  • PREROUTING : Modification de l'adresse de destination (DNAT)
  • POSTROUTING : Masquage d'adresse par modification de l'adresse source (SNAT)
  • OUTPUT : permet la modification de l'adresse de destination d'un paquet issu d'un processus local (peu utilisé)


Table Mangle

La table Mangle permet de marqué les paquets à leur entré dans la pile IP afin d'être reconnu par d'autres programmes fonctionnant dans l'espace du noyau. Cela peut permettre par exemple de différencier deux types de données afin d'en favoriser le débit de l'une par rapport à l'autre. C'est de la QoS (Quality of Service). Depuis la version 2.4.18 du noyau Linux, la table Mangle peut utiliser toutes les chaînes prédéfinies pour marquer les paquets :

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

Table Raw

La table Raw sert uniquement à passer outre le suivi de connexion grâce à la cible NOTRACK. Elle utilise uniquement les chaînes suivante :

  • PREROUTING
  • OUTPUT

Aucune autre chaîne n'est nécessaire, car ce sont les seules où Netfilter pourra intervenir sur les paquets avant qu'ils ne soient vérifiés par le suivi de connexion.

Pare-feu à états : le suivie de connexion

Contrairement à son prédécesseur ipchains, Netfilter est un pare-feu à états (ou statefull firewall) grâce au module Conntrack. Ce qui signifie qu'il possède une table qui enregistre toutes les sessions. Cette table est visible dans le fichier virtuel /proc/net/ip_conntrack mais il vaut mieux la lire avec l'utilitaire conntrack :

       # conntrack -E

Cette table lui permet de différencier les paquets selon quatre états :

  • NEW : le paquet n'est lier à aucune session.
  • ESTABLISHED : la session existe au niveau du protocole de la couche transport (4) comme une session TCP.
  • RELATED : la session existe de façon relative à une autre (FTP, IRC, ping/pong)
  • INVALID : la session est invalide et ne correspond à aucun état cité ci-dessus.

La différentiation par ces quatre états permet à Netfilter de faire du suivi de connexion.

Le suivi de connexion permet d'autoriser uniquement les paquets dont la session à été établie par la passerelle, une machine du réseau local ou de la DMZ. Sans le suivi de connexion, il serait possible à un pirate de faire entrer un paquet par un port ouvert. Par exemple, en faisant passer un paquet provenant d'une nouvelle session nmap pour un paquet de session http d'un client web de votre réseau local :

       # nmap www.nom-de-votre-serveur-web.org -g 80

Sans Conntrack, Netfilter ne pourrait pas faire la distinction entre un paquet à destination du port 80 en état NEW et un paquet en état ESTABLISHED.

Autrement dit, le suivie de connexion permet de connaitre les différents états que peut avoir la session (nouvelle, déjà établie, relative à une autre session ou invalide) afin de l'autoriser ou pas.

Iptables

iptables est la commande qui vas permettre à l'utilisateur root d'organiser les chaînes en tables et ainsi de décider précisément l'usage de chaque paquet lorsqu'il arrive dans la pile IP du système.

Nous allons voir rapidement les options les plus utilisées. Pour plus de précisions, je vous invite à consulter la page man d'iptables [2].

Options de commandes

Les options de commandes d'iptables vont nous permettre de :

  • rajouter (options -P -N -A ),
  • supprimer (options -D -F -X),
  • modifier (options -R -I) ou,
  • afficher (options -L -v -n),

les règles et les chaînes.

Ainsi :

  • -F pour Flush : Vide les règles d'une chaîne prédéfinie
  • -X pour eXclude : Supprime une chaîne utilisateur.
  • -P pour Policy : Défini la politique par défaut d'une chaîne prédéfinie.
  • -A pour Append : Ajoute une règle à une chaîne.
  • -L pour List : Liste les règles.
  • -D pour Delete : Supprime une chaîne.

Options de paramètres

Les options de paramètres permettent de définir le ou les critère(s) au(x)quel(s) doit répondre le paquet pour que Netfilter décide d'appliquer la règle sur celui-ci et la cible qu'il faut lui imposer.

  • -p pour protocol : permet de choisir le paquet sur son type de trames : tcp, udp, all. Il est possible de choisir le nom du protocole ou le numéro qui lui est associé dans la liste /etc/protocoles
  • -s pour source : sélectionne paquet en fonction de son adresse IP source.
  • -d pour destination : sélectionne paquet en fonction de son adresse IP (ou l'adresse réseau) de destination.
  • -i ou --in-interface : sélectionne le paquet en fonction son interface physique d'entrée.
  • -o ou --out-interface : sélectionne le paquet en fonction son interface physique de sortie.
  • --sport pour port source : sélectionne le paquet en fonction de son port d'origine.
  • --dport pour port de destination : sélectionne le paquet en fonction de son port de destination.
  • --state : état de connexion (NEW, ESTABLISHED, RELATED ou INVALID)

REMARQUE : Pour chacun de ces paramètres, un point d'exclamation permettra d'inverser la sélection. Par exemple, le paramètres de l'option --dport précédé de ! signifira que tous les ports de destination sont concerné sauf celui qui désigné dans la règle.

  • -j pour jump : cette option désigne la cible (ACCEPT, DROP, ...), c'est-à-dire l'action à prendre dans le cas d'une réponse positive aux critères de sélection.
  • -m pour match : charger un module

Exemples de fonctionnement

Commandes de base

Comme nous l'avons vu, il est possible d'ajouter, supprimer, modifier et afficher les règles utilisée par Netfilter grâce à Iptables. Nous allons voir ici quelques exemples d'utilisation de la commande iptables.

Faire "table rase"

Avant de commencer à construire nos règles, il faut supprimer les éventuelles chaînes prédéfinies (-F) et utilisateur (-X) déjà existante afin qu'elles ne nous gênent pas dans les règles que nous allons ajouter :

       # iptables -F
       # iptables -X

Si vous travaillez sur une machine en production, pour des raison évidente de sécurité, il ne vas pas falloir laisser votre pare-feu trop longtemps dans cet état.

Tout interdire

Nous allons respecter ainsi le principe de filtrage tout ce qui n'est pas autorisé doit être interdit et instaurer les règles par défaut (-P) supprimant tous les paquets avec la table Filter. Cette table possédant trois chaînes :

       # iptables -P INPUT DROP
       # iptables -P OUTPUT DROP
       # iptables -P FORWARD DROP

A cette étape, il n'est plus possible d’accéder à la machine autrement que par les périphériques standard (clavier, écran). Ces commandes équivalent presque à débrancher les câbles réseaux de ses interfaces. Même la boucle locale (loopback) ne répond plus au ping :

       $ ping localhost
       PING localhost (127.0.0.1) 56(84) bytes of data.
       ping: sendmsg: Operation not permitted
       ...

Il vas donc nous falloir rendre le pare-feu un peu plus perméable.

Autoriser uniquement les connexions choisi

Nous ne pouvons pas laisser les interfaces réseaux ainsi : le réseau ne servirait plus à rien.

Nous allons donc commencer par autoriser tous les flux sur la boucle locale (lo) car c'est une interface de confiance puisque interne à la mémoire du système.

La phrase 'je veux autoriser toutes les sessions entrantes et sortantes sur la boucle locale' se traduit ainsi en "langage iptable" :

       # iptables -A INPUT -i lo -j ACCEPT
       # iptables -A OUTPUT -o lo -j ACCEPT

Nous pouvons faire la même chose pour l'interface correspondant au réseau local si nous le considérons comme suffisamment fiable.

Supprimer une règle

Pour pouvoir supprimer une règle, il faut que nous connaissions son numéro et nous l'obtiendrons grâce à la commande suivante :

       # iptables -L --line-numbers

Et pour supprimer la règle 3 de la chaîne INPUT :

       # iptables -D INPUT 3

Modifier ou remplacer une règle

Comme pour la suppression d'une règle, il nous faut connaitre son numéro pour la modifier. Par exemple, pour remplacer la règle 3 de la chaîne INPUT par une règle qui supprime les paquets ayant pour adresse IP source 192.168.1.1, nous devrons lancer la commande suivante :

       # iptables -D INPUT 3 -s 192.168.1.1 -j DROP

Avec l'option -I, il sera possible d’Insérer la nouvelle règle entre la 2ème et la future 4ème.

Afficher les règles

Pour afficher les règles la commande iptables avec l'option -L suffira. Mais comme nous l'avons vu, nous avons parfois besoin de connaitre le numéro de ligne de la règle. Il faudra donc ajouter l'option --line-numbers.

L'option -v offre un affichage plus détaillé tandis que -x permet d'afficher le nombre exact de paquet par règles et l'option -n change les noms d'hôte et de services en adresse IP et numéro de port...

Fonctionnalités complémentaires

En plus du simple filtrage, nous savons que Netfilter est un filtre à états et permet donc de faire du suivi de connexion grâce au modules Conntrack. Le suivi de connexion permet un filtrage plus précis.

Ensuite, il peut faire fonctionner la machine comme passerelle entre le réseau public et notre ou nos réseaux privés grâce à la table Nat.

De plus, la cible LOG vas nous permettre de journaliser certains trafics.

Enfin, la table Mangle lui permet de favoriser un flux par rapport à un autre.

Conntrack : le suivi de connexion

Conntrack est le module qui ajoute la fonction de pare-feu à états à Netfilter.

Autoriser uniquement les connexions provenant du réseau local :

       # iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

ou

       # iptables -A FORWARD -i eth1 -o eth0 -m state --state ! INVALID -j ACCEPT
       

Puis n'autoriser les paquets arrivant par l'interface reliée au réseau public seulement s'ils proviennent de connexions établies ou relatives à des connexions établies par le réseau local :

       # iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

NAT

La table Nat de Netfilter ajoute la fonction de passerelle sur le système si celui-ci dispose d'un minimum de deux interfaces réseaux. En effet, cette fonction permet la communication sur deux réseaux différents. Généralement un réseau privé avec le réseau public, l'internet.

Contrairement au routeur qui ne fait que choisir vers quel réseau transférer un paquet à l'aide d'une table sans altérer le paquet, la fonction NAT peut masquer l'adresses IP source des paquets provenant du réseau local par l'adresse publique de la passerelle donnée par le Fournisseur d'Accès Internet afin de permettre aux paquets de circuler sur le réseau public (MASQUERADE ou SNAT). En effet, les paquets avec une adresse privé (de classes A, B ou C) ne sont pas routable sur l'internet. La nat dynamique a ainsi été créer pour faire face à la pénurie d'adresse IPv4 sur l'internet.

La nat statique permet uniquement à des machine du réseau local, un accès transparent à l'internet mais nécessite autant d'adresses IP publique qu'il y a de machine cliente sur le réseau local. C'est donc une technique qui n'est plus utilisée.

La fonction NAT permet aussi de modifier l'adresse IP de destination des paquets provenant du réseau public afin de rendre accessible un service hébergé sur le réseau local ou la DMZ au reste du monde (DNAT).

MASQUERADE

Camoufler les adresses IP du réseau local par l'adresse de la passerelle

Pour pouvoir faire de la translation d'adresse, nous allons utiliser la table nat. Contrairement à la table Filter qui est utilisé par défaut, il va falloir spécifier à iptables que l'on utilise cette table par l'option -t (les deux autres tables mangle et raw auront bien sûr, tout autant besoin d'être signalé par cette option). La cible MASQUERADE n'est utilisé que par la chaîne POSTROUTING de la table nat.

       # iptables -t nat -F
       # iptables -t nat -X
       # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Activation de l'IP Forwarding :

       # echo "1" > /proc/sys/net/ipv4/ip_forward

Chaque machine du réseau local (avec son adresse IP privée) sera ainsi connu sur l'internet par l'unique adresse IP publique de la passerelle. Autrement dit, pour le reste du monde, il n'y a que la passerelle qui fait des requêtes sur l'internet.

SNAT

Permettre l'accès du réseau privé au réseau public avec une adresse IP fixe

La cible MASQUERADE ne devrait s'utiliser que si votre Fournisseur d’Accès Internet vous attribut une adresse IP publique dynamique. Dans le cas d'une adresse IP fixe, il sera préférable d'utiliser la cible SNAT. Cette cible permet une configuration plus fine et optimisée de l'accès à l'internet par le réseau local. Elle permet en effet de définir plus précisément l'adresse (voire la plage d'adresses) source et la plage de ports à donner aux paquets grâce à l'option --to-source (ou --to).

Si votre adresse publique est 8.8.8.8 :

       # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 8.8.8.8

Si vous disposez d'adresses publiques redondantes (par exemple : de 8.8.8.8 à 8.8.8.12), celle-ci seront allouées aux différents flux de façon aléatoire par Netfilter et un flux utilisera toujours la même adresse IP pour tous les paquets transitants dans ce flux :

       # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 8.8.8.8-8.8.8.12

Dans le cas où vous voudriez préciser la plage de portsque doit utiliser Netfilter (par exemple 1024-32000) :

       # iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 8.8.8.8:1024-32000

Tout comme la cible MASQUERADE, SNAT nécessite l'activation de l'IP Forwarding dans le noyau :

       # echo "1" > /proc/sys/net/ipv4/ip_forward
DNAT

Permettre au reste du monde, l'accès à un service derrière la passerelle

La cible DNAT va modifier l'adresse IP destination des paquets entrant.

Si l'on veut rendre accessible un site web héberger sur une machine du réseau local ou si possible sur la DMZ avec l'adresse IP 192.168.3.2 :

       # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.3.2

Si ce même site web est héberger par plusieurs machines différentes pour faire de la redondance et de la répartition de charge (192.168.3.2 à 192.168.3.5) :

       # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.3.2-192.168.3.5

Si le serveur web écoute sur un port inhabituel (81 au lieu de 80 par exemple) :

       # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.3.2:81
Redirection

Il est possible de rediriger tout les flux adressés à un port particulier vers un autre port/machine.

C'est une fonction employée notamment pour l'usage d'un proxy transparent (port utilisé par défaut par Squid 3128) :

       # iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Toute les requêtes sur le port 80 seront donc transférée sur le port écouté par Squid. C'est donc le proxy qui fera les requêtes web pour toutes les machines du réseaux local.

Ne pas oublier de configurer Squid en tant que serveur mandataire transparent en ajoutant tout simplement le mot "transparent" à la première ligne du fichier /etc/squid/squid.conf

LOG

Journalisation de paquets

La journalisation des paquets permet la détection de tentative d'intrusion ou d'anomalie.

LOG

La cible LOG est dédiée à cet objectif. Au lieu de rejeter (REJECT, DROP) ou d'accepter (ACCEPT) le paquet répondant à la règle défini, la cible LOG enverra des informations sur le paquet vers la fonctionnalité de journalisation du noyau, syslogd.

Par exemple, il peut être intéressant d'utiliser cette cible avant d'ajouter une nouvelle règle au pare-feu afin de s'assurer que celle-ci ne vas pas causer un problème de sécurité ou un problème de connexion sur le réseau. Après un contrôle des journaux par la commande dmesg ou la lecture des fichiers /var/log/* (notamment /var/log/messages) qui permet de vérifier que la règle réalise bien ce que l'on attend d'elle, il sera possible de modifier sa cible ou de corriger la règle.

ULOG
NFLOG

Traffic Control (TC) : Quality of Service (QoS)

Pour gérer la bande passante nous avons besoin non seulement d'iptables et de la table Mangle mais aussi de Traffic Control.

Traffic Control intervient uniquement sur les paquets sortant. Son rôle est de décider quand le paquet peut sortir de la pile, selon la politique FIFO (First In First Out : SFQ, TBF, HTB) choisi dans la ligne de commande. La politique par défaut étant pfifo_fast.

Dans cette exemple[3], l'ADSL ayant une bande passante de sortie très réduite, nous allons réduire le débit maximum d'accès au service web à 200 kbits, c'est à dire 25 ko/s.

D'abord, iptables vas juste être utilisé avec la table Mangle pour ajouter une marque sur les paquets concernés par la session dont on veut gérer le débit.

       # iptables -t mangle -A OUTPUT -o eth0 -p tcp --sport 80 -j MARK --set-mark debit-serveur-web

Ensuite, la commande tc vas permettre de créer un arbre dont la racine définit notamment la politique HTB. Cet arbre est composé de deux classes filles. La première est celle que nous allons appliqué au paquets marqué tandis que la seconde concerne tous les autres paquets.

       # tc qdisc add dev eth0 root handle 1: htb default 20
       # tc class add dev eth0 parent 1:0 classid 1:10 htb rate 200kbit ceil 200kbit prio 1 mtu 1500
       # tc class add dev eth0 parent 1:0 classid 1:20 htb rate 1024kbit ceil 1024kbit prio 1 mtu 1500

Enfin, tc vas contrôler les paquets marqué et les associer à la classe correspondante désigné par flowid :

       # tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle debit-serveur-web fw flowid 1:10

La QoS est un système complexe de Netfilter qui nécessite un tutoriel à lui tout seul. La gestion de la bande passante fera donc l'objet d'un autre tutoriel.

Installation

Netfilter

L'auteur ne connait pas de distributions GNU/Linux dont les modules Netfilter ne sont pas compilé par défaut. Si c'est le cas de la votre, vous avez deux possibilités : changer de distribution ou compiler le noyau avec les modules qui nous intéresse. Dans le cas où vous voudriez recompiler le noyau pour activer les fonctionnalités de filtrage de paquets réseau ("Network packet filtering"), voici la liste des modules :

Iptables

Tout comme Netfilter, iptables est installé par défaut sur la plupart des distributions. Si ce n'est pas le cas, utilisez le gestionnaire de paquet pour l'installer. Sur la Debian, comme d'habitude :

       # apt-get install iptables

Configuration

Tout comme l'installation de Netfilter est faite par défaut, sur de nombreuses distributions, sa configuration est nulle et le pare-feu laisse donc passer tous les paquets par défaut. Ainsi, la commande iptables avec l'option -L affiche ceci :

       Chain INPUT (policy ACCEPT)
       target     prot opt source               destination         
       
       Chain FORWARD (policy ACCEPT)
       target     prot opt source               destination         
       
       Chain OUTPUT (policy ACCEPT)
       target     prot opt source               destination

Nous avons deux méthodes pour remédier à cela :

  • en créant les règles au fur et à mesure et en les sauvegardant puis les restaurant au prochain redémarrage de la machine, ou
  • en créant un script.

Dans notre cas, nous utiliserons un script afin d'avoir une vision claire de l'ensemble des règles et nous plus concentrer sur l'organisation des règles plutôt que sur les options à retenir pour faire les modifications en cours d'utilisation.

Mais si vous avez déjà une vision claire du fonctionnement d'un firewall Netfilter et que vous connaissez déjà bien les options de commandes d'iptables, vous voudrez peut-être utiliser la première méthode. Dans ce cas, vous aurez sans doute besoin des commandes permettant la récupération des règles, si vous ne les connaissez pas déjà :

       # iptables-save > /etc/iptables-save
       # iptables-restore < /etc/iptables-save

ou, pour la dernière ligne :

       # cat /etc/iptables-save | iptables-restore

Le fichier /etc/iptables-save résultant est dans un format particulier qui permet un chargement plus rapide de l'ensemble des règle qu'un script classique qui rappelle à chaque fois la commande iptables. Il est donc particulièrement judicieux d'utiliser cette technique dans le cas où Netfilter doit gérer un nombre de règle particulièrement important.

Architecture d'un réseau fictif

Pour rendre le script de notre exemple aussi complet que possible, il vas falloir nous baser sur un réseau imaginaire qui comprend un maximum de caractéristiques tout en restant relativement simple non seulement pour rendre la construction du script pédagogique, mais aussi parce que plus une structure de réseau est simple plus elle est facile à sécuriser.

Notre réseau fictif est donc constitué :

  • d'un réseau local qui a bien sûr besoin d'accéder à l'Internet.
  • d'un accès internet
  • d'une DMZ avec un serveur web qui doit être accessible à partir du réseau public.

La machine sur la quelle fonctionnera ce script aura donc trois interfaces réseaux :

  • eth0 en 192.168.1.1/24
  • eth1 en adressage dynamique attribué par le routeur du fournisseur d'accès à l'Internet
  • eth2 en 192.168.2.1/24

Cahier des charges

Pour être efficace, ce script devra se lancer automatiquement au démarrage du système avant le service réseau. Ainsi, aucun pirate ne pourra profiter d'un redémarrage de la machine pour s'introduire dans le système sans avoir à faire à notre configuration de Netfilter.

Pour rendre notre exemple complet, nous admettrons que le serveur fait office de passerelle avec un réseau privé considéré comme de confiance. De plus, ce serveur est en mode Bastion. C'est à dire qu'il ne se contente pas d'être une passerelle mais aussi de fournir des services sur le réseau privé ainsi que sur le réseau public (ftp) en plus de la DMZ (http). Cela nous permettra d'aborder les règles qui permettent de laisser passer certaines requêtes choisies au travers du pare-feu et à partir du pare-feu.

Le script

Le script sera créer dans le fichier /etc/netfilter/firewall.sh

Nous savons que le principe de filtrage d'un pare-feu doit être : tout ce qui n'est pas autorisé doit être interdit. Il nous faut donc entrer les règles dans un ordre précis : de la plus restrictive à la plus permissive et de la plus globale à la plus précise.

Nous allons donc, dans l'ordre :

  • vider toutes les chaînes de toutes les tables pour éviter que d’éventuelles anciennes règles parasitent la nouvelle configuration.
  • appliquer une politique par défaut qui interdit tous les paquets
  • autoriser uniquement certains flux choisi avec soin.
      #!/bin/sh
      
      # Nettoyage des tables
      /sbin/iptables -F
      /sbin/iptables -X
      /sbin/iptables -t nat -F
      /sbin/iptables -t nat -X
      
      # Politique par défaut de la table filter
      /sbin/iptables -P INPUT DROP
      /sbin/iptables -P OUTPUT DROP
      /sbin/iptables -P FORWARD DROP
      
      # Autorisation des connexions sur la boucle locale
      /sbin/iptables -A INPUT -i lo -j ACCEPT
      /sbin/iptables -A OUTPUT -o lo -j ACCEPT
      
      # Autorisation des connexions sur l'interface du réseau privé
      /sbin/iptables -A INPUT -i eth0 -j ACCEPT
      /sbin/iptables -A OUTPUT -o eth0 -j ACCEPT
      
      # Suivi de connexion : est ré-aiguillé sur le réseau privé uniquement les sessions qui ont été initiées par celui-ci.
      /sbin/iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
      /sbin/iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
      
      # Fonction passerelle
      echo "1" > /proc/sys/net/ipv4/ip_forward
      /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
      
      # Autorisation de l'accès ssh du serveur
      /sbin/iptables -A INPUT -p tcp --dport ssh -j ACCEPT
      
      # Reroutage des requêtes sur le port 80 vers le serveur http de la DMZ
      /sbin/iptables -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.10:80

Automatisation du script

Un second script dans le fichier /etc/init.d/netfilter permettra l'utilisation du fichier de configuration de façon élégante :

A faire...

Outils de mise à l'épreuve du pare-feu

Conclusion

  • Vérification de l'état du pare-feu
  • Gestion de plusieurs firewall
  • Port knocking
  • Interface graphique ou non à Netfilter et iptables.
  • portail captif authentifiant

Voir aussi

Liens externes

Sources

Page en français Iptables Tutorial - Linux-France

Page en françaisNetfilter Hacking - HOWTO

Page en français NAT-HOWTO

Page en français NAT - FrameIP

Page en français NAT - Comment ça marche

Page en français Pare-feu - Comment ça marche

Références

  1. Page en françaisRaisons qui ont poussées les auteurs d'Ipchains à écrire Netfilter
  2. Page en françaisPage man (8) iptables
  3. Page en françaisVoyage au centre du noyau: Traffic Control, la QoS par Julien Vehent

Liens internes