Configuration du firewall Netfilter de Linux

22 avril 2012 rdorigny 0 commentaires

Netfilter est le firewall natif de Linux, il est directement accessible par la commande iptables. Très complet et ultra simple d'utilisation, ce système de firewalling est configurable par script dès lors que l'on dispose de bonnes connaissances des protocoles réseaux. Cette article explicite comment segmenter vos réseaux avec des DMZ (zone démilitarisée), comment appliquer des règles simples sur vos DMZ, comment utiliser un suivi dynamique des connexions (CONNTRACK)...

1)Présentation

La version 2.4 du noyau Linux avait introduit une nouvelle version de firewall, appelé Netfilter (successeur d’IPCHAINS). Il est lié à l’utilitaire de configuration iptables, , on confond souvent netfilter et iptables dans la littérature.
Netfilter reprend des principes de bases comme les chaînes, mais il y a des nouveautés :
  • Une architecture modulaire
  • Un système de firewall statefull
  • Une traduction d’adresses (NAT)
  • Une interface d’altération d’en-têtes de paquets (packet mangling)

Les fichiers de Netfilter sont répartis comme tels :
  • Modules netfilter sont sous /lib/modules/num noyau/kernel/net/ipv4/netfilter
  • Chargement des modules iptables dans etc/rc.modules (modprobe ip-tables)
  • Démarrage au boot dans /etc/init.d/iptables et /etc/sysconfig/iptables
Ci-dessous, le cheminement d’un paquet. Le noyau contient à la base trois listes de règles dans la table filter ; ces listes sont appelées chaînes (ou CHAINs) de firewall. Les 3 chaînes sont input, output et forward.
Iptables permet de rediriger un paquet sur une chaîne en tenant compte des caractéristiques du paquet (adresse IP, port TCP/UDP, protocole). Une chaîne est un traitement spécifique.

2) Configuration de Netfilter : cas général

Ce chapitre ne décrit pas le fonctionnement des différentes règles de Iptables mais expose les différentes fonctionnalités utilisées au travers de Iptables pour notre projet.

Configuration d’une passerelle:
Une passerelle est un périphérique connecté à plusieurs réseaux physiques capable de router les paquets protocolaires TCP/IP. Un firewall doit avoir cette fonction de passerelle, c'est un routeur filtrant. Sur Linux, il faut préciser au système l’activation du routage de paquets ; par défaut cette option est désactivée.
Il y a 2 méthodes pour activer la fonctionnalité de passerelle (forwarding en anglais) IP:
  • Lancer un cat /proc/sys/net/ipv4/conf/all/forwarding. Si la commande renvoie 1, le forwarding est activé, sinon faire un echo 1 > /proc/sys/net/ipv4/conf/all/forwarding. Cette solution est volatile puisqu'elle n'est plus prise en compte après un redémarrage.
  • Ouvrir le fichier /etc/sysctl.conf et vérifier que la variable net.ipv4.ip_forward est positionnée sur 1. La modification du fichier permet une prise en compte permanente.

Pour configurer le routage, linux dispose de la commande route. Par exemple :
#Cette commande ajoute la route par défaut
route add default gw x.x.x.x
#Ajoute une route
route add y.y.y.y eth0

Politique de filtrage:
En firewalling, il existe 2 politiques :
1) Tout ce qui n’est pas explicitement autorisé est interdit. (Politique restrictive)
2) Tout ce qui n’est pas explicitement interdit est autorisé. (Politique permissive)

En général, on applique la politique restrictive :
#Politique par defaut (restrictive)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

La politique par défaut s’applique comme la dernière règle en vigueur ; ainsi on peut, grâce aux règles qui précèdent, ne faire passer que les paquets explicitement autorisés.

Remarque :

L’opérateur DROP supprime le paquet sans préavis. On peut le remplacer par l’opérateur REJECT qui envoie un paquet ICMP host-unreachable pour prévenir l’expéditeur. Le problème est que le fait d’utiliser des icmp peut rendre le système sensible à des attaques de type smurf (l’attaquant utilise en rebond notre firewall en lui envoyant un grand nombre de paquets avec l’adresse source de la cible par spoofing, et donc notre firewall va répondre à chacun des paquets ce qui provoquera à coup sûr un Deny of Service imparable sur la cible).


Découpage des flux:
Une chaîne est un ensemble de règles. Iptables peut alors identifier des paquets qui correspondent à certains critères, et les détourner vers la chaîne appropriée.

#Exemple d’utilisation
#Creation de la chaine
iptables –N LOGDROP

#Description de la chaîne
iptables -A LOGDROP -j LOG --log-prefix "Paquets DROP FW RZO :"
iptables -A LOGDROP -j DROP

#Jumps des flux iptables –A INPUT –j LOGDROP
iptables –A OUTPUT –j LOGDROP
iptables –A FORWARD –j LOGDROP

Prenons le cas d’un simple firewall à 2 interfaces : LAN, WAN. On peut identifier les flux tel que:


Dans cet exemple nous distinguons 12 flux TCP/UDP. Si l’on considère que les 2 flux ETH1 et ETH2 sont les mêmes, il reste 8 flux à gérer pour FW :
  • LAN2WAN (se lit LAN à WAN en anglais)
  • WAN2LAN
  • LAN2FW
  • WAN2FW
  • FW2LAN
  • FW2WAN
  • WAN2WAN
  • LAN2LAN
Le flux FW2FW sera traité avec l’interface lo.

Le fichier de configuration de netfilter avec la gestion des flux LAN/WAN/FW est à la page suivante.
Remarque : Un firewall possédant une zone démilitarisée a une gestion similaire. Par contre, le nombre de chaînes à paramétrer sera beaucoup plus important.

Fichiers de configuration du firewall de test du LAN 192.168.0.0/16 :
#Regles du firewall

#variables
intlan="eth0"
intwan="eth1"
reslan="192.168.0.0/16"
adfwlan="192.168.x.x/32"
adfwwan="y.y.y.y/32"
any="0.0.0.0/0"

#Vidage des filtres par defaut et des chaines utilisateurs
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

#Definition de la politique de securite (restrictive)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Pour acceder au firewall
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#Creation des chaines
iptables -N LAN2WAN
iptables -N WAN2LAN
iptables -N LAN2FW
iptables -N WAN2FW
iptables –N FW2LAN
iptables –N FW2WAN
iptables -N WAN2WAN
iptables -N LAN2LAN

#Jumps des flux
iptables -A FORWARD -s $reslan -d ! $reslan -i $intlan -o $intwan -j LAN2WAN
iptables -A FORWARD –s ! $reslan -d $reslan -i $intwan -o $intlan -j WAN2LAN
iptables -A INPUT -s $reslan -i $intlan -j LAN2FW
iptables -A INPUT –s ! $reslan -i $intwan -j WAN2FW
iptables -A OUTPUT -d $reslan -o $intwan -j FW2LAN
iptables -A OUTPUT -d ! $reslan -o $intlan -j FW2WAN
iptables -A FORWARD –s ! $reslan -d ! $reslan -i $intwan -o $intwan -j WAN2WAN
iptables -A FORWARD –s $reslan -d $reslan -i $intlan -o $intlan -j LAN2LAN

#Gestion des flux
iptables -A LAN2WAN -j ACCEPT
iptables -A WAN2LAN -j ACCEPT
iptables –A LAN2FW -j ACCEPT
iptables –A WAN2FW -j ACCEPT
iptables –A FW2LAN -j ACCEPT
iptables –A FW2WAN -j ACCEPT
iptables -A LAN2LAN –j ACCEPT
iptables –A WAN2WAN - DROP

Pour les flux ICMP, on peut les traiter avec des chaînes particulières :

###########################################################################
#Regles de gestion du protocole ICMP
###########################################################################

#Acceptation du protocole ICMP
iptables -A ICMP-ACC -p icmp -j ACCEPT

###########################################################################
#Filtrage du protocole ICMP
#echo-reply
iptables -A ICMP-FIL -p icmp --icmp-type 0 -j LOGDROP
#destination-unreachable
iptables -A ICMP-FIL -p icmp --icmp-type 3 -j ACCEPT
#source-quench
iptables -A ICMP-FIL -p icmp --icmp-type 4 -j ACCEPT
#echo-request
iptables -A ICMP-FIL -p icmp --icmp-type 8 -j LOGDROP
#Time-exceed
iptables -A ICMP-FIL -p icmp --icmp-type 11 -j ACCEPT
#Parameter-problem
iptables -A ICMP-FIL -p icmp --icmp-type 12 -j ACCEPT

Il est nécessaire de conserver en partie le protocole ICMP. Ce protocole est utile pour résoudre les éventuels problèmes réseaux. Le chapitre suivant propose une autre solution pour la gestion du protocole ICMP.

3) Utilisation du Statefull Inspection

Le suivi de connexion est un concept essentiel de Netfilter. Prenons l’exemple d’une connexion TCP classique, son établissement suit un protocole strict :
1. SYN : Requête de synchronisation
2. SYN, ACK : Réponse et accusé réception de la synchronisation de la part du serveur
3. ACK : Accusé réception du client

Donc par exemple, l’arrivée d’un paquet ACK sans demande de synchronisation doit être rejetée.
On peut suivre les protocoles TCP, UDP, ICMP et FTP grâce au moteur de suivi de connexion Conntrack.

Le suivi de TCP est réalisé par le module ip_contrack_proto_tcp.o qui se charge de suivre le déroulement des connexions à partir des drapeaux de l’en-tête protocolaire. On peut observer les entrées de la table des états sous /proc/net/ip_conntrack :
  • SYN_SENT UNREPLIED pour une demande de synchronisation
  • SYN_RECV pour la réception de la demande
  • ESTABLISHED pour signaler que le flux est autorisé
Iptables définit des états de paquets pour le suivi de connexion :
  • NEW : pour les nouveaux flux.
  • ESTABLISHED : le paquet correspond à une entrée de la table des états.
  • RELATED : le paquet est attendu par le moteur Conntrack
  • INVALID : le paquet n’a pas un état reconnu
#Exemple de suivi de connexion TCP par iptables LAN->WAN
#Laisse passer les paquets d’etats RELATED et ESTABLISHED
iptables -A WAN2LAN -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT
#Creation à chaque connexion d’une entree dans la table des etats
iptables -A LAN2WAN -p TCP --dport 80 --sport 1024: -m state --state NEW -j ACCEPT

Le suivi du protocole UDP plus délicat à faire, car UDP se fait sans connexion, il se base sur les timeouts. Le premier paquet, créé une session dans la table des entrées par l’indicateur NEW puis ESTABLISHED. La session est détruite au bout de quelques minutes, lorsque l’échange est terminé.


#Exemple de suivi de connexion UDP par iptables LAN->WAN
#Laisse passer les paquets d’etats RELATED et ESTABLISHED WAN->LAN
iptables -A WAN2LAN -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT
#Creation à chaque connexion d’une entree dans la table des etats
iptables -A LAN2WAN -p UDP --dport 25 --sport 1024: -m state --state NEW -j ACCEPT

Le suivi de ICMP fait toujours intervenir 2 types de paquets :
  • Les requêtes ICMP (Echo Request, TimeStamp, Adress Mask et Info)
  • Les réponses (Source Quench, Echo Reply, …)
La requête est traitée comme un état NEW. La réponse est alors ESTABLISHED. (Une réponse non sollicitée est considérée comme INVALID).
iptables –A INPUT –p icmp –m state - -state RELATED –j ACCEPT


Pour le protocole FTP, le client établit une connexion de commande initiée en TCP sur le port 21 du serveur. Donc pour l’autoriser :
iptables –A FORWARD –m state - -state ESTABLISHED –j ACCEPT
iptables –A FORWARD –p TCP –d $FTP_SVR - -dport 21 - -sport1024: –m state - -state NEW –j ACCEPT

Un paquet qui est ESTABLISHED est autorisé à passer pour la connexion cliente. Dés que le client fait un transfert de données, une deuxième connexion de données est ouverte pour le mode actif par le serveur. Le serveur se connecte depuis son port 20 sur le client vers un port indiqué. Si le module Conntrack FTP n’est pas utilisé, il faut rajouter :
iptables –A FORWARD –p TCP –s $FTP_SVR - -sport 20 - -dport 1024: –m state - -state NEW –j ACCEPT

Si le module de suivi pour FTP est utilisé (ip_conntrack_ftp.o), le premier paquet sera reconnu et passé en état RELATED, donc :
iptables –A FORWARD –s $FTP_SVR - -sport 20 - -dport 1024: –m state - -state RELATED –j ACCEPT

En mode passif, c’est le qui client se connecte sur le port 20 du serveur.
#Sans le module
iptables –A FORWARD –p TCP –d $FTP_SVR --sport 1024: --dport 1024: –m state --state NEW –j ACCEPT
#Avec le module
iptables –A FORWARD –p TCP –d $FTP_SVR --sport 1024: --dport 1024: –m state --state RELATED –j ACCEPT
Sécurisation des échanges avec l’administrateur:

Il est possible d’utiliser une liaison sécurisée SSH en utilisant le démon sshd de Linux. L’administrateur utilise le logiciciel Putty (freeware) pour créer des sessions SSH depuis son poste de travail. Il faut donc autoriser le traffic SSH entre le Firewall et le LAN pour l’adresse IP de l’administrateur.

#Protocole SSH pour l'administration a distance
iptables -A LAN2FW -s $ad_IP_admin1 -p TCP --dport 22 -j ACCEPT
iptables -A FW2LAN -d $ad_IP_admin1 -p TCP --sport 22 -j ACCEPT
#iptables -A FW2LAN -d $ad_IP_admin1 -p TCP --sport 22 -m mac --mac-source $ad_mac_admin1 -j ACCEPT
#iptables -A LAN2FW -s $ad_IP_admin1 -p TCP --dport 22 -m mac --mac-source $ad_mac_admin1 -j ACCEPT

S’il n’y a pas de routeur entre le firewall et le host de l’administrateur, on peut ajouter aussi une sécurisation par adresse MAC.

4) Journalisation des paquets

Les paquets non désirés sont supprimés mais il peut être intéressant de garder une trace de ces paquets en les journalisant.
Dans l’exemple suivant, les paquets envoyés vers la chaîne LOGDROP sont transmis au démon syslogd pour être ajoutés au fichier /var/log/messages avant d’être définitivement supprimé.


#LOG les paquets supprimes
iptables –N LOGDROP
iptables -A LOGDROP -j LOG --log-prefix "Paquets DROP FW :"
iptables -A LOGDROP -j DROP

#LOG les paquets INVALID
iptables -A LOGINVALID -j LOG --log-prefix "Paquets INVALID FW :"
iptables -A LOGINVALID -j DROP

iptables –A FORWARD –m state - -state INVALID –j LOGINVALID
iptables –A OUTPUT –m state - -state INVALID –j LOGINVALID
iptables –A INPUT –m state - -state INVALID –j LOGINVALID
Mais attention, le fait de tout journaliser peut prendre beaucoup de ressources au système (espace disque).

5) Liste noire

Une liste noire est un inventaire d’adresses que l’on considère comme dangereuses, et dont les paquets sources ou paquets destinations sont supprimés.

#Liste noir
Black_list="160.133.113.214 255.255.255.255"
for ip in $Black_list;
do
iptables -A FORWARD -s $ip -j LOGDROP
iptables -A FORWARD -d $ip -j LOGDROP
iptables –A INPUT –s $ip –j LOGDROP
iptables –A OUTPUT –d $ip –j LOGDROP
done

6) Interface graphique

Les administrateurs souhaitent disposer d’un logiciel capable graphiquement de générer les règles de iptables.
Plusieurs logiciels existents :
  • FwBuilder
  • GuarDog
  • Webmin

Webmin est le seul à gérer les règles par flux à partir des CHAINs. Webmin est un service web qui fonctionne avec des fichiers de type cgi. Il nécessite donc l’utilisation d’un serveur web (apache) dont la console est disponible via le port 10000.
Ce port est paramétrable, mais la possibilité de l’utiliser à distance doit être bloquée par Netfilter pour éviter la prise de contrôle illégale à distance du pare-feu du côté WAN.



Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2017 www.doritique.fr par Robert DORIGNY