Vous êtes sur la page 1sur 25

Routage / Filtrage / Sécurité

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.

Éléments de cours et graphiques (MG)


Éléments d'application (AM)

Plateforme utilisée (cf schéma donné pour le TP sur le routage)


La plateforme matérielle utilisée par chaque groupe de TP sera issue de celle utilisée lors des
TD/TP précédement réalisés sur le routage. Vous avez à la fin du document la maquette complète
de la salle.

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é

Rappels sur le routage en IPv4

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).

Rappels sur les connexions (session) TCP et UDP :

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.) ]

Établissement et Fermeture d'une session TCP


Cette partie résume ce qui a été fait dans les TPs sur la métrologie.

Établissement d'une session TCP

Fermeture d'une session TCP

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

172.16.y.z (B) Eth1 Routeur linux : Eth01


Réseau externe
Routeur.couleur.org

Anayse du trafic

Utilisation de iptraf ( extrait du help)

Command syntax: iptraf [ { -i | -g | -d iface | -s iface | -e | -f } ]

Issuing the iptraf command without command-line options brings the program
up in interactive mode, with the various facilities accessed through a menu.

These options can also be supplied to the command:

-i - immediately start the IP traffic monitor


-g - immediately start the general interface statistics
-d iface - allows you to immediately start the detailed
on the indicated interface (iface)
-s iface - allows you to immediately monitor TCP and UDP
traffic on the specified interface (iface)
-e - start the Ethernet station monitor
-f - IPTraf normally will not allow multiple copies of
itself running simultaneously. -f overrides.
Use with great caution. May be used after an
abnormal termination.

IPTraf 1.2.0 Copyright (c) Gerard Paul Java 1997, 1998


This software may be distributed and/or modified under the terms of the
GNU General Public License, Version 2 or later as published by the Free
Software Foundation.

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.

Les fonctions de routage

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

Fonctions de masquage et de translation d'adresses

Ces techniques sont utilisées principalement dans deux cas :


connecter plus de stations qu'il n'y a d'adresses IP disponibles
masquer les adresses réelles des stations derrière le routeur

La translation d'adresses ( NAT : Network Address Translation )

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.

La masquage d'adresses IP ( IP masquerade ) :

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.

Exemple : connexion d'un réseau de classe C privé 192.168.100/24 ( 28 adresses potentielles ) en


utilisant l'adresse d'interconnexion vers le réseau externe.

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:

Exemple : effectuer les filtrages pour


interdire en sortie tout le trafic Web et ftp
autoriser tout le reste

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, …

Filtrage au niveau Filtrage au niveau


adresse ip applicatif
Filtrage au niveau
protocole

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.

Filtrage et masquage avec netfilter sous Linux

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.

Trois tables sont utilisées :


filter , table par défaut, qui contient les chaînes de règles de filtrage
nat, qui contient les chaînes de règles de translation d'adresse/port
mangle, qui contient les chaînes de règles de modification de paquets ( utilisée par exemple,
pour modifier le champ TOS des paquets IP)

Dans la table filter, trois chaînes sont prédéfinies :


FORWARD qui contient les règles à appliquer aux paquets qui traversent
INPUT qui contient les règles à appliquer aux paquets destinés aux processus locaux
OUTPUT qui contient les règles à appliquer aux paquets émis par les processus locaux

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

On peut spécifier les commandes et paramètres sous forme courte ou longue:


Exemple : -L est équivalent à --list, -A à --append

Les principaux paramètres qui peuvent apparaître dans la partie règle sont :

Paramètre Fonction

-i interface appliquer la règle sur cette interface d'entrée


-o interface appliquer la règle sur cette interface de sortie
-t table table concernée ( filter par défaut)
-s [!] X.X.X.X/lg adresse source, longueur du masque
le ! signifie la négation (cf. exemple)
-d [!] X.X.X.X/lg adresse dest (et longueur du masque)
-p protocole tcp / udp / icmp / all
--source-port [!] [port[:port]] port source (ou intervalle de ports)
--destination-port [!] [port[:port]] port destination (ou intervalle de ports)
--tcp-flags [!] masq comp flags de paquets tcp ( ex. SYN)
-j cible ACCEPT/DROP/QUEUE/RETURN/REDIRECT/
MASQUERADE / DNAT/ SNAT/ LOG

Utilisation des règles


Exemple de règle :
linux> /sbin/iptables -F INPUT [-t filter]
linux> /sbin/iptables -P INPUT ACCEPT
linux> /sbin/iptables -A INPUT -i eth1 -s ! 195.220.162.0/24 -j DROP
linux> /sbin/iptables -A FORWARD -i eth1 -s ! 195.220.162.0/24 -j DROP

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.

Il faut donc au reboot exécuter un script shell qui :


soit repasse l'ensemble des commandes iptables nécessaires (par ex dans rc.local)
soit restaure les tables préalablement sauvegardées

Deux commandes permettent de sauvegarder/restaurer les tables : iptables-save et iptables-


restore (cf man )

Exemple:
linux> /sbin/iptables-save > /etc/regles-iptables
linux> /sbin/iptables-restore < /etc/regles-iptables

Configurer le filtrage avec iptables

Exemple de configuration ou on interdit aux requêtes vers les ports 21 et 80 de sortir.


Seule la chaîne FORWARD est concernée par le trafic traversant le routeur, puisque les machines
du réseau interne peuvent faire du web/ftp sur le routeur lui-même (INPUT).

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
/sbin/iptables -A FORWARD -s 195.220.162.0/24 -p tcp --dport 21-j DROP
/sbin/iptables -A FORWARD -s 195.220.162.0/24 -p tcp --dport 80 -j REJECT

Si on visualise le contenu de la table filter

LINUX# iptables -L
Chain INPUT (policy ACCEPT) ...

Chain FORWARD (policy ACCEPT)


target prot opt source destination
DROP tcp -- 195.220.162.0/24 anywhere tcp dpt:ftp
REJECT tcp -- 195.220.162.0/24 anywhere
tcp dpt:http reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)

Routage et filtrage sous Linux2.4 ( netfilter/iptables)

Visualisation des compteurs associés aux règles :


Avec l'option verbose (-v) l'affichage indique le nombre de fois où la règle à été appliquée ( nombre
de paquets et nombre d'octets)

LINUX# iptables -L -v

Chain FORWARD (policy ACCEPT 14 packets, 826 bytes)


pkts bytes target prot opt in out source

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

LINUX# iptables Z FORWARD # remet à zéro les compteurs de la chaine FORWARD

LOG des accès :


Iptables permet de tracer (logger) les paquets qui satisfont à une règle .

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:'

LINUX# tail /var/log/messages


Permet d'avoir accès aux logs et une lisibilité plus claire. Exemple de suivi des transactions ssh
sortantes.
Oct 30 21:05:56 neptune kernel: Sessions SSH sortantes:IN= OUT=ppp0 SRC=212.47.248.239 DST=80.247.225.35
LEN=100 TOS=0x10 PREC=0x00 TTL=64 ID=3
0211 DF PROTO=TCP SPT=1251 DPT=22 WINDOW=7840 RES=0x00 ACK PSH URGP=0

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 (NAT) avec netfilter

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).

Modules du noyau nécessaires au NAT :

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.

Ex: ip_conntrack_ftp.o et ip_nat_ftp.o sont utilisés pour ftp


En cas de problème avec ftp charger les modules avec la commande insmod module.

Configuration de base pour faire du NAT-source :

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.

On peut même n'affecter au réseau 10.0.0.0/8 que 50 adresses du réseau 195.220.162.0/24 et


réserver les suivantes à d'autres usages.

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

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

Extrait du contenu de la table nat

LINUX# iptables -t nat -L

Chain POSTROUTING (policy ACCEPT)


target prot opt source destination
SNAT all -- 10.0.0.0/8 anywhere to: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 .

Configuration pour faire du NAT-destination :

La translation de l'adresse destination consiste à attribuer aux connexions entrantes provenant du


réseau IP "officiel" une adresse IP "privée" et à rediriger l'appel sur le réseau interne.

Exemple : on veut rediriger tous les appels entrants, quelque soit le port, vers une machine unique
du réseau interne (10.10.10.1)

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

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

Si on visualise le contenu de la table nat


LINUX# iptables -t nat L

Chain PREROUTING (policy ACCEPT)


target prot opt source destination
DNAT all -- anywhere 195.220.162.0/24 to:10.10.10.1

Chain POSTROUTING (policy ACCEPT)


target prot opt source destination

Chain OUTPUT (policy ACCEPT)


target prot opt source destination

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.

Configuration de base pour faire du masquage:

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

Si on visualise le contenu de la table nat

Linux># iptables -L -t nat


Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)


target prot opt source destination
SNAT all -- 10.0.0.0/8 anywhere to:164.81.3.63

Chain OUTPUT (policy ACCEPT)


target prot opt source destination

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) .

La commande équivalente au SNAT ci-dessus est :


# Destination MASQUERADE Rules
/sbin/iptables -t nat -F POSTROUTING
/sbin/iptables -t nat -A POSTROUTING -s 10.10.10.0/8 -j MASQUERADE

routage/filtrage/sécurité 17
Petite étude de cas :

Vous voulez partager un accès dial sur votre réseau.


#ifconfig
eth0 Lien encap:Ethernet HWaddr 00:80:C8:7A:0A:D8
inet adr:192.168.90.1 Bcast:192.168.90.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.90.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

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.

Ajouter une nouvelle règle à une chaîne : iptables -A

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

Supprimer les règles d'une chaîne

$>iptables -F nom_de_votre_chaîne
Attention! Si vous ne spécifiez aucune chaîne, toutes les chaînes seront vidées.

Effacer une chaîne

$>iptables -X ma_chaîne

Éditer les chaînes et leur contenu

$>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)

Remettre les compteurs à zéro


Comme nous avons pu le voir dans les exemples précédents, vous avez la possibilité de relever le
nombre de paquets et d'octets (bytes) que cela représente. Ceci peut par exemple être utile dans le
cadre de la métrologie.

$>iptables -L -v -n -Z

Les polices de sécurité de chaînes

Refuser tout ce qui provient de l'hôte local en entrée.


$>iptables -A INPUT -s 127.0.0.1 -j DROP

Utiliser le complément avec !


$>iptables -A INPUT -s ! 127.0.0.1 -j DROP

routage/filtrage/sécurité 19
Mentionner un protocole avec -p
$>iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

Mentionner les flags --tcp_flags


$>iptables -A INPUT -p tcp --tcp-flags ALL -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)

Mentionner les ports avec --sport, --source-port, --dport, --destination-port


$>iptables -A INPUT -j ACCEPT -s 127.0.0.1 -p tcp --sport 20:2000

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:

Traiter le paquet avec –jump, ou -j


Spécifie ce que vous désirez faire du paquet. La cible peut être une sous-chaîne que vous aurez
vous-même créé ou alors une valeur spéciale. Celle-ci peut prendre la forme de ACCEPT, DROP,
QUEUE ou RETURN.

ACCEPT autorise le paquet à continuer son chemin.


DROP n'autorise pas le paquet à continuer son chemin.
QUEUE permet de passer le paquet à une application, si jamais aucune application n'attend après le
paquet, il est rejeté.
RETURN se comporte différement selon son emplacement. S'il est dans une chaîne que vous avez
construite, le paquet est renvoyé à la chaîne forgée d'où il vient. S'il se trouve déjà dans une chaîne
forgée, c'est la police de cette même chaîne qui décide du sort du paquet.

Spécifier une interface avec -i, --in-interface ou -o, --out-interface


Spécification des interfaces sur lesquelles les paquets arrivent ou partent.

$>iptables -A INPUT -i eth0


$>iptables -A INPUT -i lo

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

Certains sont traduits en français : on en trouvera la liste sur


http://www.freenix.org/unix/linux/HOWTO/Liste-des-HOWTO.html
http://www.boingworld.com/workshops/linux/iptables-tutorial/iptables-tutorial/ ( site du tutoriel)
http://www.freshmeat.net/ : pour rechercher les projets lies à iptables/netfilter et firewalls
http://www.linuxguruz.org/iptables/ plein d'infos sur iptables ( et linux en général)
http://www.netfilter.org/ ( site officiel netfilter)
http://www.fwbuilder.org/ ( site officiel fwbuilder)

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

Interdire tous les paquets de A.0 vers B.0.0

Interdire tous les paquets de A.0 vers B.0.1

Interdire tous les paquets NetBIOS entrant sur A.254

Masquer toutes les adresses de A.0 pour tous les protocoles

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é

Routage et filtrage à l’aide de netfilter


Vous allez réaliser ce TP sur la maquette que vous avez monté pour le routage.
Vous utiliserez trois machines C, R et S. R fait référence à votre routeur. C fait référence au client
installé sur le réseau de classe B, S fait référence au serveur installé sur le réseau de classe A.
C est sur un réseau « privé » (C sera client pour les tests)
S est sur un réseau « public »
R servira de routeur et pare feu (firewall) entre votre réseau privé et le réseau public.
Vous allez réaliser ce TP en trois parties :
Première partie : vérification du routage sur le routeur logiciel R,
Deuxième partie : mise en oeuvre de règles de filtrage simple et de la translation d’adresse sur R
Troisième partie : mise en place de règle de filtrages par adresse, par port et par protocole.

Vous utiliserez la documentation de netfilter et les exemples commentés qui vous sont fournis.

Première partie : installation du routage :


Installation et configuration:
1 - Installez les interfaces réseau sur le routeur et démarrez la machine.
2 - Créez les fichiers de configuration des interfaces eth0, eth1 et eth2 en vous aidant des fichiers
suivants :
Les descripteurs des interfaces sont dans le répertoire /etc/sysconfig/network-scripts.

/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

Aidez vous de ces deux fichiers de configuration pour la troisième interface.

3 - Installez le module de la carte dans le fichier « /etc/module.conf » si nécessaire

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=

Vous pouvez également utiliser la commande « echo 1 > /proc/sys/net/ipv4/ip_forward » pour le


faire passer à VRAI ».
Relancez le service réseau, relever les routes de R à l’aide de la commande « route »

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

Annexe : Schéma complet de la maquette


Chaque groupe de TP dispose de 3 machines, dont un routeur et travaille sur 3 segments réseau
(Classe A, Classe B et Classe C)

routage/filtrage/sécurité 25