Une plongée approfondie dans l’architecture Iptables et Netfilter

introduction

firewalls sont un outil important qui peut être configuré pour protéger vos serveurs et votre infrastructure. Dans l’écosystème Linux, + iptables + est un outil de pare-feu largement utilisé qui s’interface avec la structure de filtrage de paquets `+ netfilter + 'du noyau. Pour les utilisateurs et les administrateurs qui ne comprennent pas l’architecture de ces systèmes, la création de stratégies de pare-feu fiables peut être décourageante, non seulement en raison d’une syntaxe difficile, mais également en raison du nombre de parties interdépendantes présentes dans la structure.

Dans ce guide, nous allons nous plonger dans l’architecture + iptables + dans le but de la rendre plus compréhensible pour les utilisateurs ayant besoin de créer leurs propres stratégies de pare-feu. Nous discuterons de la manière dont + iptables + interagit avec + netfilter + et de la manière dont les divers composants s’intègrent pour fournir un système complet de filtrage et de filtrage.

Que sont IPTables et Netfilter?

Le logiciel de pare-feu de base le plus couramment utilisé sous Linux s’appelle + iptables +. Le pare-feu + iptables fonctionne en interagissant avec les crochets de filtrage de paquets de la pile réseau du noyau Linux. Ces hooks de noyau sont connus sous le nom de framework + netfilter +.

Chaque paquet qui entre dans le système de réseau (entrant ou sortant) déclenchera ces points d’ancrage à mesure qu’il progressera dans la pile, permettant ainsi aux programmes qui s’enregistrent avec ces points d’interagir avec le trafic aux points clés. Les modules du noyau associés à + ​​iptables + s’enregistrent à ces points d’ancrage afin de garantir la conformité du trafic aux conditions définies par les règles du pare-feu.

Crochets Netfilter

Il existe cinq points d’ancrage + netfilter + auxquels les programmes peuvent s’inscrire. Au fur et à mesure que les paquets progressent dans la pile, ils déclencheront les modules du noyau qui se sont inscrits avec ces points d’ancrage. Les raccords qu’un paquet va déclencher dépendent du fait que le paquet est entrant ou sortant, de la destination du paquet et du fait que le paquet a été abandonné ou rejeté à un moment précédent.

Les crochets suivants représentent divers points bien définis de la pile de mise en réseau:

  • + NF_IP_PRE_ROUTING +: Ce hook sera déclenché par tout trafic entrant très bientôt après être entré dans la pile réseau. Ce raccordement est traité avant que toute décision de routage ait été prise concernant l’endroit où envoyer le paquet.

  • + NF_IP_LOCAL_IN +: Ce hook est déclenché après le routage d’un paquet entrant si celui-ci est destiné au système local.

  • + NF_IP_FORWARD +: Ce hook est déclenché après l’acheminement d’un paquet entrant si celui-ci doit être transmis à un autre hôte.

  • + NF_IP_LOCAL_OUT +: ce hook est déclenché par tout trafic sortant créé localement dès qu’il atteint la pile réseau.

  • + NF_IP_POST_ROUTING +: Ce raccordement est déclenché par tout trafic sortant ou transféré après le routage et juste avant d’être mis en attente.

Les modules du noyau souhaitant s’inscrire à ces points d’ancrage doivent fournir un numéro de priorité pour aider à déterminer l’ordre dans lequel ils seront appelés lors du déclenchement du point d’ancrage. Cela permet de connecter plusieurs modules (ou plusieurs instances du même module) à chacun des points d’ancrage avec un ordre déterministe. Chaque module sera appelé à son tour et renverra une décision au framework + netfilter + après traitement qui indique ce qui doit être fait avec le paquet.

Tables et chaînes IPTables

Le pare-feu + iptables + utilise des tables pour organiser ses règles. Ces tableaux classent les règles en fonction du type de décisions qu’elles prennent. Par exemple, si une règle traite de la traduction d’adresse réseau, elle sera placée dans la table + nat +. Si la règle est utilisée pour décider si le paquet doit continuer jusqu’à sa destination, il sera probablement ajouté à la table + filter +.

Dans chaque table + iptables +, les règles sont ensuite organisées dans des «chaînes» séparées. Alors que les tables sont définies par l’objectif général des règles qu’elles contiennent, les chaînes intégrées représentent les hooks + netfilter + qui les déclenchent. Les chaînes déterminent fondamentalement les règles when qui seront évaluées.

Comme vous pouvez le constater, les noms des chaînes intégrées reflètent les noms des hooks + netfilter + auxquels ils sont associés:

  • + PREROUTING +: Déclenché par le hook + NF_IP_PRE_ROUTING +.

  • + INPUT +: Déclenché par le hook + NF_IP_LOCAL_IN +.

  • + FORWARD +: Déclenché par le hook + NF_IP_FORWARD +.

  • + OUTPUT +: Déclenché par le hook + NF_IP_LOCAL_OUT +.

  • + POSTROUTING +: Déclenché par le hook + NF_IP_POST_ROUTING +.

Les chaînes permettent à l’administrateur de contrôler où une règle sera évaluée dans le chemin de livraison d’un paquet. Chaque table ayant plusieurs chaînes, l’influence d’une table peut être exercée à différents moments du traitement. Certains types de décisions n’ayant de sens qu’à certains endroits de la pile réseau, aucune chaîne ne sera enregistrée dans une table avec chaque hook du noyau.

Il n’y a que cinq hooks + netfilter + dans le noyau, donc les chaînes de plusieurs tables sont enregistrées sur chacun des hooks. Par exemple, trois tables ont des chaînes + PREROUTING +. Lorsque ces chaînes s’enregistrent au crochet associé "+ NF_IP_PRE_ROUTING ", elles spécifient une priorité qui détermine l’ordre dans lequel la chaîne " PREROUTING " de chaque table est appelée. Chacune des règles de la chaîne ` PREROUTING ` de priorité la plus élevée est évaluée séquentiellement avant de passer à la chaîne ` PREROUTING +` suivante. Nous allons examiner l’ordre spécifique de chaque chaîne dans un moment.

Quelles tables sont disponibles?

Revenons un instant en arrière et jetons un coup d’œil aux différentes tables fournies par + iptables +. Celles-ci représentent des ensembles distincts de règles, organisées par domaine de préoccupation, pour évaluer les paquets.

La table de filtrage

La table de filtrage est l’une des tables les plus utilisées dans + iptables +. La table + filter + est utilisée pour décider si un paquet doit continuer jusqu’à la destination voulue ou pour refuser sa demande. Dans le langage du pare-feu, on parle de «filtrage» des paquets. Ce tableau fournit l’essentiel des fonctionnalités auxquelles les utilisateurs pensent lorsqu’ils discutent des pare-feu.

La table NAT

La table + nat + est utilisée pour implémenter des règles de traduction d’adresses réseau. Lorsque les paquets entrent dans la pile réseau, les règles de ce tableau détermineront si et comment modifier les adresses source ou de destination du paquet afin d’avoir une incidence sur la façon dont le paquet et le trafic de réponse sont acheminés. Ceci est souvent utilisé pour acheminer des paquets vers des réseaux lorsque l’accès direct n’est pas possible.

La table Mangle

Le tableau + mangle + est utilisé pour modifier les en-têtes IP du paquet de différentes manières. Par exemple, vous pouvez ajuster la valeur TTL (Time to Live) d’un paquet, en allongeant ou en raccourcissant le nombre de sauts réseau valides que le paquet peut supporter. D’autres en-têtes IP peuvent être modifiés de la même manière.

Cette table peut également placer une «marque» interne du noyau sur le paquet pour un traitement ultérieur dans d’autres tables et par d’autres outils réseau. Cette marque ne touche pas le paquet réel, mais ajoute la marque à la représentation du paquet par le noyau.

La table brute

Le pare-feu + iptables + est dynamique, ce qui signifie que les paquets sont évalués en fonction de leur relation avec les paquets précédents. Les fonctionnalités de suivi de connexion construites au-dessus de la structure + netfilter + permettent à + ​​iptables + de voir les paquets dans le cadre d’une connexion ou d’une session en cours plutôt que sous la forme d’un flux de paquets discrets, non liés. La logique de suivi de connexion est généralement appliquée très rapidement après que le paquet a frappé l’interface réseau.

La table + raw + a une fonction très étroitement définie. Son seul but est de fournir un mécanisme de marquage des paquets afin de désactiver le suivi de connexion.

La table de sécurité

La table + security + est utilisée pour définir les marques internes du contexte de sécurité SELinux sur les paquets, ce qui affectera la manière dont SELinux ou d’autres systèmes pouvant interpréter les contextes de sécurité SELinux traitent les paquets. Ces marques peuvent être appliquées par paquet ou par connexion.

Quelles chaînes sont implémentées dans chaque table?

Nous avons parlé des tables et des chaînes séparément. Voyons quelles chaînes sont disponibles dans chaque tableau. Cette discussion implique une autre discussion sur l’ordre d’évaluation des chaînes enregistrées dans le même crochet. Si trois tables ont des chaînes + PREROUTING +, dans quel ordre sont-elles évaluées?

Le tableau suivant indique les chaînes disponibles dans chaque tableau + iptables + lors de la lecture de gauche à droite. Par exemple, nous pouvons dire que la table + raw + a à la fois les chaînes + PREROUTING + et + + OUTPUT +. Lorsqu’elle est lue de haut en bas, elle affiche également l’ordre dans lequel chaque chaîne est appelée lorsque le hook + netfilter + associé est déclenché.

Quelques choses devraient être notées. Dans la représentation ci-dessous, la table + nat + a été divisée entre les opérations + DNAT + (celles qui modifient l’adresse de destination d’un paquet) et les opérations + SNAT + (celles qui modifient l’adresse source) afin d’afficher leur commander plus clairement. Nous avons également inclus des lignes qui représentent des points où les décisions de routage sont prises et où le suivi de connexion est activé afin de donner une vue plus globale des processus en cours:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING

(routing decision)

raw

(connection tracking enabled)

mangle

nat (DNAT)

(routing decision)

filter

security

nat (SNAT)

Lorsqu’un paquet déclenche un hook + netfilter +, les chaînes associées seront traitées telles qu’elles sont répertoriées dans le tableau ci-dessus de haut en bas. Les crochets (colonnes) qu’un paquet va déclencher dépendent du type de paquet entrant ou sortant, des décisions de routage prises et du critère de filtrage appliqué.

Certains événements feront en sorte que la chaîne d’une table soit ignorée lors du traitement. Par exemple, seul le premier paquet d’une connexion sera évalué par rapport aux règles NAT. Toutes les décisions "+ nat +" prises pour le premier paquet seront appliquées à tous les paquets suivants de la connexion sans évaluation supplémentaire. Dans les réponses aux connexions NAT, les règles NAT inversées seront automatiquement appliquées pour acheminer correctement.

Ordre de traversée de la chaîne

En supposant que le serveur sache comment router un paquet et que les règles du pare-feu autorisent sa transmission, les flux suivants représentent les chemins qui seront parcourus dans différentes situations:

  • * Paquets entrants destinés au système local *: + PREROUTING →` + INPUT`

  • * Les paquets entrants destinés à un autre hôte *: + PREROUTING ++ FORWARD ++ POSTROUTING +

  • * Paquets générés localement *: + OUTPUT ++ POSTROUTING +

Si nous combinons les informations ci-dessus avec l’ordre présenté dans le tableau précédent, nous pouvons voir qu’un paquet entrant destiné au système local sera d’abord évalué par rapport aux chaînes + PREROUTING + des chaînes + raw +, '+ mangle + ` et les tables + nat +. Il traversera ensuite les chaînes + INPUT + des tables + mangle +, + filter +, '+ security + et + nat + `avant d’être finalement livrées au socket local.

Règles IPTables

Les règles sont placées dans une chaîne spécifique d’une table spécifique. Chaque paquet étant appelé, le paquet en question sera comparé dans l’ordre à chaque règle de la chaîne. Chaque règle a un composant correspondant et un composant d’action.

Correspondant à

La partie correspondante d’une règle spécifie les critères auxquels un paquet doit satisfaire pour que l’action associée (ou «cible») soit exécutée.

Le système de correspondance est très flexible et peut être étendu de manière significative avec les extensions + iptables + disponibles sur le système. Les règles peuvent être construites pour correspondre au type de protocole, à la destination ou à l’adresse source, au port source ou destination, au réseau source ou destination, à l’interface d’entrée ou de sortie, aux en-têtes ou à l’état de la connexion, entre autres critères. Ceux-ci peuvent être combinés pour créer des ensembles de règles assez complexes permettant de distinguer différents trafics.

Les cibles

Une cible est l’action qui est déclenchée lorsqu’un paquet répond aux critères de correspondance d’une règle. Les cibles sont généralement divisées en deux catégories:

  • * Cibles de terminaison *: les cibles de terminaison exécutent une action qui termine l’évaluation dans la chaîne et renvoie le contrôle au point d’ancrage + netfilter +. Selon la valeur de retour fournie, le point d’ancrage peut abandonner le paquet ou permettre au paquet de continuer à l’étape suivante du traitement.

  • * Cibles non terminées *: Les cibles non terminées exécutent une action et poursuivent l’évaluation au sein de la chaîne. Bien que chaque chaîne doive finalement renvoyer une décision finale, vous pouvez exécuter au préalable un nombre quelconque de cibles non terminantes.

La disponibilité de chaque cible dans les règles dépend du contexte. Par exemple, le type de table et de chaîne peut dicter les cibles disponibles. Les extensions activées dans la règle et les clauses de correspondance peuvent également affecter la disponibilité des cibles.

Sauter aux chaînes définies par l’utilisateur

Il convient de mentionner une classe spéciale de cibles non terminantes: la cible de saut. Les cibles de saut sont des actions qui entraînent le passage de l’évaluation à une chaîne différente pour un traitement supplémentaire. Nous avons beaucoup parlé des chaînes intégrées qui sont intimement liées aux hooks + netfilter + qui les appellent. Cependant, + iptables + permet également aux administrateurs de créer leurs propres chaînes à des fins d’organisation.

Les règles peuvent être placées dans des chaînes définies par l’utilisateur de la même manière qu’elles peuvent être placées dans des chaînes intégrées. La différence est que les chaînes définies par l’utilisateur ne peuvent être atteintes qu’en "leur sautant" à partir d’une règle (elles ne sont pas enregistrées avec un hook + netfilter +).

Les chaînes définies par l’utilisateur agissent comme de simples extensions de la chaîne qui les a appelées. Par exemple, dans une chaîne définie par l’utilisateur, l’évaluation sera renvoyée à la chaîne d’appel si la fin de la liste de règles est atteinte ou si une cible + RETURN + est activée par une règle correspondante. L’évaluation peut également accéder à d’autres chaînes définies par l’utilisateur.

Cette construction permet une plus grande organisation et fournit le cadre nécessaire à une création de branche plus robuste.

IPTables et suivi de connexion

Nous avons introduit le système de suivi des connexions implémenté par-dessus le framework + netfilter + lorsque nous avons discuté du tableau + raw + et des critères de correspondance des états de connexion. Le suivi de connexion permet à + ​​iptables + de prendre des décisions concernant les paquets vus dans le contexte d’une connexion en cours. Le système de suivi de connexion fournit + iptables + avec la fonctionnalité nécessaire pour effectuer des opérations «avec état».

Le suivi des connexions est appliqué très rapidement après l’entrée des paquets dans la pile réseau. Les chaînes de table + raw + et certaines vérifications de base sont la seule logique exécutée sur les paquets avant de les associer à une connexion.

Le système vérifie chaque paquet par rapport à un ensemble de connexions existantes. Il mettra à jour l’état de la connexion dans son magasin si nécessaire et ajoutera de nouvelles connexions au système si nécessaire. Les paquets marqués avec la cible + NOTRACK + dans l’une des chaînes + raw + contourneront les routines de suivi des connexions.

États disponibles

Les connexions suivies par le système de suivi des connexions auront l’un des états suivants:

  • + NEW +: Quand un paquet arrive qui n’est pas associé à une connexion existante, mais qui n’est pas invalide en tant que premier paquet, une nouvelle connexion sera ajoutée au système avec cette étiquette. Cela se produit aussi bien pour les protocoles avec connexion tels que TCP que pour les protocoles sans connexion avec UDP.

  • + ESTABLISHED +: Une connexion est modifiée de + NEW + à + ​​ESTABLISHED + lorsqu’elle reçoit une réponse valide dans le sens opposé. Pour les connexions TCP, cela signifie un "+ SYN / ACK +" et pour le trafic UDP et ICMP, cela signifie une réponse dans laquelle la source et la destination du paquet d’origine sont commutées.

  • + RELATED +: les paquets qui ne font pas partie d’une connexion existante, mais qui sont associés à une connexion déjà présente dans le système sont étiquetés + RELATED +. Cela pourrait signifier une connexion auxiliaire, comme c’est le cas avec les connexions de transmission de données FTP, ou il pourrait s’agir de réponses ICMP à des tentatives de connexion par d’autres protocoles.

  • + INVALID +: les paquets peuvent être marqués + INVALID + s’ils ne sont pas associés à une connexion existante et ne sont pas appropriés pour ouvrir une nouvelle connexion, s’ils ne peuvent pas être identifiés ou s’ils ne peuvent pas être routés.

  • + UNTRACKED +: les paquets peuvent être marqués comme '+ UNTRACKED + s’ils ont été ciblés dans une chaîne de tables + raw + `pour contourner le suivi.

  • + SNAT +: Un état virtuel défini lorsque l’adresse source a été modifiée par des opérations NAT. Ceci est utilisé par le système de suivi de connexion afin qu’il sache changer les adresses source dans les paquets de réponse.

  • + DNAT +: Etat virtuel défini lorsque l’adresse de destination a été modifiée par des opérations NAT. Ceci est utilisé par le système de suivi de connexion pour qu’il sache redéfinir l’adresse de destination lors du routage des paquets de réponse.

Les états suivis dans le système de suivi des connexions permettent aux administrateurs d’élaborer des règles qui ciblent des points spécifiques de la vie d’une connexion. Cela fournit la fonctionnalité nécessaire pour des règles plus complètes et sécurisées.

Conclusion

La structure de filtrage de paquets + netfilter + et le pare-feu + iptables + constituent la base de la plupart des solutions de pare-feu sur les serveurs Linux. Les hooks du noyau + netfilter + sont suffisamment proches de la pile réseau pour permettre un contrôle puissant des paquets traités par le système. Le pare-feu + iptables + exploite ces fonctionnalités pour fournir une méthode flexible et extensible de communication des exigences de règles au noyau. En apprenant comment ces éléments s’assemblent, vous pouvez mieux les utiliser pour contrôler et sécuriser vos environnements de serveur.

Si vous souhaitez en savoir plus sur la manière de choisir des règles efficaces + iptables +, visitez https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to- secure-your-servers [ce guide].

Ces guides peuvent vous aider à commencer à mettre en œuvre vos règles de pare-feu + iptables +: