WIP
Un grand merci au TP filtrage de la P1 Expérimentation IP (prenez ça en 2A c'est trop bien).
Pour toute plainte, envoyez moi un mail.
Voici le schéma de l'infrastructure :
Connectez-vous en graphique sur l'interface Proxmox de Rosetta.
Vérifiez que les 3 machines f-iptables-box, f-iptables-pc-lan et f-iptables-pc-guest sont dans l'état base.
ssh naina@192.168.103.137 #naina
ssh root@192.168.103.138 #pc_lan
ssh root@192.168.103.139 #pc_guest
iptables -t filter -L -v
Et... ça ne va pas marcher, tous les astres sont alignés pourtant :
sysctl -w net.ipv4.ip_forward=1 #pour activer
sysctl -p #pour appliquer les modifs
Vérifiez que les ordis se ping à présent.
Pouvez-vous ping 8.8.8.8 depuis la box ? Depuis pc_guest et pc_lan ? Pourquoi ?
Ça marche sans soucis depuis la box, car elle a une IP publique !
Et... ça ne va pas marcher, depuis pc_guest et pc_lan. Les deux machines ont des IP privées, et on ne peut communiquer sur Internet avec une IP privée. Le système dont on a besoin est donc un NAT !
iptables -t nat -L
iptables --table nat -A POSTROUTING -o ens21 -j MASQUERADE
iptables -t nat -L #vérifier que les modifs ont été appliquées
Filtrage d'adresses :
On souhaite maintenant mettre en place la politique suivante :
iptables --policy FORWARD DROP
Les machines du réseau LAN ont une adresse appartenant à 192.168.1.0/24.
iptables -t filter -A FORWARD -s 192.168.1.0/24 -j ACCEPT
Cependant cette règle permet également à une machine du réseau LAN d’envoyer un
paquet à une machine du réseau GUEST. Il faut donc empêcher ce type de trafic
explicitement. La règle que nous créons doit être positionnée avant la première afin de ne
pas être « cachée » par celle-ci.
iptables -t filter -I FORWARD 1 -s 192.168.1.0/24 -d 192.168.2.0/24 -j DROP
Les règles d'iptables sont lues dans l'ordre : donc si vous écrivez une règle qui accepte tous les paquets AVANT une règle qui refuse un paquet spécifique, le paquet spécifique ne sera jamais refusé !
Et inversement, si vous écrivez une règle qui refuse tous les paquets avant une règle qui accepte un paquet spécifique, ça ne passera pas.
Il faut faire attention à l'ordre utilisé !
Maintenant que vous voyez le concept, on passe à la suite :
Les règles écrites jusqu’à maintenant ne permettent que la circulation des paquets dans un sens.
En ce qui concerne le trafic à destination de la box ou produit par la box, ce trafic sera traité
par les chaines INPUT et OUTPUT.
Afin de permettre le contrôle du trafic émis et reçu par les VMs, celles-ci sont munies d’un
outil de capture de trafic appelé tcpdump. Celui-ci affiche au format texte une ligne de
description pour chaque trame reçue:
tcpdump not port 80
L’option not port 80 permet d’éliminer à l’affichage les paquets IP dont le port (source ou
destination) au niveau transport est 80.
iptables -t filter -I FORWARD 1 -s 192.168.2.0/24 -d 192.168.1.0/24 -j DROP
permet d’interdire GUEST de communiquer avec LAN.
Le -I permet de spécifier que l’on veut insérer la commande à un certain endroit, et pas simplement à la suite des autres règles déjà existantes, ici donc dans la chaîne FORWARD à la ligne 1. Le -s permet de préciser le réseau source (le réseau GUEST ici) et le -d précise le réseau de destination (réseau LAN ici), et le -j permet de préciser le traitement à appliquer au paquet, ici DROP, donc à savoir l’interdiction totale.
La commande :
iptables -t filter -A FORWARD -s 192.168.2.0/24 -j ACCEPT
permet d’autoriser explicitement le trafic de GUEST de transiter par la box. Le -A est utilisé pour ajouter la règle sans souci de l’ordre.
Les règles pour le trafic retour sont les règles à proposer pour pouvoir autoriser le trafic à transiter de l’extérieur de la box vers les réseaux concernés. Les deux commandes sont les suivantes :
iptables -t filter -A FORWARD -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.2.0/24 -j ACCEPT
Pour empêcher les machines du réseau GUEST de communiquer avec la box de
manière directe, il faut qu’aucun INPUT en provenance du réseau GUEST ne soit autorisé,
et qu’aucun OUTPUT à destination du réseau GUEST ne soit autorisé. Ceci se matérialise
par les règles suivantes :
iptables -t filter -A INPUT -s 192.168.2.0/24 -j DROP
iptables -t filter -A OUTPUT -d 192.168.2.0/24 -j DROP
Le test utilisé pour vérifier le bon fonctionnement des règles définies est un ping depuis
la box en direction des réseaux GUEST et LAN, pour vérifier respectivement que le trafic ne
passe pas et qu’il passe, un ping depuis GUEST ou LAN pour vérifier que rien ne se passe,
et un ping depuis GUEST vers l’extérieur pour vérifier que les paquets sont autorisés à
circuler dans les deux sens.
Lutte contre l'usurpation d'adresses
tcpdump not port 80
ip a del ?
ip a add 192.168.1.X/24 dev interface
ping 192.168.2.1
Observez les paquets reçus par PC_LAN.
Afin d’éviter ce problème, modifiez maintenant la configuration de la box de telle sorte que les machines des réseaux internes ne puissent pas émettre des paquets avec une adresse source autre que celle du réseau dans lequel elles se trouvent.
Donnez les règles proposées.
Donnez des exemples de tests permettant de vérifier que ces règles fonctionnent.
Ptet explication
Les règles définies précédemment ne fonctionnent pas totalement car on bloque uniquement des adresses IP, et non pas des interfaces.
Si on choisit de se mettre une ip en statique appartenant au réseau LAN sur le PC_GUEST, et que l’on tente de ping le réseau LAN, le ping passe.
iptables -t filter -I FORWARD 1 -i interface_guest -o interface_lan -j DROP
iptables -t filter -I FORWARD 1 -i interface_lan -o interface_guest -j DROP
iptables -t filter -A INPUT -i interface_guest -j DROP
iptables -t filter -A OUTPUT -o interface_guest -j DROP
Le test utilisé pour vérifier le bon fonctionnement des règles définies est un ping depuis
la box en direction des réseaux GUEST et LAN, pour vérifier respectivement que le trafic ne
passe pas et qu’il passe, un ping depuis GUEST ou LAN pour vérifier que rien ne se passe,
et un ping depuis GUEST vers l’extérieur pour vérifier que les paquets sont autorisés à
circuler dans les deux sens.
Filtrage des ports :
Modifiez les listes de contrôle d’accès de telle sorte que:
Donnez les listes créées pour rendre ce service.
Donnez des exemples de tests permettant de vérifier que les règles fonctionnent. Pour vos tests vous pourrez utiliser curl et le client en ligne de commande ftp (name : ftp, password : ftp)
Supprimez les règles que vous avez créées.
Le filtrage en fonction du numéro de port permet de filtrer des applications spécifiques, du fait qu'elles utilisent des ports spécifiques pour communiquer.
En supposant que 15) Pourriez-vous utiliser des règles de filtrage similaires si les deux équipements avaient été dans le réseau LAN. Comment/Pourquoi ?le trafic se fait uniquement à l'aide du protocole TCP :
Pour le serveur HTTP :
iptables -t filter -I FORWARD 1 -p tcp -m tcp --dport 80 -i interface_guest -o interface_lan -j ACCEPT
iptables -t filter -I FORWARD 1 -p tcp -m tcp --sport 80 -i interface_lan -o interface_guest -j ACCEPT
Pour le serveur FTP :
Règles pour la première connexion :
iptables -t filter -I FORWARD 1 -p tcp -m tcp --dport 21 -i interface_lan -o interface_guest -j ACCEPT
iptables -t filter -I FORWARD 1 -p tcp -m tcp --sport 21 -i interface_lan -o interface_guest -j ACCEPT
Règles pour la seconde connexion :
iptables -t filter -I FORWARD 1 -p tcp -m tcp --dport 1024:65535 -i interface_lan -o interface_guest -j ACCEPT
iptables -t filter -I FORWARD 1 -p tcp -m tcp --sport 1024:65535 -i interface_lan -o interface_guest -j ACCEPT
Depuis PC_GUEST, installer curl et lancer curl http://ip_lan:80
Depuis PC_LAN, se connecter en ftp
[Nouvelle machine]
Le filtrage à état se fait sous Linux au moyen d’une extension appelée conntrack. L’accès à cette extension se fait comme l’accès à toute extension par l’option –m.
La figure ci-dessous montre le positionnement des fonctions de maintient d’état (« STF filter »). Ces fonctions ne nécessitent pas d’opérations particulières pour être activées dès le moment ou l’extension est incluse dans le noyau Linux. Elles ne sont généralement pas configurées par l’administrateur mais sont définies par leur concepteur. La présence de l’extension peut être vérifiée en tapant :
lsmod | grep conntrack
Il existe des outils permettant de gérer les états mais ceux-ci ne sont pas installés par défaut
dans OpenWRT. En l’absence de ceux-ci il est possible d’afficher les états maintenus à un
instant donné au travers du système de fichier /proc :
cat /proc/net/nf_conntrack
…
ipv4 2 tcp 6 7439 ESTABLISHED src=157.159.100.54 dst=157.159.100.219 sport=29826 dport=22
packets=10295 bytes=880581 src=157.159.100.219 dst=157.159.100.54 sport=22 dport=29826 packets=10777
bytes=1346262 [ASSURED] mark=0 use=2
…
Chaque ligne indique :
Du fait du positionnement des fonctions de maintien d’état sur le chemin suivi par les
paquets (avant les fonctions de filtrage), l’utilisation de conntrack permet d’utiliser des
conditions se basant sur l’état des communications dans les règles de filtrage. Par exemple :
iptables –A INPUT -t filter –p tcp -m conntrack --ctstate NEW –j ACCEPT
Autorise (–j ACCEPT) le premier paquet (--ctstate NEW) d’une connexion TCP, c'est-à-dire le fait
que ce paquet ait provoqué la création de l’état.
Les conditions portant sur les états sont exprimées au travers de l’option –ctstate. Ces états
sont principalement :
Le module conntrack supporte d’autres options comme:
Utilisation des états :
On désire autoriser les communications initiées du réseau LAN vers le réseau GUEST mais
interdire les communications initiées dans l’autre sens. Tout autre trafic doit être interdit.
iptables -I FORWARD -i eth0 -o eth1 -p tcp -m conntrack –ctstate NEW -j ACCEPT
iptables -I FORWARD -i eth1 -o eth0 -p tcp -m conntrack –ctstate NEW -j DROP
À partir de PC LAN, ouvrez un navigateur vers le serveur web sur PC GUEST.
Sur PC GUEST et PC LAN lancez la commande
tcpdump –i interface_pertinente -n
Depuis un terminal, tentez ensuite de faire un ftp de PC LAN vers PC GUEST. Une fois
connectés (name : ftp, password : ftp), récupérez la liste des fichiers. Analysez les traces sur
les deux équipements.
3) Pourquoi le ftp ne fonctionne pas ? Modifiez la configuration de filtrage afin que ftp fonctionne correctement.
Donnez les listes crées pour rendre ce service. Modifiez maintenant la configuration de filtrage afin que les paquets non conformes soient bloqués explicitement, qu’un paquet d’indication d’erreur (ICMP) soit renvoyé à l’émetteur et qu’un log soit conservé.
Donnez les listes créées pour rendre ce service.
Sur PC LAN lancez la commande
tc@box:~$ sudo tcpdump –i eth0 -n
Puis dans un terminal ouvrez un client ftp sur PC LAN et connectez vous sur le serveur ftp
de PC GUEST. En utilisant tcpdump (ou netstat), notez le numéro de port source YYY du
client sur PC LAN. Sur PC GUEST lancez la commande où XXX est l’adresse IP de PC LAN
tc@box:~$ sudo nping –-tcp -p YYY –g 21 –flags SYN XXX
Les paquets générés ont-t-ils atteint PC LAN ? Pourquoi ?