Tutoriels Linux Debian

Gérer plusieurs clés SSH de manière simple et automatique Lorsqu'on développe on utilise parfois une paire de clés SSH public/privée pour s'authentifier auprès d'un serveur distant. On utilise un système de clé publique/ clé privée couplée à un agent...

Lire la suite

Héberger son site internet sur son serveur dédié... Avant d'entrer dans le vif de ce tuto, notons que pour des raisons pratiques, sur le serveur dédié : les sites seront installés sur /home/nomdusite/. chaque site contient un répertoire logs/...

Lire la suite

Compilation du noyau sous debian ( kernel ) La compilation du noyau Debian peut être une étape nécessaire dans l'exploitation du système. La gestion des pilotes de périphériques est géré différemment sous Linux que sur Windows. Les pilotes...

Lire la suite

TCPDump ou comment sniffer le trafic TCP sous Linux... Tcpdump est un outil d'analyse réseau très répandu chez les amateurs de sécurité de l'information et de routage réseau. Tcpdump affiche les en-têtes de paquets d'une interface réseau en fonction...

Lire la suite

Les commandes top et htop La commande top La commande top permet de lister l'ensemble des processus et de ressources utilisées sur votre système linux, Unix ou BSD. [bash] top [/bash] Précisons la 3ème ligne : Options...

Lire la suite

  • Prev
  • Next

IPtables et NetFilter, solution de pare-feu

1

Category : Réseau, Sécurité

Iptables est un logiciel libre grâce auquel l’administrateur système peut configurer les chaînes et règles du pare-feu en espace noyau.

Netfilter est un framework implémentant le pare-feu au sein du noyau Linux. Il prévoit des accroches (qu’on appelle hooks) dans le noyau pour l’interception et la manipulation des paquets réseau lors des appels des routines de réception ou d’émission des paquets des interfaces réseau.

Les chaînes de Netfilter

Le concept de chaîne de règles a été introduit par Ipchains, l’ancêtre d’ Iptables. Iptables est stateful, c’est à dire que, contrairement à Ipchains qui est stateless, Iptables utilise les informations de la couche transport du modèle OSI (la couche 3) en plus des informations IP du paquet (la couche 2).Ipchains effectue un filtrage IP, tandis que Iptables affine sa politique de filtrage grâce aux informations de la couche transport du modèle OSI.

Chaque paquet réseau, entrant ou sortant, traverse donc au moins une chaîne.
Les chaînes correspondent à l’endroit où la pile de Netfilter a été invoquée. Voici les chaînes prédéfinies dans Iptables

  • « PREROUTING » Le paquet entre dans cette chaîne avant qu’une décision de routage soit prise.
  • « INPUT » Le paquet entre dans cette chaine lorsqu’il est livré sur place. (N.B. : la livraison sur place ne dépend pas d’un processus ayant un socket ouvert ; la livraison est contrôlée par le tableau « local » de routage : ip route show table local)
  • « FORWARD » Un paquet acheminé mais non livrés sur place passe par cette chaîne
  • « OUTPUT » Un paquet envoyé à partir de la machine elle-même passe par cette chaîne
  • « POSTROUTING » La décision de routage a été prise. Les paquets entrent dans cette chaîne, juste avant qu’ils soient transmis vers le matériel

Chaque chaîne peut être vue comme un ensemble de tests, chacun ayant pour résultat l’envoi du paquet vers la cible spécifiée si la condition est vérifiée. Si ce n’est pas le cas, on passe à la suivante. En arrivant à la fin d’une des chaînes, une cible par défaut est utilisée. A la fin d’une chaîne utilisateur, si aucune décision n’a été prise, on revient à la chaîne appelante.



Voici les cibles prédéfinies les plus courantes

Cible Description
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/messages (selon la configuration du programme syslogd).
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.
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.

Les tables d’iptables

La table Raw

La table Raw est principalement utilisée pour placer des marques sur les paquets qui ne doivent pas être vérifiés par le système de traçage de connexion. Ceci est effectué en utilisant la cible NOTRACK sur le paquet. Si une connexion rencontre une cible NOTRACK, conntrack ne tracera pas cette connexion. Ceci était impossible à résoudre sans l’ajout d’une nouvelle table, car aucune des autres tables n’est appelée jusqu’à ce que conntrack ait été lancé sur les paquets, et ait été ajouté aux tables conntrack, ou vérifié sur une connexion existante.

Cette table ne supporte que les chaînes PREROUTING et OUTPUT. Aucune autre chaîne n’est nécessaire, car c’est le seul endroit où vous pouvez opérer sur les paquets avant qu’ils soient vérifiés par le traçage de connexion.

Pour que cette table fonctionne, le module iptable_raw doit être chargé. Il sera chargé automatiquement si Iptables est lancé avec l’option -t raw, et si le module est disponible. La table raw est relativement récente dans Iptables et le noyau. Elle peut ne pas être disponible dans les premiers noyaux 2.6 et les 2.4 en dehors d’un patch.

La table Mangle

Elle sert pour modifier les en-têtes des paquets. On la rencontrera parfois pour marquer des paquets afin que d’autres applications puissent les reconnaître (type de service : ToS).

Attention ! Ne pas utiliser cette table pour filtrer. De même, les opérations de DNAT, SNAT ou de masquerading ne fonctionnent pas dans cette table.

Les cibles suivantes sont valides uniquement dans la table mangle et ne doivent pas être utilisées en dehors de cette table.

  • La cible TOS permet de définir et/ou modifier le champ de Type de Service (ToS) d’un paquet. Permet de définir des choix de routage pour les paquets. Il est important de noter que ce champ n’est pas vraiment implémenté sur Internet car la majorité des routeurs ne se préoccupent pas de ce champ, et quelquefois même, adoptent un comportement erroné. Ne configurez pas ce champ sur les paquets qui naviguent sur Internet, sauf si vous souhaitez leur appliquer des décisions de routage, avec iproute2.
  • La cible TTL permet de modifier le champ durée de vie ou TTL (Time To Live) d’un paquet. Ceci peut se justifier lorsque vous ne souhaitez pas être rejeté par certains Fournisseurs d’Accès à Internet (FAI) trop indiscrets. En effet, il existe des FAI qui désapprouvent les utilisateurs branchant plusieurs ordinateurs sur une même connexion, et de fait, quelques-uns de ces FAI sont connus pour vérifier si un même hôte génère différentes valeurs TTL, supposant ainsi que plusieurs machines sont branchées sur la même connexion.
  • La cible MARK permet d’associer des valeurs de marquage particulières aux paquets. Elles peuvent ensuite être identifiées par les programmes iproute2 pour appliquer un routage différent en fonction de l’existence ou de l’absence de telle ou telle marque. On peut ainsi réaliser de la restriction de bande passante et de la gestion de priorité (Class Based Queuing).
  • La cible SECMARK peut être utilisée pour placer des marques dans un contexte de sécurité sur des paquets dans Debian ou tout autre système de sécurité capable de gérer ces marques.
  • La cible CONNSECMARK sert à copier un contexte de sécurité vers ou depuis un simple paquet ou vers une connexion complète. Elle est utilisée par Debian ou autre système de sécurité pour affiner cette sécurité au niveau connexion.

La table NAT

Cette table est utilisée pour effectuer de la traduction d’adresse réseau (NAT) sur différents paquets. Autrement dit, elle sert à traduire le champ de l’adresse source d’un paquet ou celui de l’adresse destination. Précisons à nouveau que seul le premier paquet d’un flux rencontrera cette chaîne. Ensuite, les autres paquets subiront automatiquement le même sort que le premier. Voici les cibles actuelles capables d’accomplir ce genre de choses :

  • La cible DNAT est généralement utile dans le cas où vous détenez une adresse IP publique et que vous désirez rediriger les accès vers un pare-feu localisé sur un autre hôte (par exemple, dans une zone démilitarisée ou DMZ). Concrètement, on change l’adresse de destination du paquet avant de le router à nouveau vers l’hôte désigné.
  • La cible SNAT est quant à elle employée pour changer l’adresse source des paquets. La plupart du temps, vous dissimulerez votre réseau local ou votre DMZ, etc. Exemple : un pare-feu dont on connait l’adresse externe, nécessite de substituer les adresses IP du réseau local avec celle du pare-feu. Avec cette cible, le pare-feu effectuera automatiquement du SNAT sur les paquets dans un sens et du SNAT inverse dans l’autre, rendant possible les connexions d’un réseau local sur Internet. A titre d’exemple, si votre réseau utilise la famille d’adresses 192.168.0.0/masque_réseau, les paquets envoyés sur Internet ne reviendront jamais, parce que l’IANA (institut de régulation des adresses) a considéré ce réseau (avec d’autres) comme privé, et a restreint son usage à des LANs isolés d’Internet.
  • La cible MASQUERADE s’utilise exactement de la même façon que la cible SNAT, mais la cible MASQUERADE demande un peu plus de ressources pour s’exécuter. L’explication vient du fait que chaque fois qu’un paquet atteint la cible MASQUERADE, il vérifie automatiquement l’adresse IP à utiliser, au lieu de se comporter comme la cible SNAT qui se réfère simplement à l’unique adresse IP configurée. Par conséquent, la cible MASQUERADE permet de faire fonctionner un système d’adressage IP dynamique sous DHCP, que votre FAI devrait vous procurer pour des connexions à Internet de type PPP, PPPoE ou SLIP.
  • La cible REDIRECT est utilisée pour rediriger les paquets et les flux vers la machine elle-même. Ceci veut dire que nous pouvons, par exemple faire une redirection de tous les paquets destinés aux ports HTTP vers un proxy HTTP comme Squid, sur notre propre machine. Les paquets générés localement sont mappés vers les adresses 127.0.0.1. En d’autres termes, elle réécrit les adresses de destination vers votre propre machine pour les paquets qui sont transmis, ou quelque chose comme ça. La cible REDIRECT est très utile quand vous voulez, par exemple, faire du proxy transparent, où l’hôte du LAN n’a pas connaissance du proxy.
    Notez que la cible REDIRECT est uniquement valide dans les chaînes PREROUTING et OUTPUT de la table NAT. Elle est aussi valide dans les chaînes définies par l’utilisateur.

La table Filter

La table filter sert principalement à filtrer les paquets. Les paquets traversants la table Filter sont accepté (avec la cible ACCEPT) ou détruits (avec la cible DROP) selon leur contenu. Dans cette table, la quasi totalité des cibles sont utilisables.

Parcours des paquets

Analysons le parcours d’un paquet destiné à une application de la machine locale avant sa livraison.

Hôte local destinataire (votre propre machine)

Etape Table Chaîne Commentaire
1 Sur le câble (ex. Internet)
2 Arrive sur l’interface (ex. eth0)
3 raw PREROUTING Cette chaîne sert normalement à modifier les paquets : changer les bits de ToS, etc.
4 Lors du contrôle de code de connexion
5 mangle PREROUTING Chaîne principalement utilisée pour modifier les paquets : changement de ToS, etc.
6 NAT PREROUTING Cette chaîne sert principalement au DNAT. Évitez de filtrer dans cette chaîne puisqu’elle est court-circuitée dans certains cas.
7 Décision de routage : le paquet est-il destiné à notre hôte local, doit-il être réexpédié et où ?
8 mangle INPUT Ici, il atteint la chaîne INPUT de la table mangle. Cette chaîne permet de modifier les paquets, après leur routage, mais avant qu’ils soient réellement envoyés au processus de la machine.
9 filter INPUT C’est l’endroit où est effectué le filtrage du trafic entrant à destination de la machine locale. Notez bien que tous les paquets entrants et destinés à votre hôte passent par cette chaîne.
10 Processus/application local (programme client/serveur)

Hôte local source (votre propre machine)

Etape Table Chaîne Commentaire
1 Processus/application local (programme client/serveur)
2 Décision de routage. Quelle adresse source doit être utilisée, quelle interface de sortie, et d’autres informations nécessaires qui doivent être réunies.
3 raw OUTPUT C’est l’endroit où le traçage de connexion prend place pour les paquets générés localement. Vous pouvez marquer les connexions pour qu’elles ne soient pas tracées par exemple.
4 C’est ici que le traçage de connexion se situe pour les paquets générés localement, par exemple les changements d’état …
5 mangle OUTPUT C’est là où les paquets sont modifiés. Il est conseillé de ne pas filtrer dans cette chaîne, à cause de certains effets de bord.
6 NAT OUTPUT Cette chaîne permet de faire du NAT sur des paquets sortant du pare-feu.
7 Décision de routage, comment les modifications des mangle et NAT précédents peuvent avoir changé la façon dont les paquets seront routés.
8 filter OUTPUT C’est de là que les paquets sortent de l’hôte local.
9 mangle POSTROUTING La chaîne POSTROUTING de la table mangle est principalement utilisée lorsqu’on souhaite modifier des paquets avant leur envoi et après les décisions de routage. Cette chaîne est rencontrée par les paquets qui ne font que transiter par le pare-feu et par les paquets créés par le pare-feu lui-même.
10 NAT POSTROUTING C’est ici qu’est effectué le SNAT. Il est conseillé de ne pas filtrer à cet endroit à cause des effets de bord, certains paquets peuvent se faufiler même si un comportement par défaut a été défini pour la cible DROP.
11 Sort par une certaine interface (ex. eth0)
12 Sur le câble (ex. Internet)

Paquets redirigés

Etape Table Chaîne Commentaire
1 Sur le câble (ex. Internet)
2 Arrive sur l’interface (ex. eth0)
3 raw PREROUTING Ici vous pouvez placer une connexion qui ne sera pas interprétée par le système de traçage de connexion.
4 C’est ici que le traçage de connexion généré non-localement prend place, (cf La machine d’état)
5 mangle PREROUTING Cette chaîne est typiquement utilisée pour modifier les paquets, i.e. changer les bits de TOS, etc.
6 NAT PREROUTING Cette chaîne sert principalement à réaliser du DNAT. Le SNAT est effectué plus loin. Evitez de filtrer dans cette chaîne car elle peut être court-circuitée dans certains cas.
7 Décision de routage : le paquet est-il destiné à votre hôte local ? doit-il être redirigé ? où ?
8 mangle FORWARD Le paquet est envoyé à la chaîne FORWARD de la table mangle. Utilisé lorsque l’on souhaite modifier des paquets avant l’envoi du paquet entre la décision de routage initiale et la décision de routage finale.
9 filter FORWARD Le paquet est routé vers la chaîne FORWARD. Seuls les paquets réexpédiés arrivent ici, et c’est ici également que tout le filtrage est effectué. Notez bien que tout trafic redirigé passe par ici (et pas seulement dans un sens), donc vous devez y réfléchir en rédigeant vos règles.
10 mangle POSTROUTING Cette chaîne est employé pour des formes particulières de modification de paquets, que l’on veut appliquer postérieurement à toutes les décisions de routage, mais toujours sur cette machine.
11 NAT POSTROUTING Cette chaîne est employée principalement pour le SNAT. Évitez de faire du filtrage ici, car certains paquets peuvent passer cette chaîne sans être vérifiés. C’est aussi l’endroit où l’on fait du masquerading (masquage d’adresse).
12 Sort par l’interface de sortie (ex. eth1).
13 Sort de nouveau par le câble (ex. LAN).

N’utilisez pas la chaîne INPUT pour filtrer dans le scénario précédent ! INPUT n’a de sens que pour des paquets destinés à votre hôte local, autrement dit qui ne seront routés vers aucune autre destination.

Le système de pare feu

L’administration du pare feu utilise 4 modules du noyau selon le protocole employé

  • ip_tables pour le protocole IPv4
  • ip6_tables pour IPv6
  • arp_tables pour ARP
  • ebtables, spécifique aux trames Ethernet

Ces modules fournissent un système basé sur des tableaux qui définissent des règles de pare-feu pour filtrer ou transformer les paquets.
Ces tableaux peuvent être administrés par les outils utilisateur iptables, ip6tables, arptables et ebtables. Cette solution globale de gestion de pare-feu se nomme Xtables.

Netfilter packet flow

VN:F [1.9.22_1171]
Rating: 9.1/10 (7 votes cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)
IPtables et NetFilter, solution de pare-feu, 9.1 out of 10 based on 7 ratings
Be Sociable, Share!

Soutenez le blog :)

One Response to “IPtables et NetFilter, solution de pare-feu”

  1. 1
    crowd Says:

    Très bon article, comme le reste du blog d’ailleurs.
    Un grand merci

    VA:F [1.9.22_1171]
    Rating: 5.0/5 (1 vote cast)
    VA:F [1.9.22_1171]
    Rating: +2 (from 2 votes)

Leave a Reply