Professional Documents
Culture Documents
Présentation
L’objectif est de configurer un Pentium sous Linux, muni de trois cartes réseau 10/100 Base T, afin
d'étudier les fonctions de filtrage que fournit le noyau 2.4.x.
Vous allez utiliser 3 réseaux de classes d'adresses différentes. Le routeur sera une machine
GNU/Linux équipée de 3 interfaces réseaux.
Pour visualiser les trames qui sont échangées sur le réseau, vous utiliserez un outil d’analyse de
trames, iptraf Linux.
Enfin pour filtrer le trafic et faire du masquage d’adresse et du filtrage, vous utiliserez la
fonctionnalité netfilter du noyau linux et les commandes iptables associées.
routage/filtrage/sécurité 1
Fiche de cours - Routage/Sécurité
Les paquets IP qui sont véhiculés sur le réseau contiennent dans l'en-tête, entre autres informations,
les @IP-source et @IP-destinataire des stations émettrices et destinatrices.
Un routeur IP est un équipement qui permet d'interconnecter deux (ou plus) réseaux (ou sous-
réseaux) IP. Il possède au moins deux interfaces réseaux raccordées chacune aux réseaux IP à
interconnecter.
Le principal rôle du routeur est de rediriger les paquets IP qu'il reçoit sur l'une de ses interfaces,
vers l'interface de sortie, en fonction de l'adresse du destinataire (@IP-destinataire).
Pour cela il dispose d'une table de routage interne (tout comme les stations des utilisateurs qui ont
dans leur table de routage la "passerelle par défaut").
Au dessus de la couche IP plusieurs protocoles sont utilisés ( TCP, UDP, ... ) pour véhiculer les
données entre les applications (http, telnet, ftp, ...).
ICMP est un sous-protocole de IP (niveau3) utilisé notamment pour tester l'accessibilité d'une
machine (ping) ou la route utilisée pour atteindre une machine (traceroute).
Un champ de l'entête IP permet de déterminer le type de protocole utilisé au niveau Transport
(niveau 4).
Enfin au niveau supérieur les applicatifs utilisent des ports (TCP et/ou UDP).
Coté serveur les applicatifs serveurs utilisent des ports prédéfinis. Côté client, le logiciel client
utilise un port utilisateur disponible.
routage/filtrage/sécurité 2
Une connexion (session) 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, port dest.) ]
routage/filtrage/sécurité 3
Introduction à l'analyse de traffic
Rappelons qu’un datagramme IP (contenu dans des trames Ethernet sur le réseau local) contient les
deux triplets suivants :
( @IP source, TCP ou UDP, port source ) et (@IP destinataire, TCP ou UDP, port
destinataire)
L’analyse de trafic consiste à étudier les trames qui sont reçues par la (les) cartes réseau du poste en
fonction d’un certain nombre de critères :
Adresses Ethernet émetteur/destinataire
Type de protocole ( IP, ARP, ICMP, TCP, UDP, ….)
En fonction du port source/destinataire
Certains outils d’analyse permettent d’étudier toutes les trames qui transitent sur le réseau en
passant la carte réseau en mode promiscious.
Nous utiliserons iptraf pour visualiser les trames qui circulent sur les interfaces eth0, eth1 et eth2
des routeurs sous Linux :
10.0.0.x
(A)
Eth2
Anayse du trafic
Issuing the iptraf command without command-line options brings the program
up in interactive mode, with the various facilities accessed through a menu.
routage/filtrage/sécurité 4
Exemple de visualisation ()
Iptraf permet, entre autres, de visualiser les connexions TCP établies. Dans l'exemple ci-dessous
nous voyons qu'il y a une connexion "telnet" (port TCP/23) entre (164.81.20.137,TCP,23) et
(164.81.1.212,TCP,1046) via l'interface Ethernet 0.
Iptraf permettra, en TP, de vérifier les paquets qui transitent sur les différentes interfaces du routeur
à installer.
Le rôle d’un routeur (ou passerelle/gateway en terminologie IP) est de "router" les paquets entrants
sur une des interfaces, vers une interface de sortie, en fonction de l'adresse IP du destinataire (en fait
du réseau auquel il appartient) .
Pour cela le routeur dispose d'une table de routage interne (cf les commandes route ou netstat –r
sous Linux ou W9x) .
Votre routeur, dispose d’une interface vers un réseau de classe A, un réseau de classe B et un réseau
de classe C.
Un serveur GNU/Linux sait, de base, router les paquets IP entre plusieurs interfaces. Il faut
cependant que l'option IP_FORWARD soit validée soit:
de manière dynamique : echo 0/1 > /proc/sys/net/ipv4/ip_forward
dans le fichier de configuration utilisé au démarrage du réseau.
Le serveur GNU/Linux par défaut sait router vers les réseaux auxquels appartiennent ses interfaces
physiques. Le routage par defaut vers les autres réseaux doit être explicitement configuré (fichier
/etc/sysconfig/network).
routage/filtrage/sécurité 5
Exemple de table de routage:
$ /sbin/route
Table de routage IP du noyau (extrait)
Destination Passerelle Genmask Indic Metric Ref Use Iface
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
164.81.20.0 * 255.255.255.0 U 0 0 0 eth0
192.168.100.0 * 255.255.255.0 U 0 0 0 eth1
192.168.110.0 * 255.255.255.0 U 0 0 0 eth2
192.168.120.0 * 255.255.255.0 U 0 0 0 eth3
default 164.81.20.254 0.0.0.0 UG 0 0 0 eth0
Le routeur, depuis le réseau externe, répond à plusieurs adresses IP qui sont traduites vers des
adresses du réseau interne (en général des adresses privées). Cette translation peut être statique
(serveurs) ou dynamique (postes de travail).
Exemple : translation d'adresses entre un réseau de classe A privé 10.0.0.0/8 ( 224 adresses
potentielles ) sur un réseau de classe C officiel 195.195.195/24
routage/filtrage/sécurité 6
Le routeur modifie chaque paquet IP pour remplacer l'adresse interne par l'adresse externe en
sortie, et inversement en entrée.
L’IP masquerade, consiste à masquer les @IP du réseau interne et à n'utiliser que l'adresse du
routeur sur le réseau d'interconnexion.
Cette technique est intéressante pour connecter tout un réseau local sur l'accès d'un prestataire qui
ne fournit qu'une seule adresse IP (souvent dynamique).
Le routeur tient, pour chaque connexion TCP/UDP initiée depuis le réseau interne, la
correspondance entre les triplets (@IP interne, TCP/UDP, port utilisateur) et (@IP de sortie,
TCP/UDP, port translaté).
Dans chaque paquet sont modifiés par le routeur, l'adresse IP et le port utilisateur de l'émetteur.
Dans ce type de configuration, seul le routeur est visible de l'extérieur. C'est la solution pour
partager un accès unique vers un prestataire Internet.
routage/filtrage/sécurité 7
Les fonctions de filtrage :
Pour des raisons de sécurité il est souvent utile, voire indispensable d'effectuer un filtrage au niveau
des paquets IP qui transitent à travers un routeur:
Le filtrage s'effectue en analysant les champs (source/destinataire) des paquets qui transitent à
travers le routeur. On peut ainsi filtrer sur les @IP, le protocole, les ports, …
En général les règles de filtrage sont analysées de manière séquentielle, dès qu'une règle correspond
au paquet analysé, elle est appliquée.
routage/filtrage/sécurité 8
Linux peut intègrer de base (selon les options d'installation), les fonctions de routage, de filtrage et
de masquage. Il s'agit de :
ipfwadm dans les noyaux 2.0.x (obsolète)
ipchains dans les noyaux 2.2.x (actuel/obsolète) Mandrake 6.1 à 7.2
netfilter/iptables dans les noyaux 2.4.x (actuel) Mandrake >8.0
Ce dernier fait du NAT et PAT en plus du masquage. Des outils graphiques ont été développés pour
simplifier la conception des listes d'accès utilisées.
Netfilter est un sous-système du noyau Linux qui permet d'inspecter les paquets IP et de les filtrer
selon certaines règles. Il utilise le mécanisme de listes d'accès qui sont regroupées dans des
"chaînes", elles mêmes contenues dans des tables. Chaque paquet IP qui arrive, traverse, sort de
Linux est analysé et traité (accepté, rejeté, refusé, modifié, redirigé) en fonction des règles qui lui
sont applicables. Netfilter permet de faire de la translation d'adresses et du masquage (translation de
ports).
iptables est l'outil qui permet la manipulation des chaînes et des tables de netfilter.
IN FORWARD OUT
routage
INPUT OUTPUT
Processus local
Le routeur est une « boîte noire ». Chaque paquet entrant est « pris en charge », 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 pas la chaîne
INPUT, ceux émis par les processus internes, c'est à dire qui sortent, par la chaîne OUTPUT .
routage/filtrage/sécurité 9
Schéma de traitement des paquets
routage/filtrage/sécurité 10
ANNEXE : Langage de définition des règles de Netfilter
Les principales commandes d'iptables ( voir man iptables en annexe) :
Syntaxe : Fonction :
iptables -h aide en ligne
iptables -L lister les chaînes et règles actives
iptables -N chain créer une nouvelle chaîne utilisateur
iptables -X chain supprimer chaîne utilisateur
iptables -F [chain] vider une chaîne (ou toutes)
iptables -P chain cible traitement par défaut pour une règle
iptables -A chain règle ajouter une règle à la chaîne
iptables -I chain [numéro] règle insérer une chaîne en position numéro
iptables -D chain [numéro] [règle] effacer une règle
iptables -R chain [numéro] [règle] remplacer une règle
iptables -C chain tester un paquet dans une règle
iptables -Z [chain] remettre à zéro les compteurs
Les principaux paramètres qui peuvent apparaître dans la partie règle sont :
Paramètre Fonction
Dans cet exemple on interdit sur l'interface eth1 tout ce qui ne vient pas du réseau
195.220.162.0/24
routage/filtrage/sécurité 11
Les tables de netfilter sont stockées en mémoire et sont effacées lors des rechargements.
Exemple:
linux> /sbin/iptables-save > /etc/regles-iptables
linux> /sbin/iptables-restore < /etc/regles-iptables
LINUX# iptables -L
Chain INPUT (policy ACCEPT) ...
LINUX# iptables -L -v
routage/filtrage/sécurité 12
0 0 DROP tcp -- any .220.162.0/24 anywhere tcp dpt:ftp
6 288 REJECT tcp -- any 195.220.162.0/24anywhere tcp dpt:http reject-
with icmp-port-unreachable
iptables -A OUTPUT -s 212.47.248.239/32 -p tcp --dport 22 -j LOG --log-prefix "Sessions SSH sortantes:"
iptables -A FORWARD -s 195.220.162.0/24 -p tcp --dport 23 -j LOG --log-prefix "TELNET SORTANT : "
Extrait de iptables -n -L
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- 212.47.248.239 0.0.0.0/0 tcp dpt:22 LOG flags 0 level 4
prefix `Sessions SSH sortantes:'
Oct 30 21:06:58 neptune kernel: Sessions SSH sortantes:IN= OUT=ppp0 SRC=212.47.248.239 DST=195.115.88.38
LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0
DF PROTO=TCP SPT=1253 DPT=22 WINDOW=9568 RES=0x00 ACK URGP=0
La translation d'adresse a été entièrement revue dans les noyaux 2.4. Les paquets IP sont examinés,
dans la table nat, dans les chaînes PREROUTING, POSTROUTING et OUTPUT.
Dans les chaînes PREROUTING et OUTPUT on ne peut que modifier l'adresse de destination du
paquet (cible DNAT).
routage/filtrage/sécurité 13
Dans la chaîne POSTROUTING on ne peut que modifier l'adresse source du paquet (cible SNAT).
Lorsqu'on fait du NAT il faut, en plus de netfilter, charger certains modules du noyau, qui sont
indispensables pour le traitement des flux IP qui n'utilisent pas toujours le même port.
Par exemple ftp utilise le port TCP/21 pour les commandes, mais aussi TCP/20 pour les transferts
de données, De même l'IRC, Realaudio,... utilisent des ports variables.
Dans la distribution courante de netfilter il y a des modules, dynamiques ou compilés avec le noyau
qui, pour un protocole donné, sont chargés de suivre les connexions et traiter le NAT.
Les postes sont dans un réseau de classe A privée 10.0.0.0/8 ( plusieurs milliers de machines
possibles) dans lequel on n'utilise que la tranche 10.10.10.0.
On dispose d'une adresse IP officielle 195.220.162.0/24
Le NAT (translation) de l'adresse source consiste à attribuer aux appels sortants une adresse source
dans le réseau IP officiel.
# Forwarding Rules
/sbin/iptables -F FORWARD ; /sbin/iptables -P FORWARD ACCEPT
routage/filtrage/sécurité 14
# Source NAT Rules
/sbin/iptables -t nat -F POSTROUTING
/sbin/iptables -t nat -A POSTROUTING -s 10.10.10.0/8 -j SNAT --to-source 195.220.162.1-195.220.162.50
Nota : A priori les connexions ne sont possible que depuis le réseau interne. Même lorsque une
connexion externe est établie depuis une machine 10.10.10.x (vue de l'extérieur comme
195.220.162.y ) il ne semble pas possible de se connecter depuis l'extérieur vers cette machine
195.220.162.y .
Exemple : on veut rediriger tous les appels entrants, quelque soit le port, vers une machine unique
du réseau interne (10.10.10.1)
routage/filtrage/sécurité 15
#
# Destination NAT Rules
/sbin/iptables -t nat -F PREROUTING
/sbin/iptables -t nat -A PREROUTING -d 195.220.162.0/24 -j DNAT --to-destination 10.10.10.1
Notes :
Il est possible de faire du NAT-destination et du filtrage simultanément.
Il est possible d'utiliser le DNAT pour faire du pseudo-équilibrage de charge vers plusieurs serveurs
iptables -t nat -A PREROUTING -d 195.220.162.15 -j DNAT --to-destination 10.10.10.1-10.10.10.4
Les appels entrants vers la machine de 195. 220.162.15 seront dispatchés entre les machines 1 à 4
du réseau 10.10.10.0/4, et ceci pour tous les ports.
Il est possible d'utiliser le DNAT pour rediriger sur un autre port
iptables -t nat -A PREROUTING -d 195.220.162.15 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.1:8080
Les appels entrants vers la machine de 195. 220.162.15 port TCP/80 (web) seront redirigés vers la
machine 10.10.10.1 et le port TCP/8080.
Lorsqu'on fait du masquage, tous les postes sortent avec l'adresse de sortie du routeur (ici
164.81.3.63) . En terminologie "Linux" cela s'appelle de l'IP masquerade.
routage/filtrage/sécurité 16
Sous Linux 2.0 et 2.2 (ipchains), seul le masquage était supporté, pas le NAT.
La terminologie a été conservée, mais en fait il ne s'agit que de SNAT (translation d'adresse source)
où l'adresse de la machine interne qui initie la connexion, est remplacée par l'adresse externe du
routeur.
Créer un script qui contiendra par exemple
# Input and Output Rules
/sbin/iptables -F INPUT ; /sbin/iptables -P INPUT ACCEPT
/sbin/iptables -F OUTPUT ; /sbin/iptables -P OUTPUT ACCEPT
#
# Forwarding Rules
/sbin/iptables -F FORWARD ; /sbin/iptables -P FORWARD ACCEPT
#
# Destination NAT Rules
/sbin/iptables -t nat -F POSTROUTING
/sbin/iptables -t nat -A POSTROUTING -s 10.10.10.0/8 -j SNAT --to-source 164.81.3.63
Il est également possible d'utiliser la cible MASQUERADE. D'après les HOWTO elle est même
préférable lorsque le routeur Linux a une adresse coté Externe obtenue dynamiquement (adresse
obtenue par DHCP, ou connexion PPP) .
routage/filtrage/sécurité 17
Petite étude de cas :
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Le tour est joué, vous n'avez plus qu'à configurer les autres clients avec un DNS et une passerelle
par défaut. Votre accès wan est partagé.
routage/filtrage/sécurité 18
Iptables : tutoriel
Créer une nouvelle chaîne?
iptables -N votre_nom_de_chaîne
Vous remarquerez que votre_nom_de_chaîne figure ici en minuscule. Par convention, les chaînes
définies par l'utilisateur sont écrites en minuscule pour les distinguer des autres. Votre chaîne
maintenant créée, vous pouvez la remplir de règles.
Pour l'exemple, nous "droperons" tous les paquets icmp en provenance de 127.0.0.1:
iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
$>iptables -F nom_de_votre_chaîne
Attention! Si vous ne spécifiez aucune chaîne, toutes les chaînes seront vidées.
$>iptables -X ma_chaîne
$>iptables -L INPUT
$>iptables -L
$>iptables -L -v
$>iptables -L -v -n
L'argument -L sans aucun autre paramètre permet d'afficher toutes les chaînes présentent, même si
elles ne contiennent aucune règle.
La sous-option -v, mode verbose
La sous-option -n, mode numérique (sans résolution de nom)
$>iptables -L -v -n -Z
routage/filtrage/sécurité 19
Mentionner un protocole avec -p
$>iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
Ici, on veut tous les drapeaux, à savoir : SYN, ACK, FIN, RST, URG, PSH
Il existe encore deux autres drapeaux présents pour vous faciliter la tâche comme ALL et NONE.
ALL regroupe l'ensemble des drapeaux et NONE bien évidement aucun.
--syn , est un raccourci pour –tcp-flags (SYN,RST,ACK SYN)
Si vous désirez insérer la notion de "tous les ports supérieurs ou égaux à" ou bien "tous les ports
inférieurs ou égaux à", laissez le champ vide après ou avant les deux points, selon ce que vous
désirez faire.
$>iptables -A INPUT -j ACCEPT -s 127.0.0.1 -p tcp --sport 20:
Pour spécifier plusieurs interfaces du même type (eth0, eth1, eth2, etc... par exemple) vous pouvez
utiliser le caractère +. par exemple eth+ ou ppp+
Netfilter : Références :
Linux 2.4 Packet Filtering HOWTO
Linux 2.4 NAT HOWTO
Linux IP Masquerade HOWTO
Linux Netfilter Hacking HOWTO
Linux Advanced Routing & Traffic Control HOWTO ( anciennement Linux 2.4 Advanced Routing
HOWTO)
Iptables Tutorial 1.1.6 ( de Oskar Andreasson)
routage/filtrage/sécurité 20
Netfilter : Sites web :
http://www.linuxdoc.org est le site officiel des Howto. Nombreux sites miroirs dont en France
http://linux.cict.fr/LDP
routage/filtrage/sécurité 21
TD- Routage/Sécurité
Schéma à utiliser :
Écrire les règles de filtrage iptables qui répondent aux différents problèmes exprimés ci-
dessous.
Notation :
A = 195.0.0, B = 172.16,
A.0 = toutes les machines du réseau 1, B.0.0 = toutes les machines du réseau B
Masquer toutes les adresses de A.0 uniquement tous les services pop3 et smtp
N’autoriser que les paquets de A.1 vers B.0.1, interdire tout le reste
Interdire que les paquets de A.1 vers B.0.1 autoriser tout le reste
N’autoriser que le service telnet de A.1 vers B..01, interdire tout le reste
N’autoriser que les paquets TCP de A.0 vers B.0.0 et interdire tout le reste.
routage/filtrage/sécurité 22
TP- Routage/Sécurité
Vous utiliserez la documentation de netfilter et les exemples commentés qui vous sont fournis.
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=192.168.x.z
NETMASK=255.255.255.0
NETWORK=192.168.x.0
BROADCOAST=192.168.x.255
ONBOOT=yes ; initialisation au chargement du réseau
BOOTPROTO=none ; pas d’utilisation de bootp
USERCTL=no ; permettre à un utilisateur de désactiver les cartes
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
IPADDR=192.168.y.z
NETMASK=255.255.255.0
NETWORK=192.168.y.0
BROADCOAST=192.168.y.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
routage/filtrage/sécurité 23
4 - Lancez le service réseau sur R « /etc/rc.d/init.d/network restart », relevez les routes.
5 - Vérifiez à l’aide de la commande « ifconfig » que les interfaces sont bien actives. Corrigez tant
que ce n’est pas le cas.
6 - Configurez et installez C sur votre réseau privé,
7 - Testez l’accès de C vers les deux interfaces de R.
8 - Si l’accès vers le réseau public ne fonctionne pas, activez le routage (ip forward) entre les
interfaces de réseau. Vous pouvez modifier le fichier « network » .
Ce fichier est situé dans /etc/sysconfig/.
/etc/sysconfig/network
NETWORKING=yes
FORWARD_IPV4=yes ; sans cette option la passerelle ne fonctionnera pas
HOSTNAME=d2r2.toubet.edu
DOMAINNAME=toubet.edu
GATEWAY=
GATEWAYDEV=
9 - Vérifiez avec une commande « ping » que les interfaces de R sont bien visibles à partir de C.
10 - Vérifiez l’installation du programme iptraf sur R
Deuxième partie : mise en oeuvre de règle de filtrages simples et du masquage d’adresse sur le
routeur
1 - Interdisez toutes les requêtes de C vers S (extérieur) (tester)
2 - Autorisez toutes les requêtes du client C vers S (tester)
3 - Interdisez tout passage sur la chaîne FORWARD en laissant l’option « ACCEPT » sur les
chaînes INPUT et OUTPUT (tester)
4 - Activez le masquage d’adresse pour toutes les machines du réseau auquel appartient C vers tous
les autres réseaux (tester)
5 - Activez le masquage d’adresse pour toutes les machines du réseau auquel appartient C vers un
seul des autres réseaux. Exemple si vous êtes sur le réseau vert.org, activer le masquage vers
bleu.org. Les paquets ne devront pas passer vers rouge.org, ni noir.org. (tester)
6 - Restaurez l’état réalisé au point 4 (après masquage). Activez « iptraf » sur l’interface publique.
Vérifiez que seule, l’adresse ip de l’interface du réseau privé apparaît et que toutes les autres sont
« masquées ». Notez la translation de port.
Troisième partie : mise en place de règles de filtrage par adresse, par port et par protocole.
1 - Relevez dans le fichier « /etc/protocol » et « /etc/services » les ports et les noms des protocoles
utilisés par les services ftp et http.
Refusez tout trafic de C vers l’extérieur à destination de ces ports. Vérifiez que telnet est accepté.
(tester puis restaurer)
2 - N’autorisez à C l’accès qu’à une seule machine (par exemple le client C de rouge si vous êtes
sur vert), refusez tout le reste. (tester puis restaurer)
3 - Refusez tout accès à la machine (172.x.0.1) de votre réseau (172.x.0.0) vers le réseau
(192.168.90.0). (tester.)
4 - Relevez les ports et protocoles utilisés par les services de résolution de noms
Construisez les règles afin qu’elles répondent au problème suivant. On désire que :
toutes les machines du réseau privé puissent avoir accès à tous les autres services de n’importe
routage/filtrage/sécurité 24
quel réseau
la machine C de votre réseau privé ne peut pas envoyer de requête UDP/DOMAIN vers la
machine S.
(testez pour les requêtes sur le serveur de noms puis pour des requêtes sur le serveur ftp en utilisant
l’adresse IP)
Pour les deux traitements qui suivent, vous utiliserez deux écritures, dont l’opérateur « ! » (not) qui
permet d’obtenir des compléments.
5 - Autorisez toutes les requêtes qui sortent vers l'extérieur, sauf celles qui vont sur un port ftp
6 - N’autorisez aucune requête hormis celles qui sont à destination de port 80
routage/filtrage/sécurité 25