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.
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) :
La table "filter" est la table par défaut qui contient les règles de filtrage.
La table "nat" contient les règles pour faire de la traduction d’adresse.
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) :
La chaîne "input" contient les règles appliquées aux paquets entrants qui sont généralement destinées aux processus locaux.
La chaîne "output" contient les règles appliquées aux paquets sortants qui sont généralement émis par les processus locaux.
La chaîne "forward" contient les règles appliquées aux paquets qui traversent.
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".
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.
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
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.
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 :
vanvincq@CP2L ~ $ sudo iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 80 -j REJECT
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/.
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
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
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
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é.