INSIA SRT 2 IPTABLES
Netfilter ● Netfilter : module qui fournit à Linux les fonctions de – pare-feu – de traduction d'adresse – et d'historisation du trafic réseau ● Netfilter fonctionne en mode noyau. Il intercepte et manipule les paquets IP avant et après le routage. ● iptables est en fait la commande qui permet à un administrateur de configurer Netfilter en espace utilisateur. – souvent utilisé pour parler de toute l'infrastructure Netfilter ● intégré à Linux à partir de la version 2.4
Fonctionnement général ● Installation par netfilter d'accroche (hooks) à divers endroits du passage d'un paquet entre : – la réception par l'interface réseau – et la délivrance au processus de couche supérieure ou le routage vers une autre interface ● Des chaînes sont mises en places par le hook pour traiter les paquets ● Associées à la nature du traitement (filtre, nat, etc.) : les tables ● Les chaînes contiennent des règles qui sont examinées les unes après les autres pour chaque paquet accroché à un endroit précis – Un ou plusieurs critères : adresse source, protocole, etc – une action associée : rejet, autorisation, archivage, etc.
Tables ● trois tables principales, mais des modules d'extension peuvent en créer de nouvelles. ● Chaque table contient des chaînes prédéfinies à travers lesquelles les paquets vont passer. ● On peut rediriger les paquets vers des chaînes personnelles qui se trouvent dans un espace « privé ». ● Au départ, toutes les chaînes sont vides et leur politique par défaut est d'accepter les paquets. ● Pour comprendre netfilter, il est plus simple de prendre chaque table indépendamment
Table filter ● La table filter est responsable du filtrage des paquets. Son utilisation principale est de jeter (DROP) ou de laisser passer (ACCEPT) les paquets. La table fournit : – une chaîne INPUT pour filtrer les paquets à destination du système, – une chaîne OUTPUT pour filtrer les paquets émis par les processus du système, – et une chaîne FORWARD pour filtrer les paquets que le système doit transmettre.
Table nat ● translation d'adresses et de ports – Seul le premier paquet de chaque connexion passe à travers cette table. Les règles déterminent comment seront modifiés tous les paquets relatifs à cette connexion. ● La chaîne PREROUTING traite les paquets arrivant de l'extérieur avant qu'ils ne soient routés. Elle permet de modifier la destination de la connexion (DNAT). ● La chaîne POSTROUTING traite les paquets après la décision de routage, juste avant que le paquet soit expédié. Elle permet la modification de la source de la connexion (SNAT). On peut ainsi camoufler la véritable origine d'une connexion. ● La chaîne OUTPUT fonctionne comme la chaîne PREROUTING mais pour les connexions issues d'un processus du système.
Table mangle ● transformation des options des paquets comme par exemple la qualité de service. Tous les paquets passent à travers cette table dans une ou plusieurs chaînes ● Ils passent : – dans la chaîne PREROUTING juste avant le routage s'ils proviennent d'une interface réseau ; – dans la chaîne INPUT s'ils sont destinés à une adresse du système ; – dans la chaîne OUTPUT s'ils ont été émis par un processus du système ; – dans la chaîne FORWARD s'ils proviennent d'une interface réseau et qu'ils sont destinés à une autre interface réseau ; – et dans la chaîne POSTROUTING après le routage, juste avant d'être expédiés.
Syntaxe ● Forme longue et forme courte pour la syntaxe ● iptables --flush INPUT ● iptables -F INPUT ● iptables --policy FORWARD DROP ● ou ● iptables -P FORWARD DROP ● Dans la suite, on utilisera le plus souvent la forme courte.
Filtre ● Pas comme un Firewall classique ● Chaîne INPUT, OUTPUT, FORWARD ● Séléctionné par défaut lors de la configuration ● Pas besoin de le préciser : ● iptables -L ● Pour les autres tables, il faut préciser avec -t ● iptables -t nat -L
Filtre : configuration simple ● Dans la table Filtre, chaîne INPUT, ajout d'une règle : ● iptables -A INPUT critères -j TARGET (action) ● Les règles sont examinées dans l'ordre pour chaque paquet. en fonction de votre politique de sécurité, faire attention à l'ordre ● insérer une règle : ● iptables -I INPUT 3 critères -j TARGET ● supprimer une règle : ● iptables -I INPUT 3 critères -j TARGET ● Supprimer toutes les règles de la chaîne INPUT : ● iptables -F INPUT ● Lister : ● iptables -L ou iptables -L INPUT
Filtre : configuration simple ● Plusieurs critères de base possibles : ● -p, --protocol [!] protocole ● -s, --source [!] addresse[/masque] ● -d, --destination [!] addresse[/masque] ● -i, --in-interface [!] [nom] ● -o, --out-interface [!] [nom]
Filtre : configuration simple ● Pour un ensemble de critère sur une règle, plusieurs actions possibles : ● -j ACTION – DROP / REJECT (plusieurs types de REJECT) – ou ACCEPT ● iptables -A FORWARD -i eth0 -s o eth1 -p tcp -j ACCEPT
Filtre : politique par défaut ● Que faire des paquets qui sont examinés, mais ne correspondent à aucune règle ? ● Politique par défaut pour la châine : – TOUT AUTORISER – ou TOUT INTERDIRE ● iptables -P OUTPUT DROP ● ou ● iptables -P OUTPUT ACCEPT ● Pas de politique REJECT
Configuration avancée : tcp ● -p tcp doit être spécifié ● --source-port [!] [port[:port]] ● --destination-port [!] [port[:port]] ● --tcp-flags [!] masque comp ● premier argument : drapeaux qui doivent être examinés ● deuxième argument : drapeaux qui doivent être positionnés ● Les drapeaux sont : SYN ACK FIN RST URG PSH ALL NONE. ● iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN ● ne sélectionnera que les paquets avec le drapeau SYN positionné, et les drapeaux ACK, FIN et RST non positionnés.
Configuration avancée : tcp ● [!] --syn ● Ne sélectionne que les paquets TCP dont le bit SYN est positionné et dont les bits ACK et FIN ne sont pas positionnés. De tels paquets sont utilisés pour les requêtes d'initiation de connexion TCP; par exemple si l'on bloque ce type de paquets entrants sur une interface, cela bloquera les connexions TCP entrantes, mais les connexions TCP sortantes ne seront pas affectées. Cela est équivalent à --tcp-flags SYN,RST,ACK SYN. Si le signe "!" précède le "--syn", le sens de l'option est inversé.
Configuration avancée : udp ● -p udp doit être spécifié ● --source-port [!] [port[:port]] ● --destination-port [!] [port[:port]]
Configuration avancée : icmp ● -p icmp doit être spécifié ● --icmp-type [!] nom_du_type_icmp ● Cela autorise la spécification d'un type ICMP, qui peut être un type ICMP numérique, ou l'un des noms de type ICMP fourni par la commande ● iptables -p icmp -h ● --mac-source [!] addresse ● Correspondance avec l'adresse MAC. Cela doit être de la forme XX:XX:XX:XX:XX:XX. Notez que cela a un sens seulement pour les paquets utilisant les chaînes PREROUTING, FORWARD ou INPUT et en provenance de cartes réseau Ethernet.
Chaînes utilisateurs ● Possibilité d'optimiser l'examen des flux – rediriger les flux d'un certain type vers une chaîne créée par l'utilisateur – dans cette chaîne, examen en détail du flux – Intérêt ? ● Création de la chaîne utilisateur : ● iptables -N tcppackets ● Redirection des flux vers cette chaîne à partir d'une chaîne publique : ● iptables -A INPUT 1 -p tcp -j tcppackets ● Possiblité de faire des chaînes qui se rapprochent d'un firewall conventionnel ● chaînes Internet-DMZ, DMZ-LAN, LAN-Internet par exemple
Modules supplémentaires ● Des modules permettent d'augmenter grandement les capacités de iptables ● Pour le connection tracking ● Pour du filtrage de données ● Pleins de modules créés par des tiers, disponibles sur le site de iptables ● Il faut activer le module pour avoir accès à ses options : ● -m nom_module -options
Connection tracking ● Permet de suivre des connexions déjà établies : stateful ● -m state --state états ● liste des états de connexions que l'on veut détecter : – INVALID : paquet associé avec aucune connexion connue – ESTABLISHED : paquet associé avec une connexion qui a vu passer des paquets dans les deux sens – NEW : paquet a initié une nouvelle connexion, ou sinon qu'il est associé avec une connexion qui n'a pas vu passer de paquets dans les deux sens – RELATED : paquet initie une nouvelle connexion, mais qu'il est associé avec une connexion existante, comme un transfert de données FTP, ou une erreur ICMP.
Logs ● Autre cible que ACCEPT, REJECT, DROP ou userchain ● -j LOG : enregistrer des paquets via syslog ● Dans la facilité kern ● --log-level priorité ● --log-prefix préfixe ● Rajouter un préfixe au log, 29 caractères max ● --log-tcp-sequence ● Journalise le numéros de séquence TCP. Ceci peut être un risque pour la sécurité si les fichiers de log sont lisibles par les utilisateurs ordinaires. ● --log-tcp-options : Option de journalisation de l'en-tête TCP ● --log-ip-options : Option de journalisation de l'en-tête IP
Logs ● les paquets traversants logs ne s'arrêtent pas là, ils continuent d'être examinés ● si l'on veut loggués des paquets droppés par exemple ● d'abord mettre la règle avec target LOG ● ensuite la même règle avec target DROP ● En général, on positionne au moins log en dernier lieu pour logguer tous les paquets qui n'ont pas matché les règles, avant l'arrivée à la politique par défaut.
Limitation de charge ● Module limit : laisser passer les paquets correspondants à un débit limité, en utilisant un filtre à jetons (token bucket filter) – souvent utilisé conjointement avec la cible LOG pour limiter la taille des logs. Une règle utilisant cette extension laissera passer les paquets correspondants jusqu'à ce que cette limite soit atteinte (à moins que le drapeau `!' soit utilisé ). ● --limit taux ● Taux maximum de correspondance : spécifié par un nombre, avec un suffixe optionnel `/second', `/minute', `/hour', ou `/day' ; la valeur par défaut est 3/hour. ● --limit-burst nombre ● Le nombre initial maximum de paquets correspondants : ce nombre est incrémenté de 1 chaque fois que la limite spécifié ci dessus n'est pas atteinte, jusqu'à ce que ce nombre soit atteint; la valeur par défaut est 5.
Limitation de charge (suite) ● iptables -A FORWARD -m limit -j LOG ● avec limit rate par defaut : 3/hour. ● avec limit burst number par default : 5 ● Première fois que cette règle est atteindre, 5 premiers loggués ● Le limit burst tombe à 0 ● Rechargé de 1 toutes les 20 minutes si pas de nouveau paquet. paquets : – il faudra donc attendre 20 minutes pour qu'un nouveau paquet soit enregistré ● Si, au bout de 1 heure, aucun paquet n'atteint la règle, le burst est rechargé à son full : retour au départ
Lister les chaînes ● iptables -L -v -n ● -L : lister ● -v : sortie verbeuse, tous les détails sont là ● -n : pas de résolution DNS inverse (numérique) ● iptables -Z -L – Met les compteurs à zéro avant le listage des règles
Translation d'adresse : table nat ● Accessible avec -t nat ● Plusieurs types ● La chaîne PREROUTING traite les paquets arrivant de l'extérieur avant qu'ils ne soient routés. Elle permet de modifier la destination de la connexion (DNAT). ● La chaîne POSTROUTING traite les paquets après la décision de routage, juste avant que le paquet soit expédié. Elle permet la modification de la source de la connexion (SNAT). On peut ainsi camoufler la véritable origine d'une connexion. ● La chaîne OUTPUT fonctionne comme la chaîne PREROUTING mais pour les connexions issues d'un processus du système.
Source nat : nat statique ● Dans chaîne POSTROUTNG, juste avant envoi des paquets ● ## Changer l'adresse source en ● # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ● ## Changer l'adresse source en , ou ● # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ● ## Changer l'adresse source en , port ● # iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to :1-1023
Source nat : masquerading ● Camouflage d'adresse : les paquets provenant d'une interface prennent l'adresse IP de l'interface de sortie ● ## Camoufler tout ce qui sort par eth0 ● # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ● Ici, on ne précise pas d'interface entrante = toutes les interfaces autres que eth0 seront natées ● Plutôt utilisé dans la plupart des cas, pour interfaces avec adresses IP dynamique
Destination NAT ● ## Changer l'adresse de destination en ● # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to ● ## Changer l'adresse de destination en , ou ● # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to ● ## Changer l'adresse de destination du trafic web en , port 8080 ● # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \ ● -j DNAT --to :8080
Redirection (port forwarding) ● ## Envoyer le trafic web entrant du port-80 vers notre mandataire (transparent) Squid ● # iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \ ● -j REDIRECT --to-port 3128
Forwarding ● Attention : pour toute opération de transit des paquets à travers la machine, il est impératif d'activer le ip forwarding ● echo 1 > /proc/sys/net/ipv4/ip_forward ● NETWORKING=yes dans /etc/sysconfig/network pour Mandrake ● ip_forward=yes dans /etc/network/options pour Debian