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.