Les entrées de conntrack

Examinons rapidement le contenu d'une donnée d'entrée de conntrack et lisons-la dans /proc/net/ip_conntrack. Ce lien contient une liste de toutes les entrées actuelles de la base de données de conntrack. Si vous avez chargé le module ip_conntrack, faites un cat de /proc/net/ip_conntrack pour obtenir quelque-chose comme ceci :

tcp      6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
     dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
     dport=32775 [ASSURED] use=2
     

Cet exemple contient toute l'information gérée par le module conntrack pour savoir dans quel état se trouve une connexion. Tout d'abord, il y a le protocole, ici tcp. Ensuite, encore le protocole mais codé en décimal. Après cela, on voit combien de temps doit survivre cette entrée de conntrack. La valeur à cet instant est de 117 secondes, elle est decrémentée régulièrement jusqu'à ce qu'on voit à nouveau du trafic pour cette connexion. Cette valeur est alors réinitialisée à la valeur par défaut pour l'état en question à cet instant donné. Ensuite vient l'état actuel de cette entrée. Dans le cas présenté ci-dessus, on visualise une connexion qui est dans l'état SYN_SENT. La valeur interne d'une connexion est légèrement différente de celles utilisées en externe avec iptables. La valeur SYN_SENT indique que cette connexion a seulement vu un paquet TCP SYN dans une direction. Puis, on voit l'adresse IP source, l'adresse IP destination, le port source et le port destination. Arrivé à ce niveau, on voit un mot-clé spécifique qui signale qu'aucun trafic n'a été observé en retour pour cette connexion. Enfin, on voit ce qui est attendu pour les paquets en réponse. Entre autres, l'adresse IP source et l'adresse IP destination (qui sont inversées, puisque le paquet attendu doit être dirigé dans l'autre sens). La même chose s'applique au port source et port destination de la connexion. Ces valeurs nous intéressent particulièrement.

Les entrées du traçage de connexion peuvent prendre un ensemble de valeurs différentes, toutes spécifiées dans les en-têtes de conntrack et disponibles dans les fichiers linux/include/netfilter-ipv4/ip_conntrack*.h. Ces valeurs dépendent du sous-protocole IP qu'on utilise. Les protocoles TCP, UDP et ICMP correspondent à des valeurs fixées et spécifiées dans le fichier linux/include/netfilter-ipv4/ip_conntrack.h. Ceci sera analysé plus en détails lors de l'analyse de chaque protocole ; cependant, ils ne seront pas employés intensivement dans ce chapitre, puisqu'ils ne sont pas utilisés en dehors du fonctionnement interne de conntrack. Ainsi, en fonction de l'évolution de cet état, on change la valeur du temps restant avant la destruction de la connexion.

Note

Récemment, un nouveau patch est devenu disponible dans patch-o-matic, appelé tcp-window-tracking. Il ajoute, entre autres, toutes les temporisations précitées aux variables spéciales sysctl, ce qui signifie qu'elles peuvent être modifiées à la volée, alors que le système est toujours en fonctionnement. Par conséquent, il ne devient plus indispensable de recompiler le noyau à chaque changement dans les temporisations.

Tout ceci peut être modifié par le biais d'appels système spécifiques, disponibles dans le répertoire /proc/sys/net/ipv4/netfilter. Vous devriez regarder en particulier les variables /proc/sys/net/ipv4/netfilter/ip_ct_*.

Quand une connexion a observé du trafic dans les deux directions, l'entrée de conntrack efface le fanion [UNREPLIED], et donc le réinitialise. Elle le remplace par le fanion [ASSURED], vers la fin. Il signale que cette connexion est confirmée, donc elle ne sera pas supprimée si on atteint le maximum de connexions tracées possible. En fait, les connexions estampillées [ASSURED] ne seront pas supprimées, au contraire des connexions non confirmées (sans le fanion [ASSURED]). Le nombre maximum de connexions gérées par la table de traçage de connexion dépend d'une variable qui peut être définie à l'aide de la fonction ip-sysctl dans les noyaux récents. La valeur par défaut prise en charge varie fortement avec la quantité de mémoire disponible. Avec 128 Mo de RAM, vous pourrez avoir 8192 entrées possibles, et avec 256 Mo, ce sera 16376 entrées. Vous pouvez lire et définir vos réglages à l'aide de /proc/sys/net/ipv4/ip_conntrack_max.

Un moyen différent de faire ceci, plus efficace, est de placer la taille de la fonction de hachage pour le module ip_conntrack une fois qu'il est chargé. Dans des circonstances normales ip_conntrack_max égale 8 * la taille de la fonction de hachage. En d'autres termes, placer cette taille à 4096 fera que ip_conntrack_max aura 32768 entrées conntrack. Un exemple de ce qui pourrait être :

work3:/home/blueflux# modprobe ip_conntrack hashsize=4096
work3:/home/blueflux# cat /proc/sys/net/ipv4/ip_conntrack_max
32768
work3:/home/blueflux#