glossaire

Conntrack (suivi de connexions Linux)

Conntrack (connection tracking) est le sous-système de Netfilter, dans le noyau Linux, qui maintient une table de toutes les connexions réseau traversant la machine. C’est lui qui rend possibles le firewalling avec état (« accepter les paquets d’une connexion déjà établie ») et le NAT, qui doit se souvenir de chaque traduction d’adresse pour l’appliquer aux paquets suivants.

Fonctionnement

Chaque entrée de la table identifie un flux par son tuple (protocole, adresses et ports source et destination) et porte un état — NEW, ESTABLISHED, RELATED — ainsi qu’un délai d’expiration. Les protocoles sans état comme UDP sont suivis eux aussi : le noyau crée une entrée par pseudo-flux et la fait expirer après un timeout court. Une requête DNS crée donc une entrée conntrack, exactement comme une connexion TCP.

La limite qui compte : nf_conntrack_max

La table est bornée par le paramètre nf_conntrack_max. Quand elle est pleine, le noyau jette les paquets des nouvelles connexions et journalise nf_conntrack: table full, dropping packet. Vu de l’application, rien ne distingue cela d’une panne réseau : timeouts et connexions refusées, alors que la machine est par ailleurs saine. La valeur par défaut est calculée d’après la mémoire disponible et peut être relevée (chaque entrée coûte quelques centaines d’octets de mémoire noyau) ; les timeouts par protocole sont également réglables, comme nf_conntrack_tcp_timeout_established, à cinq jours par défaut.

Pourquoi c’est partout sur Kubernetes

kube-proxy, en mode iptables comme en mode IPVS, s’appuie sur le NAT — donc sur conntrack — pour router le trafic des Services vers les pods. Chaque connexion qui traverse un Service consomme des entrées dans la table du nœud, et le trafic DNS interne du cluster en génère en volume. Un défaut connu du noyau sur l’insertion simultanée d’entrées UDP (compteur insert_failed) est par ailleurs la cause classique des timeouts DNS de 5 secondes observés dans les clusters.

L’observer

L’outil conntrack -L liste la table ; /proc/sys/net/netfilter/nf_conntrack_count et nf_conntrack_max donnent le remplissage et la limite. node_exporter les expose sous node_nf_conntrack_entries et node_nf_conntrack_entries_limit : le ratio des deux est une alerte simple et rentable sur n’importe quel parc.