Conntrack, namespaces et supervision
Sous Linux, chaque namespace réseau a sa propre table Conntrack, complètement isolées entre elles. Elles se rejoignent en revanche sur la taille maximale, partout la même, et configurable uniquement en sysctl (voir le fichier /proc/sys/net/netfilter/nf_conntrack_max
). Ainsi, une modification de taille effectué depuis n'importe quel namespace aura des conséquences partout.
Apparemment pour des raisons de compatibilité avec de noyaux, notre supervision lisait un alias de ce fichier, sous le chemin /proc/sys/net/nf_conntrack_max
(les chemins précédents en ip_conntrack
ayant été supprimés en 2016). Contrairement au « véritable » fichier dans le dossier netfilter, celui-ci n'est exporté que sur le namespace principal :
$ cat /proc/sys/net/netfilter/nf_conntrack_max
262144
$ ip netns exec namespace1 cat /proc/sys/net/nf_conntrack_max
cat: /proc/sys/net/nf_conntrack_max: No such file or directory
$ ip netns exec namespace1 cat /proc/sys/net/netfilter/nf_conntrack_max
262144
Quitte à regarder cette partie de notre supervision, nous avons décidé d'harmoniser la récupération du nombre d'entrées (que nous récupérions en netlink) avec la récupération du nombre maximum. C'est l'idée derrière ce patch.
Signe que nous n'étions probablement pas les seuls à avoir ce besoin, un contributeur externe a ajouté la gestion par pyroute2 avant que nous ayons intégré cette partie de notre côté.
En problème relié à tout ça, on peut également noter qu'openvswitch permet depuis peu de limiter le nombre d'entrées conntrack par zone.