Mise en oeuvre d’un firewall avec Centos ou Fedora

PROPOS

Ce document résume les étapes à suivre pour configurer un Firewall NETFILTER. Chacun ayant sa façon de faire, je vais détailler la mienne.

GENERALITES

Une machine LINUX agissant comme Firewall a besoin de deux interfaces réseaux minimum.

Ces interfaces peuvent être physiques (1 carte réseau par brin réseau) ou logiques (en implémentant des VLANS, mais cela nécessite des switches particuliers).

Un système LINUX ainsi équipé peut se comporter comme un routeur, ce qui est le premier impératif d’un Firewall.

Si un Firewall ne voit jamais le trafic réseau, il ne pourra jamais le filtrer… C’est pour cela que le Firewall est la passerelle par défaut d’un réseau local à protéger.

Le Firewall a donc :
– une interface sûre qui est connectée au réseau local.
– une interface dangereuse qui est connectée à Internet via un routeur ou un modem ADSL Ethernet. Le cas d’une connexion ppp via modem RTC n’est pas traité ici, mais le principe est le même.
ROUTAGE

Un système LINUX avec plusieurs interfaces, bloque par défaut le trafic réseau passant d’une interface vers l’autre. Ceci est un principe de sécurité qui évite que votre machine ne serve de routeur à votre insu. Vous êtes obligé d’activer le routage « à la main ».

Pour cela, il suffit de modifier le fichier /etc/sysctl.conf.
Modifier la ligne net.ipv4.ip_forward comme ceci :
net.ipv4.ip_forward = 1

Une fois le fichier corrigé, activer le changement avec la commande :

sysctl -p

Vérifiez que le routage est actif en consultant la valeur donnée à la fonction routage.

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1

Ici, on obtient la valeur 1, donc le routage est actif. Si vous obtenez 0, vous n’avez pas encore activé le routage.

TRANSLATION D’ADRESSE

Une fois le routage activé, votre LINUX est devenu un routeur. C’est à dire qu’il va expédier les paquets d’une interface à l’autre pour accomplir cette tache.

Tant que vous utilisez votre nouveau routeur dans un réseau local, vous ne rencontrerez pas de soucis et le LINUX enverra les paquets du mieux qu’il le peut avec la configuration réseau que vous lui donnez.

Par exemple, le routeur LINUX est la passerelle de deux réseaux locaux de type RFC 1918.

Son adresse IP sur eth0 est 192.168.1.254, celle d’eth1 est 192.168.2.254 et le routage est actif.

Lorsque la machine 192.168.1.1 du premier réseau veut contacter la machine 192.168.2.1 du second réseau elle va envoyer le paquet à sa passerelle, qui est notre routeur LINUX.

Celui-ci prend le paquet et l’expédie à la machine 192.168.2.1 qui se trouve sur sa seconde interface réseau.

Cette dernière doit répondre à 192.168.1.1 et envoie sa réponse à sa passerelle. Notre routeur envoie alors le paquet de réponse vers 192.168.1.1.

Le trafic s’est correctement établi entre les deux machines en utilisant le routeur.

Les choses se compliquent dès que l’on fait de l’Internet.
En effet, si vous avez regardé la RFC 1918 précédemment citée, certaines adresses de réseau sont destinées à un usage privé et ne sont pas routables sur internet. Ce qui veut dire que ces adresses ne peuvent être jointes depuis Internet.

Si on l’applique à notre exemple, cela donne ceci :

On considère que l’interface eth1 du routeur est cette fois une interface reliée à internet avec une adresse IP publique attribuée par un fournisseur d’accès.

Lorsque la machine 192.168.1.1 du premier réseau veut contacter la machine 213.190.70.10 qui est un serveur web sur internet, elle va envoyer le paquet à sa passerelle, qui est notre routeur LINUX.

Celui-ci prends le paquet et l’expédie à la machine 213.190.70.10 qui se trouve du coté de sa seconde interface réseau.

Ce serveur doit répondre à 192.168.1.1 qui est une adresse privée. Cela est impossible et la requête est perdue.

Le trafic ne s’est pas établi entre les deux machines du fait d’une mauvaise gestion de l’adressage IP privé.

Pour que cela rentre dans l’ordre, il faut impérativement que le serveur web sur internet réponde à une adresse publique internet.

La seule adresse publique présente dans notre chaîne de liaison est celle de notre routeur LINUX. C’est à cette adresse externe fournie par un fournisseur d’accès que le serveur web doit répondre.
Pour cela, le routeur met en place une « translation d’adresse », aussi appelé NAT par abus de langage.

Les translations d’adresse peuvent être de deux types désignés par NAT et PAT. Je ne rentre pas dans le détail et j’utilise la PAT qui est l’usage courant dans notre cas. Le NAT est plutôt utilisé quand on a plusieurs adresses IP internet publiques ce qui n’est pas le cas dans un accès internet courant.

La mise en œuvre de ce PAT est simplement activée avec la commande suivante :

Dans cet exemple l’interface connectée sur internet est eth1. Si vous avez une connexion ADSL via modem Ethernet, cela sera ppp0 que vous utiliserez. Adaptez dans les commandes suivantes ce nom d’interface à votre cas.

iptables -t nat -o eth1 -j MASQUERADE

Avec cette simple commande notre problème ci-dessus est corrigé.
Lorsque le routeur envoie le paquet vers le serveur web, il change l’adresse source par son adresse publique liée à eth1.

Le serveur pourra ainsi renvoyer la réponse à cette adresse publique et le routeur va convertir cette réponse pour la renvoyer à la machine 192.168.1.1.

SAUVEGARDE DE LA CONFIGURATION

Pour sauvegarder ce paramétrage, il faut le sauver dans le fichier /etc/sysconfig/iptables.

Ce fichier est lû par le script de démarrage iptables.

Pour cela, vous avez deux possibilités :

iptables-save > /etc/sysconfig/iptables

ou

service iptables save

Le fichier sera créé s’il n’existe pas.

Penser à sauvegarder de temps en temps votre configuration au cours de cet article, cela évitera de tout retaper en cas de mauvaise manipulation.

Il faudra aussi sauvegarder la configuration durant l’exploitation de votre Firewall à chaque fois que vous ferez des changements de politique de sécurité.

ACTIVATION DU ROUTAGE ET DU Firewall AU BOOT

Pour activer iptables au boot de la machine, utilisez la commande suivante :

chkconfig iptables on

Vérifiez que cela soit bien pris en compte avec la commande :

chkconfig --list iptables

Cela doit vous donner quelque chose ressemblant à ceci :

iptables 0:arrêt 1:arrêt 2:marche 3:marche 4:marche 5:marche 6:arrêt

CHARGEMENT DES MODULES IPTABLES

On verra plus tard qu’iptables est un programme modulaire qui charge « à la volée » les composants afin d’assurer son travail.
Mais il a quelques défauts et il ne charge pas tous les modules correctement.

Pour corriger ce problème on peut lui indiquer lors du lancement du script de démarrage quels modules supplémentaires charger.

On va charger les modules ip_nat_ftp et ip_conntrack_ftp que l’on utilise très fréquemment pour la gestion du service ftp comme leur nom l’indique.

Modifier la ligne correspondant aux modules dans le fichier /etc/sysconfig/iptables-config.

IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

Lorsque le script iptables sera invoqué, il chargera maintenant correctement les modules ftp.

TABLES GEREES PAR LE Firewall

Un Firewall iptables est divisé en 3 portions.

  1. La translation d’adresse nat
  2. Le filtrage IP ( Firewall pur et dur )
  3. La modification des paquets ( appelé MANGLE ) dont je ne traiterai pas ici, car ces modifications de paquets sont utilisés par la qualité de service QOS. Ceci dépasse mes compétences actuelles 🙂

La translation d’adresse qu’on utilise de base a été expliquée ci-dessus, donc intéressons nous au filtrage.

Le filtrage IP est lui-même composé de 3 fonctions qu’il faut bien appréhender au début même si elles sont simples, ce n’est pas évident à comprendre au premier abord.

Le trafic IP peut être inclus dans 3 entités nommées INPUT, FORWARD et OUTPUT.

INPUT prends en compte le trafic réseau à destination de la machine Firewall elle-même. C’est le cas si cette machine fait fonction de serveur web qui devra être disponible pour les machines sur le réseau.

Ce trafic peut entrer sur n’importe quelle interface de la machine, eth0, eth1 ou lo dans notre exemple. L’interface lo est l’interface loopback utilisé par les services réseaux interne à la machine, comme l’interface graphique par exemple si elle est installée sur le Firewall ( mauvaise idée d’ailleurs ).

FORWARD prends en compte le trafic réseau qui transite via le Firewall. C’est le cas le plus fréquent, vu que le Firewall est le routeur du réseau local.

Ce trafic peut aller du LAN vers internet ou d’Internet vers le LAN, le sens sera défini dans la règle iptables lors de la saisie de la commande.

OUTPUT prends en compte le trafic réseau qui sort de la machine Firewall elle-même. Comme je considère que mon Firewall est « propre » et « sûr », je laisse les règles de la chaîne OUTPUT à ACCEPT. Cela évite d’ajouter une autorisation à chaque fois que je voudrais ajouter un service sur le Firewall ou lorsque je travaille depuis cette machine.

Certains diront « Oui, mais si ton Firewall est hacké, le pirate pourra utiliser tout le trafic réseau sortant du Firewall lui-même »
Sachant que si ce pirate a pu prendre la main sur mon Firewall, il a tout loisir de modifier mes règles de pare-feu, je m’en moque et me simplifie donc beaucoup la vie 🙂

Il faut donc retirer de ce paragraphe qu’en bloquant le trafic en INPUT et en FORWARD, on bloque tout le trafic réseau utilisant notre Firewall comme passerelle.

Il faut donc jouer sur les règles de ces chaînes pour autoriser petit à petit le trafic « autorisé » sur le réseau.

Il faut retenir aussi que :
– si le trafic concerne le Firewall lui-même, on travaille sur INPUT.
– si le Firewall n’est pas directement destinataire du trafic et qu’il ne fait que le transmettre, on travaille sur FORWARD.

REGLES PAR DEFAUT

iptables lit les règles qu’on va lui donner dans l’ordre d’apparition de celles-ci. Si aucune règle ne correspond au trafic réseau qu’il traite, il lui applique la politique par défaut.

Un bon Firewall se doit de tout verrouiller et appliquera donc un DROP au trafic réseau.

Pour cela, on utilise les commandes suivantes :


iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Ici je ne bloque pas le trafic OUTPUT pour rester cohérent avec le chapitre précédent 🙂

Nous voici maintenant avec un Firewall actif et qui ne laisse rien passer. Rien du tout ! Très efficace donc, mais maintenant il va falloir l’ouvrir un peu…

ETAT DES CONNEXIONS

Avant de continuer, il faut savoir qu’iptables contrairement au vieux ipchains est appelé « statefull ».

Ce terme barbare désigne un concept assez simple quand on considère comment sa fait une communication tcp/ip.

Un client lance une requête vers un serveur web par exemple. Il établit donc une nouvelle connexion (NEW).

Le serveur reçoit la requête et réponds à celle-ci. La communication est donc en relation avec la demande (RELATED).
Le client et le serveur se sont entendus pour établir la communication, le client et le serveur utilisent donc une connexion établie pour envoyer ou recevoir les pages web (ESTABLISHED).

On a ici, le fonctionnement normal d’une communication tcp/ip.
iptables est capable de suivre ces communication et d’établir un journal interne afin de savoir qui fait quoi et qui réponds à qui.

Ce fonctionnement gère les états de connexion.

Imaginons qu’un pirate simule un serveur web et envoie une réponse RELATED vers une machine qui n’a jamais rien demandé. iptables est capable de détecter cette anomalie et de rejeter ce genre d’attaque.

Maintenant qu’on sait ce que veut dire l’état d’une connexion, on peut passer aux premières règles à appliquer pour ouvrir proprement notre Firewall.

REGLES DE BASE

On a vu ci-dessus que le fonctionnement normal d’une connexion, passe par les états NEW, puis RELATED, puis ESTABLISHED.

On va gérer les états NEW séparément, mais iptables nous permet de gérer simplement les autres états par une seule règle de filtrage.


iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Ici, j’utilise la commande iptables avec l’option -I au lieu de -A que j’utilise par la suite afin d’être sûr que ces règles soient les premières règles dans iptables. Le -I INSERE une règle au début, le -A AJOUTE une règle aux règles existantes.

A partir de maintenant, tout trafic que je vais autoriser verra ses réponses acceptées dynamiquement par le Firewall. Les règles que je vais ajouter régissent donc les connexions NEW.

Lorsque j’ai détaillé les fonctions du filtrage, j’ai indiqué que le système utilise une interface particulière pour communiquer en « interne » sans sortir de la machine. Cette interface est lo appelée loopback. Cette interface étant par définition sûre, car inaccessible depuis une carte réseau physique, j’accepte le trafic sur cette interface. Cela évite les problèmes d’interface graphique, ou de services proxy ou DNS éventuellement embarqués sur le Firewall.


iptables -A INPUT -i lo -j ACCEPT

PORTS RESEAUX D’USAGE COURANT

Les règles de filtrage se font par rapport à des ports réseaux.

Ce mot souvent entendu désigne l’équivalent d’une porte de palier si on considère notre système comme un immeuble d’habitation.

Si vous voulez rencontrer M LOPEZ, accédez au palier du 3ème étage de l’immeuble, porte de gauche.

Si vous voulez communiquer avec mon serveur web, accédez au port 80 de ma machine en tcp.

Les services réseaux utilisent des numéros de ports standards. Vous pouvez les visualiser dans le fichier /etc/services.

Ces services peuvent faire du tcp, de l’udp, ou les deux suivant le moment.

– tcp est utilisé pour communiquer avec vérification.

Allo, est-ce que tu m’entends ? OUI, je t’entends !

On établi une communication et on sait que la personne en fasse a reçu l’appel.

– udp est un mode non connecté, c’est à dire qu’il envoie ses messages sans être sûr qu’il y ait une réponse.

J’envoie une lettre à une personne à une adresse connue, si elle habite toujours là elle me répondra, sinon, je ne saurais jamais qu’elle n’a rien reçu. Il faudra que j’attente un certain temps que la poste me dise correspondant inconnu.

Pour une communication informatique, j’envoie le paquet a une certaine adresse, et si je n’ai pas de retour, j’attends un certain temps que le fût du canon refroidisse… enfin, j’attends un certain temps avant de considérer que la communication a échoué.

Les services réseaux courants sont les suivants :

DNS ( résolution de noms internet ) port 53 tcp ET udp
HTTP ( web ) port 80 tcp
HTTPS ( web sécurisé ) port 443 tcp
SMTP ( expédition messagerie ) port 25 tcp
POP3 ( réception messagerie ) port 110 tcp
IMAP ( réception messagerie également ) port 143 tcp
FTP ( transfert de fichiers ) port 21 tcp
SSH ( accès à distance sécurisé ) port 22 tcp

Ce tableau reprend les services principaux, les autres services peuvent être trouvés dans le fichier /etc/services ou dans des documentations.

REGLES CLASSIQUES

En suivant le tableau ci-dessus, on peut ajouter les services réseaux que nous voulons accepter.

Les règles iptables peuvent contenir les informations suivantes :
– port source
– port destination
– adresse IP source
– adresse IP destination
– état de la connexion
– limite du nombre de connexion dans un temps donné
– etc… lire le « man iptables » pour avoir une idée des options possibles.

Je vais donc taper les règles sans forcément utiliser toutes ces options. Vous pouvez les affiner au besoin.

Résolution DNS

Le DNS est un cas à part sur un système LINUX. La résolution de noms est utilisée en permanence par le système LINUX.

Il faut donc IMPERATIVEMENT penser à autoriser cette résolution de nom si on ne veut pas avoir des temps de réponses à rallonge sur le réseau.

Privez un serveur de mail de DNS et vous attendrez 10 secondes avant qu’il vous demande votre nom d’utilisateur…

Donc, une règle très importante :


iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT

Si votre serveur Firewall est serveur DNS pour le LAN, il faudra aussi ajouter les règles suivantes :


iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

Le fait de mettre un résolveur DNS sur le Firewall peut être un bon moyen de limiter le trafic DNS vers internet et utiliser le cache du service DNS pour optimiser le temps de réponse.

Services de messagerie

La messagerie utilise deux services comme vous le constatez quand vous paramétrez votre client de messagerie.

Il y a un service d’émission appelé SMTP ( serveur sortant ) et un service de réception qui peut être POP3 ou IMAP ( serveur entrant ).

Le SMTP est le port 25, le pop3 110 et l’imap le 143.

– Si vous utilisez SMTP

iptables -A FORWARD -p tcp --dport 25 -j ACCEPT

– Si vous utilisez POP3

iptables -A FORWARD -p tcp --dport 110 -j ACCEPT

– Si vous utilisez IMAP

iptables -A FORWARD -p tcp --dport 143 -j ACCEPT

Services WEB

Le web est l’outil le plus courant sur internet.

Il peut être sécurisé pour les achats en ligne ou les accès aux banques en ligne.

– Si vous utilisez le web classique http

iptables -A FORWARD -p tcp --dport 80 -j ACCEPT

– Si vous utilisez le web sécurisé https

iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

Service FTP

Le service ftp est le protocole le plus « embêtant » du web.

Il peut être passif ou actif et complique le fonctionnement du Firewall.

Heureusement, le filtrage « statefull » résout nos problèmes quand les bons modules iptables sont chargés. Cf. CHARGEMENT DES MODULES IPTABLES.

Pour que le ftp fonctionne correctement, il faut donc que les modules ip_nat_ftp et ip_conntrack_ftp soient bien chargés.

Vérifiez-le avec la commande lsmod | grep ftp

Puis pour accepter le ftp:

iptables -A FORWARD -p tcp --dport 21 -j ACCEPT

Service SSH

SSH est un protocole sécurisé permettant d’obtenir un shell sur votre Firewall. Il remplace telnet qui n’est pas sécurisé.

Pour utiliser SSH sur votre Firewall ( il est actif dans l’installation par défaut ) utilisez la commande suivante :
iptables -A INPUT -p tcp –dport 22 -i eth0 -j ACCEPT

Ici, je limite l’accès SSH depuis mon réseau local connecté sur mon interface eth0. L’accès est donc refusé sur l’interface internet.

AMELIORATIONS POSSIBLES

Comme je l’ai mentionné plus haut, la commande iptables permet de placer beaucoup d’arguments. Voici par exemple des améliorations à apporter aux règles données ci-dessus.

-i eth0 -i eth0 # Permet de spécifier dans quel sens vont les paquets réseau.

-d mail.caplaser.fr # permet de préciser le nom du serveur de mail de votre provider. Le nom sera remplacé par l’adresse IP de cette machine dans les règles iptables. Attention, certains noms DNS correspondent à plusieurs adresses IP. C’est souvent le cas pour les serveurs fortement sollicités sur internet qui sont doublés, ou triplés.

-s 192.168.1.2 # Permet de limiter la règle pour la machine ayant comme IP 192.168.1.2. Attention, à n’utiliser qu’avec des adresses IP fixes.

DETECTION DE PROBLEMES DE FILTRAGE

Quand un Firewall est en place, les problèmes commencent.

Pour diagnostiquer si le problème vient du Firewall, il faut souvent activer les logs. Il faut aussi les désactiver après car bonjour la saturation des disques durs, sauf si vous voulez faire des statistiques.

Pour activer le log, je vous conseille d’envoyer les logs dans le syslog du système. Cela évite d’avoir un écran illisible car par défaut iptables logue sur la console.

Activer les logs dans syslog :

iptables -I INPUT ( ou FORWARD ) -j LOG --log-prefix "debug fw: " --log-level info

Cela va activer le log de TOUS les paquets que reçoit ou transmet votre Firewall. Vous pouvez bien sûr limiter ces logs en utilisant des paramètres qui serviront de filtre. Par exemple pour limiter le log sur une adresse IP d’un client qui pose problème, ajouter avant -j LOG l'option -s 192.168.1.2 par exemple.

Une fois les logs activés comme indiqué ci-dessus, le fichier /var/log/messages va se remplir avec des lignes débutant par « debug fw : »

Utiliser un grep pour filtrer le résultat en fonction des problèmes que vous voulez résoudre.
tail -d /var/log/messages | grep "debug fw" |grep ip_qui_pose_problème

Les logs sont difficilement compréhensibles, mais avec l’habitude, on y arrive.

Il faut penser qu’un trafic IP a une adresse source, un port source, une adresse de destination et un port de destination.

Tout ceci appairait dans le log et doit être compris.

PENSER À SUPPRIMER LE LOG APRÈS AVOIR DIAGNOSTIQUER SINON, IL FAUT PRÉVOIR DE GROS DISQUES DURS !

FINALEMENT

Une fois que votre Firewall est configuré, sauvegardez la configuration active.

service iptables save

Une lecture du « man iptables » ou des documentations plus poussées sur le sujet vous feront pas mal de bien.

DOCUMENTS UTILES

– [Firewalling for free :

Documentation en Anglais très bien faite sur la mise en place d’un Firewall iptables.->http://old.citoyendunet.org/IMG/pdf/Firewalling_for_free.pdf
]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.