Netfilter/Iptables Introduction
Présentation – 1 Netfilter est un module du noyau Linux qui assure les fonctionnalités suivantes : pare-feu traduction d'adresse (NAT) et de ports (PAT) historisation du traffic Netfilter fonctionne en mode noyau il récupère les paquets grâce à des hooks et peut les manipuler avant et après le routage Netfilter constitue un framework utilisé par de nombreux pare-feux
Présentation – 2 Iptables est la commande en espace utilisateur qui permet de paramétrer Netfilter on fait très souvent l'amalgame entre Netfilter et Iptables
Historique NetFilter/Iptables est intégré au noyau Linux depuis la version 2.4 (1998) Il est le successeur de ipchains
Caractéristiques -1 Netfilter est le pare-feu standard de Linux et est mis en oeuvre dans de nombreuse solutions commerciales. Netfilter est un pare-feu à états (stateful): il peut prendre des décisions de routage/filtrage en fonction de l'état d'une connexion TCP très flexible et modulaire il est très largement utilisé et dispose d'une abondante documentation.
Caractéristiques - 2 on trouve de nombreuses solutions permettant de simplifier son utilisation interfaces graphiques (Firestarter, Firebuilder, .... méta-langages (Firehol, ...) solutions intégrées Netfilter ne joue pas le rôle de proxy ni d'IDS sa configuration peut être complexe (plusieurs centaines de règles pour les cas complexes)
Principes Netfilter utilise des 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 du noyau 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).
Netfilter : le filtrage Netfilter peut filtrer sur Les adresses/blocs d'adresse IP Les ports source et/ou destination Les protocoles (TCP, UDP, ICMP) Les adresses MAC L'état éventuel de la connexion TCP
Les 3 tables FILTER : table par défaut, contient les chaines de règles de filtrage NAT : contient les règles de translation d'adresses /ports MANGLE : contient les règles de modification de paquets (peu utilisée)
La table FILTER 3 chaines prédéfinies : FORWARD : contient les règles à appliquer aux paquets qui traversent (routage) INPUT : contient les règles à appliquer aux paquets destinés aux processus locaux OUTPUT : contient les règles à appliquer aux paquets émis par les processus locaux
La table NAT permet d'effectuer toutes les translations d'adresses nécessaires. La chaîne PREROUTING. Permet de faire de la translation d'adresse de destination (DNAT). La chaîne POSTROUTING. permet de faire de la translation d'adresse de la source (SNAT), comme du masquage d'adresse (MASQUERADE). La chaîne OUTPUT. permet de modifier la destination de paquets générés localement (par la passerelle elle-même).
La table MANGLE permet de marquer l'en-tête des paquets (gestion de la QOS, ...)
Les chaînes 5 chaînes prédéfinies
Les cibles – 1 ACCEPT : Les paquets envoyés vers cette cible seront tout simplement acceptés et pourront poursuivre leur cheminement au travers des couches réseaux. DROP : Cette cible permet de jeter des paquets qui seront donc ignorés. REJECT : Permet d'envoyer une réponse à l'émetteur pour lui signaler que son paquet a été refusé. LOG : Demande au noyau d'enregistrer des informations sur le paquet courant. Cela se fera généralement dans le fichier /var/log/syslog (selon la configuration du programme syslogd).
Les cibles – 2 MASQUERADE : Cible valable uniquement dans la chaîne POSTROUTING de la table nat. Elle change l'adresse IP de l'émetteur par celle courante de la machine pour l'interface spécifiée. Cela permet de masquer des machines et de faire par exemple du partage de connexion. SNAT : Egalement valable pour la chaîne POSTROUTING de la table NAT seulement. Elle modifie aussi la valeur de l'adresse IP de l'émetteur en la remplaçant par la valeur fixe spécifiée. DNAT : Valable uniquement pour les chaînes PREROUTING et OUTPUT de la table nat. Elle modifie la valeur de l'adresse IP du destinataire en la remplaçant par la valeur fixe spécifiée.
Les cibles - 3 RETURN : Utile dans les chaînes utilisateurs. Cette cible permet de revenir à la chaîne appelante. Si RETURN est utilisé dans une des chaînes de base précédente, cela est équivalent à l'utilisation de sa cible par défaut.
Iptables – Syntaxe de base – 1 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 – Syntaxe de base – 2 Syntaxe : Fonction : 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
Iptables – Les options -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, ! signifie la négation -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 interv.de ports) --tcp-flags [!] masq comp flags de paquets tcp ( ex. SYN) -j cible ACCEPT/DROP/QUEUE/RETURN/REDIRECT/MASQUERADE / DNAT/ SNAT/ LOG
Sauvegarde-Restauration les règles sont stockées en mémoire pour les sauvegarder : iptables-save pour les restaurer : iptables-restore
Iptables – Exemples -1 vidage chaine INPUT iptables -F INPUT politique par défaut pour la chaine INPUT iptables -P INPUT ACCEPT
Le filtrage à états – 1 Iptables permet d’effectuer du filtrage à états : c’est à dire qu’il permet de tenir compte de l’état de la connexion TCP pour prendre une décision de filtrage --state : Permet de spécifier l'état du paquet à faire correspondre parmi les états suivants : ESTABLISHED : paquet associé à une connexion déjà établie NEW : paquet demandant une nouvelle connexion INVALID : paquet associé à une connexion inconnue RELATED : Nouvelle connexion mais liée, idéal pour les connexions FTP
Le filtrage à états – 1 Exemples : # iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state -- state ESTABLISHED -j ACCEPT
Filtrage de base iptables -t filter -F iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED --jump ACCEPT iptables -t filter -A INPUT --protocol tcp --destination-port 80 -- jump ACCEPT iptables -t filter -A INPUT -m state --state NEW,INVALID --jump DROP
La NAT - SNAT SNAT : cible valable dans la table NAT dans la chaîne POSTROUTING – à utiliser avec un adresse fixe syntaxe : --to-source <adresse-ip>[-<adresse-ip>][:port- port] Ex : iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source 193.15.24.156
La NAT - DNAT Cette cible n'est valable que dans la table nat , dans les chaînes PREROUTING et OUTPUT , et dans les chaînes définies par l'utilisateur qui sont appelées par celles-ci. Elle spécifie que l'adresse de destination du paquet doit être modifiée (ainsi que tous les paquets à venir dans le cadre de cette connexion ), et que les règles doivent cesser d'être examinées. Elle reçoit une option : --to-destination <adresse-ip>[-<adresse-ip>][:port-port] qui peut spécifier une seule adresse IP de destination, une série d'adresse IP inclusive , et optionnellement, une plage de ports (qui n'est valide que si la règle spécifie aussi -p tcp ou -p udp). Si aucune plage de port n'est spécifiée, le port de destination ne sera jamais modifié. Ex : iptables -t nat -p tcp -A PREROUTING -j DNAT --destination- port 80 --to-destination 192.168.1.3:80
La NAT - MASQUERADE Cette cible n'est valable qu'avec la table nat , dans la chaîne POSTROUTING à utiliser uniquement avec une adresse dynamique: si vous avez une adresse IP statique, vous devez utiliser la cible SNAT. Le masquerading revient à spécifier une translation (mapping) vers l'adresse IP de l'interface par laquelle le paquet va sortir, mais implique aussi que les connexions sont perdues lorsque l'interface tombe. option : --to-ports <port>[-<port>] qui spécifie une série de ports source à utiliser, qui prend le pas sur la sélection heuristique de port source SNAT (voir ci dessus). Ceci n'est valide que si la règle spécifie aussi -p tcp ou -p udp. Ex : iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Les chaines utilisateurs – 1 Création de la chaîne sur laquelle les filtres seront appliqués ; # iptables -N internet Ensuite, on associe la chaîne 'internet' à la chaîne INPUT, c'est à dire en entrée sur l'interface 'eth0' ; # iptables -A INPUT -i eth0 -j internet Permet : ESTABLISHED : permet d'avoir le mode 'stateful', c'est à dire qui regarde la validité des paquets retour par rapport aux fenêtres ; RELATED : permet d'accepter les paquets ICMP d'erreur concernant la transaction.
Les chaines utilisateurs – 2 # iptables -A internet -m state --state ESTABLISHED,RELATED -j ACCEPT Tout ce qui arrive sur cette interface, matché par cette chaîne, est journalisé. # iptables -A internet -p all -s any/0 -d any/0 -j LOG Il est nécessaire maintenant d'autoriser les flux (ici, le service SSH de 'any 0/0' vers 'yoda 10.0.0.1/32') ; # iptables -A internet -i eth0 -p tcp -s 0/0 -d 10.0.0.1/32 -- source-port 1023: --destination-port 22 -j ACCEPT On interdit tout. # iptables -A internet -i eth0 -p all -s any/0 -d any/0 -j DROP
Le logging Met en service la journalisation du noyau (kernel logging ) pour les paquets correspondants. Lorsque cette option est positionnée pour une règle, le noyau Linux affichera certaines informations sur tous les paquets correspondants à cette règle (comme la plupart des champs de l'en-tête IP) par l'intermédiaire des journaux du noyau. --log-level niveau Niveau de journalisation (cf syslog.conf(5)). --log-prefix préfixe Préfixe les messages de journalisation avec le préfixe spécifié; utile pour distinguer les différents messages d'un fichier de log. --log-tcp-options Option de journalisation de l'en-tête de paquets TCP. --log-ip-options Option de journalisation de l'en-tête de paquets IP.
Blocage des adresses privées # On refuse les paquets des classes privées iptables –A INPUT –i eth0 –s 10.0.0.0/8 –j DROP iptables –A INPUT –i eth0 –s 172.16.0.0/12 –j DROP iptables –A INPUT –i eth0 –s 192.168.0.0./16 –j DROP
Remarques de mise en oeuvre - 1 Toute mise en place de pare-feu doit débuter par la remise à zero des chaines standard iptables -F iptables -F -t nat iptables -F -t mangle Des chaines utilisateurs iptables -X iptables -X -t nat iptables -X -t mangle Remise à zero des compteurs iptables -Z
Remarques de mise en oeuvre - 2 Stratégie par défaut : Drop iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP Autorisation sur loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT Utilisation d’outils : nmap pour effectuer un scan de ports
Exemple 1 – un pare feu de base Bloque toutes les connexions entrantes depuis l'extérieur Hyp. : eth0 : LAN, eth1 : extérieur Réseau local en 192.168.x.y , passerelle en 192.168.1.1 On crée une chaine pour filtrer selon l'état des paquets : iptables -N block iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A block -m state --state NEW -i ! eth1 -j ACCEPT iptables -A block -j DROP iptables -A INPUT -j block iptables -A FORWARD -j block
Example 2 PRIVPORTS=“0:1023” # ports système UNPRIVPORTS=“1024:65535” #ports standard #DNS autorisé iptables –A OUTPUT -o eth0 –p udp –s $MY_IP -sport 53 -d $NAMESERVER - dport 53 –j ACCEPT iptables –A INPUT -I eth0 –p udp –s $NAMESERVER -sport 53 -d $MY_IP -dport 53 –j ACCEPT #connexion SSH autorisée iptables –A INPUT -I eth0 –p tcp -sport $UNPRIVPORTS - -dport 22 – j ACCEPT iptables –A OUTPUT -o eth0 –p tcp –s $MY_IP -sport 22 -dport $UNPRIVPORTS –j ACCEPT