44. Le routage et le filtrage des paquets IP

44.1. Éléments de cours sur le routage et le filtrage de paquets IP

44.1.1. Routage, filtrage sur les paquets IP

Les paquets ip sont routés en fonction de leur adresse de destination et de leur adresse d’émission. Ils utilisent un protocole de transport (UDP ou TCP). La session est identifiée par un port source et par un port de destination.

Une connexion (session au sens OSI du terme) entre un processus client et un processus serveur est matérialisée par le couple de triplets :


	(@IP-source, TCP/UDP, port source) , (@IP-dest., TCP/UDP, portdest.)

Une session permet de déterminer quelle application (service serveur) est sollicitée.

44.1.2. Technique de masquage et de traduction d’adresse

La traduction d’adresse (address translation) est une technique principalement utilisée pour partager une ou plusieurs adresses publiques pour un réseau privé (pénurie d’adresses publiques). Elle permet également de sécuriser un réseau en entrée et de limiter les sorties.

Pendant cette opération, également appelée masquage ou camouflage (ip masquerade), le routeur modifie dans le paquet l’adresse source (SNAT ou ip masquerade) ou l’adresse de destination (DNAT). La modification est réalisée lors de l’envoi et du retour du paquet.

Il y a bien deux fonctions différentes : le routage et le filtrage. Le filtrage va consister à appliquer des règles supplémentaires aux paquets qui sont routés.

Ces deux fonctions sont prises en charge par le noyau Linux. Elles sont prises en charges par "ipchains" pour les noyaux 2.2.x et par "netfilter" pour les noyaux 2.4.

Le filtrage consiste à mettre en place des règles qui seront appliquées aux paquets. Pour netfilter, on utilise la commande "iptables" qui permet de mettre en place ou modifier des chaînes de règles. Les chaînes sont des ensemble de règles qui sont appliquées séquentiellement aux paquets jusqu’à ce que l’une d’entre elles soit applicable. Il y a toujours au moins une chaîne par défaut. Ces chaînes, sont placées dans des tables.

Il y a trois tables principales pour netfilter (filter, nat et mangle) :

  1. La table "filter" est la table par défaut qui contient les règles de filtrage.

  2. La table "nat" contient les règles pour faire de la traduction d’adresse.

  3. La table "mangle" contient les règles qui permettent de modifier les paquets ip, par exemple le champ TOS.

Dans la table filter, il y a trois principales chaînes : (input, output, forward) :

  1. La chaîne "input" contient les règles appliquées aux paquets entrants qui sont généralement destinées aux processus locaux.

  2. La chaîne "output" contient les règles appliquées aux paquets sortants qui sont généralement émis par les processus locaux.

  3. La chaîne "forward" contient les règles appliquées aux paquets qui traversent.

Figure 19. Routage pris en charge par le noyau

Le routeur est une "boîte noire". Chaque paquet entrant, quelque soit l’interface d’entrée est "routé" par le noyau. Les paquets qui ne font que traverser le routeur Linux, sont concernés par la chaîne "Forward". Ceux qui sont destinés aux processus internes, c’est à dire qui entrent, sont concernés par la chaîne "Input", ceux émis par les processus internes, c’est à dire qui sortent, par la chaîne "Output".

44.1.3. Masquerading et Forwarding

Le forwarding est une fonction qui permet de router les paquets entre deux réseaux.

Le masquerading est le fait de permettre aux machines de votre réseau interne de pouvoir sortir sur votre réseau externe en utilisant une seule adresse IP officielle. Cette adresse officielle est mise à la place de l’adresse IP de votre machine cliente et re-remplacée au retour du paquet. Dans le cas du masquerading, les machines internes ne peuvent pas être atteintes sans règles supplémentaires par une machine de l’extérieur.

44.2. Le protocole ICMP

44.2.1. ICMP et le filtrage de paquets

Les réseaux fonctionnant en IP ont besoin de s’envoyer des messages de contrôle, de temps à autre. Ces messages sont regroupés dans le protocole ICMP, Internet Control Message Protocol, rfc 792.

Ce protocole peut facilement se filtrer avec les firewalls, il est donc important de savoir quels messages on doit/veut bloquer et ceux que l’on peut/veut voir traverser notre pare-feu.

Chaque paquet ICMP a un code et un type :


type 0 Réponse Echo
code 0 = réponse à une demande d’echo

type 3 Destination non accessible
code 0 = réseau inaccessible
code 1 = hôte inaccessible
code 2 = protocole non disponible
code 3 = port non accessible
code 4 = fragmentation nécessaire mais interdite
code 5 = échec d’acheminement source

type 4 Contrôle de flux
code 0 = ralentir le flux de l’émission

type 5 Redirection
code 0 = redirection de  datagramme sur la base du réseau
code 1 = redirection de  datagramme sur la base de l’adresse d’hôte
code 2 = redirection de  datagramme sur la base du réseau et du Type de Service
code 3 = redirection de  datagramme sur la base de l’hôte et du Type de Service

type 8 Echo
code 0 = envoi d’un echo

type 11 Durée de vie écoulée
code 0 = durée de vie écoulée avant arrivée à destination
code 1 = temps limite de réassemblage du fragment dépassé

type 12 Erreur de Paramètre
code 0 = l’erreur est indiquée par le pointeur

type 13 Marqueur temporel
code 0 = envoi d’une étiquette temporelle d’émission

type 14 Réponse à marqueur temporel
code 0 = envoi d’une étiquette temporelle de réception et de transmission

type 15 Demande d’information
code 0 = demande du numéro de réseau

type 16 Réponse à demande d’information
code 0 = réponse du numéro de réseau

44.3. Iptables

44.3.1. Langage d’Iptables

Extrait du manuel :


NAME
       iptables — administration tool for IPv4 packet filtering and NAT

SYNOPSIS
       iptables [-t table] {-A|-D} chain rule-specification

       iptables [-t table] -I chain [rulenum] rule-specification

       iptables [-t table] -R chain rulenum rule-specification

       iptables [-t table] -D chain rulenum

       iptables [-t table] -S [chain [rulenum]]

       iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

       iptables [-t table] -N chain

       iptables [-t table] -X [chain]

       iptables [-t table] -P chain target

       iptables [-t table] -E old-chain-name new-chain-name

       rule-specification = [matches...] [target]

       match = -m matchname [per-match-options]

       target = -j targetname [per-target-options]

Exemple d’utilisation des règles :


# iptables -F INPUT [-t filter]
# iptables -P INPUT ACCEPT
# iptables -A INPUT -i eth0 -s ! 192.168.0.0.0/24 -j DROP

Les tables passées en lignes de commandes ou dynamiquement, ne sont pas conservées lors du redémarage de la machine. Il est nécessaire d’utiliser les commandes iptables-save et iptables-restore pour les sauvegarder, ou les mettre dans un script qui est exécuté au démarrage de la machine, par exemple dans /etc/init.d/rc.local.

44.3.2. Exemples d’utilisation d’iptables

Il est bon de prendre soin de vérifier l'état des règles avant de procéder à des tests.


vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ iptables -F INPUT; iptables -P INPUT ACCEPT
vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ iptables -F FORWARD; iptables -P FORWARD ACCEPT
vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ iptables -F OUTPUT; iptables -P OUTPUT ACCEPT

Par exemple, on souhaite interdire en entrée toute requête HTTP :

Figure 20. Requête HTTP sous lynx sans règle iptables


vanvincq@CP2L ~ $ sudo iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 80 -j REJECT

Figure 21. Requête HTTP sous lynx avec règle iptables

44.3.3. La traduction d’adresse - NAT

La traduction d’adresse (NAT) est gérée avec les chaînes "PREROUTING", "POSTROUTING" et "OUTPUT". Avant le routage, on ne peut modifier que l'adresse de destination. L'adresse d'origine n'est pas modifiée. On appelle cela du DNAT (NAT Destination). Après le routage, on ne peut modifier que l'adresse source. L'adresse de destination est conservée. On effectue du SNAT (NAT Source).

Certaines applications nécessitent des options. Ces options sont compilées directement dans votre noyau ou sous forme de modules disponible dans /lib/modules/VotreNoyau/kernel/net/ipv4/netfilter/.

44.3.3.1. Le DNAT ou NAT Destination

On substitue à l’adresse de destination des paquets provenant du réseau public, une adresse du réseau local privé. Dans l’exemple, les paquets à destination de la machine 195.x sont redirigés vers la machine 172.y. On ne tient pas compte du port.


iptables -F INPUT ; iptables -P INPUT ACCEPT
iptables -F OUTPUT ; iptables -P OUTPUT ACCEPT
iptables -F FORWARD ; iptables -P FORWARD ACCEPT
iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING -d 195.115.19.35/32 \
         -j  DNAT --to-destination 172.16.0.1/32

44.3.3.2. Le SNAT ou NAT Source

Le SNAT consiste à substituer une adresse source dans un paquet sortant à son adresse source d’origine. On substitue ici, aux requêtes provenant du réseau 192.168.0.0/24, une des 10 adresses publiques.


iptables -F INPUT ; iptables -P INPUT ACCEPT
iptables -F OUTPUT ; iptables -P OUTPUT ACCEPT
iptables -F FORWARD ; iptables -P FORWARD ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
         -j  SNAT --to-source   195.115.90.1-195.115.90.10

44.3.3.3. L’IP Masquerade

Dans ce cas, les adresses privées, utilisent toutes la même adresse publique. C’est le procédé qui est utilisé avec ipchains. Il s’agit en fait de translation de port avec ipchains ou de SNAT (Nat Source) avec iptables.


iptables -F INPUT ; iptables -P INPUT ACCEPT
iptables -F OUTPUT ; iptables -P OUTPUT ACCEPT
iptables -F FORWARD ; iptables -P FORWARD ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.10.10.0/8 \
         -j  SNAT --to-source 139.63.83.120

Ou, avec l'option MASCARADE :


iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.10.10.0/8 -j MASQUERADE

44.3.3.4. Exemple sur un réseau privé

L’exemple ci-dessous indique comment partager un accès internet chez soi pour plusieurs machines en utilisant un Dial-up Internet access (Accès par ligne commutée) sur le réseau.


#ifconfig
eth0      Lien encap:Ethernet HWaddr 00:80:C8:7A:0A:D8
          inet adr:192.168.0.1 Bcast:192.168.0.255 Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:19950 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24988 errors:0 dropped:0 overruns:0 carrier:0
          collisions:2 lg file transmission:100
          RX bytes:2830076 (2.6 Mb) TX bytes:12625623 (12.0 Mb)
          Interruption:5 Adresse de base:0x240
ppp0      Lien encap:Protocole Point-à-Point
          inet adr:212.47.248.114 P-t-P:212.47.251.49 Masque:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1524 Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:3
          RX bytes:4924 (4.8 Kb) TX bytes:1365 (1.3 Kb)

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

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

#iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE all -- 192.168.90.0/24         anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

n.b : Mettre un '1' dans /proc/sys/net/ipv4/ip_forward permet d'indiquer au noyau que l'on souhaite activer l'IP forwarding.

Il ne reste plus qu’à configurer les autres clients avec un DNS et une passerelle par défaut pour que l'accès WAN soit partagé.