Conntrack : quand les health checks passent et que le trafic s'arrête
Un firewall stateful décide du chemin d'une connexion une fois, à sa création, de sorte qu'un flux de longue durée peut conserver une décision périmée pendant que chaque nouvelle sonde passe.
Dans cet article 5 sections
- Un firewall stateful prend la décision de forwarding et de NAT pour une connexion sur son premier paquet et la conserve dans la table d'états pour toute la vie du flux. Les changements de routage et de politique ne s'appliquent pas aux flux qui existent déjà.
- Un flux continu tel que syslog sur TCP, une réplication de base de données, un forwarder de métriques ou un tunnel peut tenir une connexion pendant des semaines. Si le réseau change dessous, ce flux garde l'ancienne décision pendant que les pings et les nouvelles connexions reçoivent la nouvelle, donc chaque vérification passe.
- Surveillez ce qui arrive, pas ce qui est up : les compteurs d'octets face au volume attendu, l'occupation de la table d'états, et une vérification de bout en bout que les données ont bien atterri. Un flux figé se répare en supprimant son entrée d'état, pas en redémarrant le firewall.
La décision est prise une seule fois
Le suivi de connexion existe pour qu'un firewall évalue la politique une fois par flux au lieu d'une fois par paquet. Le premier paquet est confronté aux règles, le résultat de forwarding et de NAT est écrit dans la table d'états, et chaque paquet suivant de ce flux n'est plus qu'une recherche dans une table de hachage. Le conntrack de netfilter, la table d'états de pf dans OPNsense et la table de connexions de Cisco Firepower fonctionnent tous ainsi. L'entrée vit jusqu'à la fermeture du flux ou l'expiration de son délai d'inactivité, et pour une connexion TCP établie ce délai se mesure en jours.
La conséquence est facile à manquer : un changement de routage, de règle NAT ou d'interface affecte le flux suivant, pas les flux déjà dans la table.
Deux façons de perdre du trafic en silence
Le chemin périmé. Une route change, une interface bouge, un pool NAT est modifié. Les nouvelles connexions prennent le nouveau chemin. Un flux de longue durée conserve son interface de sortie ou sa liaison NAT d'origine, donc ses paquets partent par l'ancienne voie, vers un prochain saut qui ne les transmet plus ou sans la traduction que l'autre extrémité attend désormais. La pile TCP de l'émetteur retransmet patiemment sur une connexion qu'elle considère toujours établie, le récepteur ne voit rien, et aucun processus d'un côté comme de l'autre n'a échoué.
La table pleine. nf_conntrack_max est atteint, généralement à cause d'un scanner, d'un client derrière NAT avec des milliers de flux courts, ou de délais longs sur une machine chargée. Le noyau journalise une ligne et commence à rejeter le premier paquet des nouvelles connexions pendant que les flux existants continuent. Un health check qui réutilise une connexion ouverte continue de passer ; les utilisateurs qui en ouvrent de nouvelles obtiennent des timeouts.
Ni l'un ni l'autre n'apparaît dans la supervision des processus. Le démon est up, le listener est lié, la règle est présente.
Pourquoi les health checks passent
Un ping, une sonde TCP connect et le simulateur de chemin d'un firewall créent chacun un nouveau flux ou évaluent la politique à neuf, donc chacun reçoit la décision actuelle et correcte. La lecture verte est vraie, mais sur le mauvais objet. La question à poser au firewall n'est pas ce qu'il ferait d'un nouveau paquet, mais ce qu'il fait des flux qu'il détient déjà.
# the live flows from one source, with their state and NAT binding
conntrack -L -s <source>
# how full the table is
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
# the kernel's own report of a full table
journalctl -k | grep -i 'nf_conntrack: table full'Un flux antérieur au dernier changement de routage et qui montre une sortie ou une traduction qu'aucune règle actuelle ne produirait est l'entrée à examiner.
Quoi surveiller
L'arrivée, pas la vivacité. Les lignes par minute qui atterrissent dans la base du collecteur, les messages par minute au récepteur syslog, une position de réplication qui avance. Une ligne plate est l'alarme, quoi que dise l'état du processus.
Les compteurs face à l'attendu. Le compteur d'octets de la règle qui porte un flux croît à peu près au rythme du flux. Une règle qui devrait être occupée et qui est presque plate signifie que les paquets correspondent à une autre règle ou n'arrivent pas du tout.
L'occupation de la table d'états. Alertez sur nf_conntrack_count en fraction de nf_conntrack_max bien avant qu'elle ne se remplisse, et sur le message « table full » du noyau, qui sinon reste dans le journal sans être lu.
Des vérifications synthétiques à la forme du vrai trafic. Une sonde qui tient une connexion de longue durée et y pousse un enregistrement à intervalles réguliers, vérifié à l'autre extrémité, teste la chose qui casse. Un ping frais teste celle qui ne casse pas.
Après chaque changement de routage ou de NAT, listez les flux plus anciens que le changement et décidez délibérément de les vider ou non.
Le correctif est un scalpel
Supprimez l'état de la source concernée. Le paquet suivant crée une entrée fraîche avec la décision actuelle et le flux reprend.
conntrack -D -s <source>Un redémarrage ou une vidange complète fonctionne aussi, et emporte toutes les autres connexions actives avec lui. Pour une table pleine, le correctif consiste à augmenter nf_conntrack_max en même temps que la taille du hachage, à raccourcir le délai des connexions établies là où des jours ne sont pas nécessaires, et à trouver le client qui crée les flux.
Réponses directes
Pourquoi le firewall dit-il « allow » alors qu'aucun trafic ne passe ?+
Le simulateur de chemin calcule ce qu'obtiendrait un nouveau paquet. Un flux existant est lié à la décision prise à sa création, et le simulateur ne lit pas la table d'états. Videz les flux actifs de cette source et comparez leur sortie et leur traduction avec ce que les règles actuelles produiraient.
Pourquoi le ping fonctionne-t-il quand le flux applicatif ne fonctionne pas ?+
Le ping crée des flux de courte durée qui expirent en quelques secondes, donc chacun reçoit une décision fraîche. Le flux applicatif tient une seule connexion de longue durée et garde la décision avec laquelle il est né.
Comment trouver une connexion bloquée sur la mauvaise interface ?+
conntrack -L filtré par source sur netfilter, la vue de la table d'états sur pf ou Firepower. Cherchez les flux plus anciens que le dernier changement réseau dont la sortie ou la liaison NAT ne correspond à aucune règle actuelle.
Comment corriger sans redémarrer le firewall ?+
Supprimez les entrées d'état de cette source avec conntrack -D. Le paquet suivant est évalué à neuf. Tout le reste de la table n'est pas touché.
Un flux s'est tu alors que toutes les vérifications sont au vert ?
Parlez à un ingénieur qui lit la table d'états, pas le simulateur.
Parler à un ingénieurVous êtes arrivé à la fin.
Mettez la lecture en pratique
Que faites-vous tourner ?
Parlez-nous de la charge de travail, du trafic et des exigences de reprise. Commencez par le configurateur de serveur, ou passez en revue les détails avec un ingénieur.
Écrit par les ingénieurs qui construisent et exploitent l'infrastructure qu'il décrit.Parler à un ingénieur
