TP Linux : Firewall

Transcription

TP Linux : Firewall
TP Linux : Firewall
Objectif : Réaliser un firewall simple par filtrage de paquet avec iptables sous Linux
Matériel : 1 serveur Linux S configuré en routeur entre le réseau du lycée qui représentera le réseau public et un réseau de classe C qui représentera le réseau privé, un client C1 sur le réseau de classe C relié par un cable croisé au routeur linux. Un client C2 connecté sur le réseau du lycée, qui représentera un accès extérieur
Conditions de réalisation : travail en binôme.
Avant de commencer le TP, voici quelques éléments pour comprendre le fonctionnement du parefeu Netfilter, suivi d'un tutoriel (page 5) sur la commande Iptables qui permet de configurer le parefeu, illustré d'un exemple de configuration (page Fonctionnement du parefeu Netfilter
I Qu’est ce qu'un firewall ?
Un firewall ou pare­feu est un dispositif permettant de filtrer et masquer le trafic TCP/IP entre un réseau public (internet par exemple) et un réseau privé (le réseau local). Il protège le réseau contre les attaques et infiltrations venant d’éventuels pirates. 1. 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
a) La translation d'adresses ( NAT : Network Address Translation)
Le routeur, depuis le réseau externe, répond à plusieurs adresses IP publiques 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). Le routeur modifie chaque paquet IP pour remplacer l'adresse interne par l'adresse externe en sortie, et inversement en entrée.
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
b) Le masquage d'adresses IP ( IP masquerade ) ou translation de port (PAT):
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 à internet d'un réseau de classe C privé 192.168.100/24 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.
2. 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 autoriser en sortie tout le trafic Web et ftp et interdire 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, etc. 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.
II Filtrage et masquage avec netfilter sous Linux Linux peut intègrer de base (selon les options d'installation), les fonctions de routage, de filtrage et de masquage. Il s'agit du duo netfilter/iptables dans les noyaux supérieurs ou égaux à 2.4.x
TP : filtrage de paquets avec iptables
Page 1 /10
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. Les règles sont évaluées dans l'ordre ou elle ont été écrites. Dès qu'un règle est applicable elle est appliquée et le paquet sort de la chaîne. Netfilter permet de faire de la translation d'adresses et du masquage (translation de ports). iptables est l'outil (la commande du sytème) qui permet d'écrire les règles. 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 (que nous n'étudierons pas ici)
1. Le filtrage : table filter
Dans la table filter, trois chaînes sont prédéfinies : FORWARD qui contient les règles à appliquer aux paquets qui traversent le parefeu (paquets routés)
INPUT qui contient les règles à appliquer aux paquets entrant sur le parefeu destinés aux processus locaux OUTPUT qui contient les règles à appliquer aux paquets émis par les processus locaux, sortant du routeur.
IN
FORWARD
routage
INPUT
Processus local
OUT
OUTPUT
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. L’outil iptables sous Linux permet de contrôler le trafic TCP/IP qui traverse le routeur. Il assure le filtrage des paquets TCP/IP en fonction des adresses IP sources et destination, du protocole de transport (TCP/UDP/ICMP) et du protocole applicatif (ports sources et destination). C'est un firewall « stateful » c'est­à­dire qu'il permet de filtrer les paquets en fonction de l'état de la connexion TCP associée. Par exemple, on peut décider d'autoriser l'entrée des paquets correspondant à une connexion déjà établie en refusant tous les paquets correspondant à l'établissement d'un nouvelle connexion. Pour cela, le firewall garde en mémoire l'état de chaque connexion TCP qui le traverse.
2. La translation d'adresse : table NAT
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). TP : filtrage de paquets avec iptables
Page 2 /10
Dans la chaîne POSTROUTING on ne peut que modifier l'adresse source du paquet (cible SNAT). C'est cette chaîne qui servira à faire le masquage IP (translation de port)
Liens
page officielle : http://www.netfilter.org/
Léa linux :http://lea­linux.org/reseau/iptables.php3
http://www.hsc.fr/ressources/presentations/netfilter/netfilter.htm
TP : filtrage de paquets avec iptables
Page 3 /10
Iptables : tutoriel (extrait simplifié)
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_la_chaine] [-t nom_de_la table]
Attention! Si vous ne spécifiez aucun nom de table , seule la table filter sera vidée
suppression de toutes les règles de la table nat:
iptables -F -t nat
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, .
ACCEPT autorise le paquet à continuer son chemin, DROP supprime la paquet. REJECT refuse le paquet mais en avertissant le demandeur que sa demande de connexion lui a été refusée en lui envoyant un message ICMP port­unreachable.
On laisse passer tous les paquets sortants:
iptables -A OUTPUT -j ACCEPT
Spécifier une politique par défaut pour les chaines de la table filter
C'est l'action qui sera appliquée si aucune règle ne s'applique au paquet.
Par défaut un paquet entrant est refusé:
iptables -P INPUT DROP
Spécifier une adresse source ou destination
Refuser tout ce qui provient de l'hôte 195.52.4.1:
iptables -A INPUT -s
195.52.4.1 -j DROP
Laisser passer tout ce qui est destiné au réseau 192.168.0.0:
iptables -A OUTPUT -d
192.168.0.0/16 -j ACCEPT
Mentionner un protocole avec -p
Refuser les entrées des paquets du protocole ICMP (ping entre autres):
iptables -A INPUT
-p icmp -j DROP
Mentionner les ports avec --sport, --source-port, --dport, --destination-port
Laisser sortir les requêtes Web :
iptables -A OUTPUT
-j ACCEPT -p tcp --dport 80
Accepter les réponses web:
iptables -A INPUT -j ACCEPT -p tcp --sport 80
Spécifier une interface avec -i, --in-interface ou -o, --out-interface
iptables -A INPUT -i eth0 -o ppp0
iptables -A INPUT -i lo
Spécifiez l'état de la connexion à laquelle appartient le paquet.
Netfilter est un firewall « stateful » ce qui veut dire qu'il peut accepter ou refuser les paquet en fonction de 'état en cours des connexions. Netfilter garde en dans une table d'états, les connexions en cours. Cela permet d'associer que tel client (adresse IP cliente) vers tel serveur (adresse IP serveur) est en train de faire telle chose (connexion du port source x vers le port destination y). On pourra donc décider de spécifier les paquets correspondant à un connexion établie (ESTABLISHED), un nouvelle connexion (NEW) ou une nouvelle connexion associée à un connexion déjà établie (RELATED). C'est le cas par exemple des connexion de données FTP qui sont associée à une connexion de type commande pré­établie, ou des messages d'erreur icmp correspondant à un requête émise par le routeur.
Accepter les paquets correspondant à des connexion établies ou associées:
TP : filtrage de paquets avec iptables
Page 4 /10
iptables ­A INPUT ­m state ­­state RELATED,ESTABLISHED ­j ACCEPT
TP : filtrage de paquets avec iptables
Page 5 /10
Exemple d'un script de configuration de Netfilter :
Cas d'une connexion adsl ou cable partagée par un réseau local. Le routeur filtrant possède une interface externe (ppp0)
et une interface interne (eth0) :
#activation du routage
echo 1 > /proc/sys/net/ipv4/ip_forward
#chargement des modules nécessaires
/sbin/modprobe iptable_nat
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_state
/sbin/modprobe ipt_MASQUERADE
PATH=$PATH:/usr/local/sbin
#effacement des règles des tables
iptables -t nat -F
iptables -F
#potitiques
iptables -P
iptables -P
iptables -P
par défaut
FORWARD DROP
INPUT DROP
OUTPUT ACCEPT
#on accepte l'entrée de paquets sur l'interface localhost (indispensable sinon ca bloque)
iptables -A INPUT -i lo -j ACCEPT
#on accepte toute entrée sur eth0
iptables -A INPUT -i eth0 -j ACCEPT
#on n'accepte que l'entrée de paquet correspondant à des connexions établies ou des #connexions
relatives à des connexions établies (connexion de données ftp par exemple ou messages d'erreur
icmp)
iptables -A INPUT -i ppp0 -m state --state RELATED,ESTABLISHED
-j ACCEPT
#on route tous les paquets venant de eth0 (interface interne)
iptables -A FORWARD -i eth0 -j ACCEPT
#pour l' autre interface (externe) on ne route que les paquets correspondant à des #connexions
établies ou des #connexions relatives à des connexions établies
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#on active l'ip masquerade pour les adresses du réseau 10.0.0.0 sortant sur l'interface #externe
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o ppp0 -j MASQUERADE
TP : filtrage de paquets avec iptables
Page 6 /10
Travail à faire :
Avant de commencer :
Remarque sur l'accès internet du lycée. L'accès se fait par un firewall sous linux. Les adresses de la classe 172.20.200.0/21 sont masquées et peuvent sortir sur internet par translation de port. Par conséquent les adresses de la forme 192.168.N.X (réseau privé du TP) ne sortiront pas sur internet à moins d'être elles même masquée par votre routeur filtrant.
✔
Configurer le routeur filtrant (interface 1 sur le réseau du lycée (172.20.207.0/25), interface 2 connectée directement vers le client C1 (192.168.N.0/24), passerelle par défaut vers 172.20.207.126
✔
Configurer le client C1 (adresse IP sur le réseau 192.168.N.0, passerelle par défaut vers le routeur filtrant)
✔
Configurer le client C2 (adresse IP sur le réseau du lycée 172.20.205.0/21, passerelle par défaut vers le routeur filtrant)
✔
Configurer la résolution de nom DNS vers 172.20.200.2 (pour le routeur et les clients)
✔
Vérifiez le fonctionnement du réseau :
1. ping entre les différentes machines. 2. effectuez un telnet puis ssh vers le serveur depuis le client C2. 3. effectuez un accès ftp puis Web depuis C1 vers lcs.lyc­curie.ac­aix­marseille.fr/
4. effectuez un accès ftp puis web vers internet depuis S puis C2.
5. Vérifiez que C1 ne peut sortir sur internet (pas de routage retour).
✔ Installez iptraf (moniteur réseau sous linux) sur le routeur filtrant. Lancez le moniteur en tapant « iptraf » dans une console et choisissez « traffic monitor » puis « all interfaces » (analyse du trafic réseau sur toutes les interfaces réseau).
1. Création d'un fichier de script. Ce fichier sera créé par vi et appelé /etc/firewall.sh. Il contiendra l'ensemble des règles de notre firewall. Pour l'exécuter il faudra d'abord le rendre exécutable par la commande « chmod 700 /etc/firewall.sh » puis de taper /etc/firewall.sh, ce qui lancera l'interprétation des commandes du script.
Pour visualiser les règles créées par l'exécution du script:
iptables ­L (affiche les règles de la table filter)
iptables ­F ­t nat (affiche les règles de la table nat)
Commencer par spécifier le chargement des modules nécessaires (voir l'exemple page précédente) en ajoutant les lignes nécessaires dans /etc/firewall.sh
2. Initialisation des chaines Il faut d'abord effacer toutes les règles des tables nat et filter.
iptables -F -t filter
iptables -F -t nat
#on accepte l'entrée de paquets sur l'interface localhost (indispensable sinon ca bloque)
iptables ­A INPUT ­i lo ­j ACCEPT
3. Le « camouflage IP » (IP masquerade)
Ceci va permettre au client C1 de sortir sur le réseau public 172.20.200.0/21 en étant masqué
iptables ­t nat ­A POSTROUTING ­s <adrIP ou réseau à masquer> ­o <interface ext.> ­j MASQUERADE
Lancer une requête Web sur internet à partir de C1 et vérifier les connexion établie avec iptraf sur le serveur. Combien de connexions sont établies? Sur quelles interfaces?
4. Filtrage de paquet
TP : filtrage de paquets avec iptables
Page 7 /10
Pour qu'un firewall soit efficace, il faut le protéger contre certains problèmes de sécurité. C'est ce que nous allons faire maintenant. Pour cela, nous allons :
•
•
•
•
n'autoriser que les messages ICMP réponses sur l'interface externe, correspondant à une erreur sur une requête sortante. On ne répondra pas aux ping externe par exemple. Pour l'interface interne ou accepte tous les paquets ICMP.
n'autoriser que l'utilisation d'un DNS sûr (en l'occurrence 17.20.200.2). n’autoriser que les connexions entrantes tcp au service ssh venant de l'extérieur, interdire toute autre connexion tcp entrante
autoriser le routage des seules connexions HTTP, FTP, POP, SMTP vers l’extérieur. Chaque partie devra être testée avant et après filtrage en passant par le client C2 pour effectuer une connexion venant de l’extérieur et le client C1 pour une connexion venant du réseau local. politiques par défaut :
Les 3 chaînes intégrées de la table filter sont initialisée par défaut avec la politique ACCEPT. Ce qui veut dire qu'en l'absence de règles qui s'appliquent, un paquet est accepté.
Nous allons modifier ceci pour que par défaut un paquet soit refusé en entrée (INPUT), et en routage (FORWARD) et en sortie. Insérez les lignes suivantes en début de fichier après les chargement de modules (lignes modprobe).
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables ­P OUTPUT DROP
➢ Trafic ICMP
En sortie sur on utilise tout le trafic ICMP
iptables -A OUPUT -p ICMP ­j ACCEPT
En entrée sur l'interface interne (réseau local) on autorise tout le trafic ICMP.
iptables -A INPUT -i <interface interne> -p ICMP ­j ACCEPT
Pour l'entrée sur l'interface externe, on utilise la propriété « stateful » de netfilter, c'est à dire un module chargé au démarrage (ipt_state) qui permet de spécifier le caractère du paquet par rapport aux connexions en cours. Dans le cas d'ICMP, on n'acceptera en entrée sur l'interface externe que les messages réponses aux pings émis (echo­reply) et les messages d'erreur correspondant à un paquet envoyé. Ceci ce caractérise par l'état RELATED ou ESTABLISHED. iptables ­A INPUT ­p icmp ­i <interface externe> ­mstate ­­state RELATED,ESTABLISHED ­j ACCEPT
tester grâce à la commande ping vers les serveur S à partir du client C2 (qui représente le réseau public). Cette commande ne doit pas obtenir de réponse.
Par contre une commande ping émise depuis le réseau local (C1) vers le serveur doit obtenir une réponse. Nous allons maintenant autoriser le routage des commandes ICMP pour que le réseau local puisse envoyer des requêtes ICMP vers le réseau public externe et recevoir des réponses :
Pour le routage intérieur vers extérieur, on autorise tout le trafic ICMP :
iptables ­A FORWARD ­p icmp ­i <interface interne> ­o <interface externe> ­j ACCEPT
Pour le routage extérieur vers intérieur on n'autorise que les réponses:
iptables ­A FORWARD ­p icmp ­i <interface externe> ­o <interface interne> ­mstate ­­state RELATED,ESTABLISHED ­j ACCEPT
Tester en envoyant une commande ping du réseau local (C1) vers l'extérieur (C2). Vérifier que C2 ne peut pas « pinger » C1.
➢
trafic DNS
on laisse passer le trafic DNS du serveur S vers 172.20.200.2 en UDP :
iptables ­A OUTPUT ­p udp ­d 172.20.200.2 ­i <interface externe> ­­dport 53 ­j ACCEPT
iptables ­A INPUT ­p udp ­s 172.20.200.2 ­i <interface externe> ­­sport 53 ­j ACCEPT
On autorise le routage du trafic DNS du réseau local vers 172.20.200.2:
iptables ­A FORWARD ­p udp ­d 172.20.200.2 ­i <interface interne> ­o <interface externe> ­­dport 53 ­j ACCEPT
iptables ­A FORWARD ­p udp ­s 172.20.200.2 ­i <interface externe> ­o <interface interne> ­­sport 53 ­j ACCEPT
Faire la même chose pour tcp (pour le cas des messages dépassant les 512 octets)
TP : filtrage de paquets avec iptables
Page 8 /10
Tester grâce à la commande nslookup que le trafic DNS est autorisé vers 172.20.200.2 et interdit vers un autre serveur DNS nslookup ­ 172.20.200.2 www.google.com interroge le serveur dns 172.20.200.2 pour rechercher l'IP du nom www.google.com
➢
Autoriser ssh en provenance du réseau public vers la machine locale pour permettre l'administration distante
Autoriser les connexions ssh venant de toutes les interfaces :
iptables ­A INPUT ­p tcp ­­dport 22 ­j ACCEPT
Autoriser le trafic ssh sortant correspondant à des connexions établies :
iptables ­A OUTPUT ­p tcp ­­sport 22 ­mstate ­­state ESTABLISHED ­j ACCEPT Tester le ssh vers le routeur à partir du client C2 (réseau public) (utiliser le client « putty » à télécharger sur le net, après s'être assuré que la service sshd est lancé sur le serveur S.
➢
Autoriser le routage des connexions smtp, http et pop vers l'extérieur.
Exemple pour http :
iptables ­A FORWARD ­i <interface interne> ­o <interface externe> ­p tcp ­­dport 80 ­j ACCEPT
iptables ­A FORWARD ­i <interface externe> ­o <interface interne> ­p tcp ­­sport 80 ­mstate ­state ESTABLISHED ­j ACCEPT
Tester avec le navigateur, puis faire la même chose pour smtp et pop (ports tcp 25 et 110), et tester avec un client de messagerie comme outlook express.
➢
Autoriser le trafic ftp.
Pour les tests installez un client ftp sous windows comme wsftp lite, bulletproof ftp,...
Le protocole ftp fonctionne de deux manières différentes (port et passive). Dans les deux cas le client fait une première connexion vers le serveur sur le port 21, puis :
En méthode port, le client envoi au serveur une commande PORT contenant un numéro de port sur lequel le serveur va ouvrir une connexion tcp à partir du port source 20. Cette connexion est « RELATED » puisque qu'elle corespond à une connexion établie sur le port 21.
En méthode passive, le client envoie une commande PASV dans laquelle il sollicite un numéro de port sur lequel il pourra ouvrir une connexion. Après la réponse du serveur c’est donc dans ce cas le client qui initie la connexion tcp. Cette connexion est « RELATED » puisqu'elle correspond à une connexion ftp déjà établie sur le port 21.
La plupart des navigateurs travaillent en mode passif. La connexion en mode passif se fera sur un port non réservé (1024 à 65535). Le ftp sous dos travaille en mode PORT (actif).
Pour la connexion de contrôle sur le port 21 :
iptables ­A FORWARD ­i <interface interne> ­o <interface externe> ­p tcp ­­dport 21 ­j ACCEPT
iptables ­A FORWARD ­i <interface externe> ­o <interface interne> ­p tcp ­­sport 21 ­mstate ­state ESTABLISHED ­j ACCEPT
pour le mode passif :
iptables ­A FORWARD ­i <interface interne> ­o <interface externe> ­p tcp ­­sport 1024:65535 ­­dport 1024:65535 ­mstate ­state RELATED,ESTABLISHED ­j ACCEPT
iptables ­A FORWARD ­i <interface externe> ­o <interface interne> ­p tcp ­­sport 1024:65535 ­­dport 1024:65535 ­mstate ­state RELATED,ESTABLISHED ­j ACCEPT
Pour le mode actif :
iptables -A FORWARD
-i
1024:65535 -mstate -state
iptables -A FORWARD
-i
1024:65535 -mstate -state
<interface externe> -o <interface interne> -p tcp --sport 20 --dport
RELATED,ESTABLISHED -j ACCEPT
<interface interne> -o <interface externe> -p tcp --dport 20 --sport
RELATED,ESTABLISHED-j ACCEPT
Ecrire les commandes et tester avec une navigateur puis avec un client ftp (bulletproof à installer à partir du serveur curie2)
➢
Sauvegarde et restauration des règles :
Pour sauvegarder vos règles une fois que la configuration est établie et testée (vous pouvez choisir un autre nom de fichier pour sauvegarder plusieurs configurations différentes):
iptables­save > /etc/ipchains.rules
Pour restaurer les règles sauvegardées :
iptables­restore < /etc/ipchains.rules
TP : filtrage de paquets avec iptables
Page 9 /10
Pour automatiser le filtrage lors du démarrage du routeur, il faut lancer le script de création des règles /etc/firewall.sh au démarrage du système. Pour cela, éditez le fichier /etc/rc.local et ajouter la ligne suivante à la fin :
/etc/firewall.sh
TP : filtrage de paquets avec iptables
Page 10 /10

Documents pareils

Mise en place d`un firewall - Gipsa-lab

Mise en place d`un firewall - Gipsa-lab A présent, votre but est d'autoriser toutes les connexions sortantes sauf les connexions HTTP (sur le port 80) depuis votre réseau privé vers le réseau public (Internet). 1) Editez le fichier /etc/...

Plus en détail