Le module kernel «conntrack» est absolument essentiel pour Netfilter. Il entre en jeudans de nombreuses situations:
Quelques manipulations permettront de mieux comprendre le processus.
La cible «MASQUERADE» du «POSTROUTING», c'est du NAT (Network Address Translation) et plus précisément du DNAT (Destination NAT) juste un peu plus sophistiqué. Il mérite que l'on se penche sur son fonctionnement en partant d'un exemple simple. Une station de notre LAN vert 192.168.61.101 effectue un ping sur 172.127.20.195 et dans le même temps, une autre station: 192.168.61.102 fait la même chose, mais sur 51.68.121.59. Les paquets doivent donc transiter par notre routeur NAT qui dispose de l'adresse 192.168.61.1 dans le LAN vert et de 192.168.60.200 dans le LAN orange.
Wireshark espionne ce qu'il se passe sur les deux côtés du routeur:
No. Source Destination Info 3 192.168.61.102 51.68.121.59 Echo (ping) request 1 192.168.60.200 51.68.121.59 Echo (ping) request) 2 51.68.121.59 192.168.60.200 Echo (ping) reply 4 51.68.121.59 192.168.61.102 Echo (ping) reply 6 192.168.61.101 172.217.20.195 Echo (ping) request 5 192.168.60.200 172.217.20.195 Echo (ping) request 8 172.217.20.195 192.168.60.200 Echo (ping) reply 7 172.217.20.195 192.168.61.101 Echo (ping) replyLes trames ont été reclassées pour faciliter la lecture.
Dans le même temps le même processus se produit entre 192.168.61.101 et 172.217.20.195 et le routeur ne mélange pas les deux processus qui sont pourtant formellement identiques. Par quel prodige ?
C'est le module «conntrack» qui fait le travail et il existe un outil spécifique, nommé justement conntrack
:
The conntrack utility provides a full-featured userspace interface to the Netfilter connection tracking system…
Celui-ci va permettre d'y voir plus clair en affichant la table des suivis de connexion du module kernel «conntrack»
conntrack --dump --any-nat icmp 1 19 src=192.168.61.101 dst=172.217.20.195 type=8 code=0 id=613 src=172.217.20.195 dst=192.168.60.200 type=0 code=0 id=613 mark=0 use=1 icmp 1 18 src=192.168.61.102 dst=51.68.121.59 type=8 code=0 id=889 src=51.68.121.59 dst=192.168.60.200 type=0 code=0 id=889 mark=0 use=1Chaque ligne correspond à un échange spécifique.
Déjà, conntrack a repéré qu'il s'agit d'une trame contenant de l'ICMP et identifie dans les deux cas.
La première ligne concerne l'échange entre 192.168.61.101 et 172.217.20.195:
id=613
que l'on retrouve identique dans la seconde moitié de la ligne.Dans la seconde ligne, nous retrouvons l'équivalent pour le couple 192.168.61.101 - 172.217.20.195, mais avec un id=889. Pas besoin de chercher longtemps pour comprendre que c'est cet identifiant qui permet à conntrack de ne pas se mélanger les adresses. Mais d'où vient cet identifiant ?
Frame 6: ... Internet Protocol Version 4, Src: 192.168.61.101, Dst: 172.217.20.195 ... Source Address: 192.168.61.101 Destination Address: 172.217.20.195 ... Internet Control Message Protocol Type: 8 (Echo (ping) request) Code: 0 Checksum: 0x83bf [correct] Identifier (BE): 613 (0x0265) Identifier (LE): 25858 (0x6502) Sequence Number (BE): 1 (0x0001) Sequence Number (LE): 256 (0x0100) [Response frame: 7] Timestamp from icmp data: Apr 1, 2025 11:27:40.000000000 CEST Data (48 bytes) Frame 7: ... Internet Protocol Version 4, Src: 172.217.20.195, Dst: 192.168.61.101 ... Internet Control Message Protocol Type: 0 (Echo (ping) reply) Code: 0 Checksum: 0x8bbf [correct] Identifier (BE): 613 (0x0265) Identifier (LE): 25858 (0x6502) Sequence Number (BE): 1 (0x0001) Sequence Number (LE): 256 (0x0100) Timestamp from icmp data: Apr 1, 2025 11:27:40.000000000 CEST Data (48 bytes)Nous avons évoqué plus haut que les en-têtes ICMP variaient en fonction du message. Il apparaît que dans le cas du ping, un champ «Sequence Number» y est ajouté.
En résumé, conntrack dans cet exemple:
En réalisant une étude similaire , nous pourrons mettre en évidence les stratégies pour un dialogue UDP ou TCP
Le client 192.168.61.102 effectue une requête http sur 51.68.121.59 puis interroge le DNS 8.8.8.8. Les traces se retrouvent dans le conntrack:
conntrack --dump --any-nat udp 17 25 src=192.168.61.102 dst=8.8.8.8 sport=36512 dport=53 src=8.8.8.8 dst=192.168.60.200 sport=53 dport=36512 mark=0 use=1 udp 17 25 src=192.168.61.102 dst=8.8.8.8 sport=50725 dport=53 src=8.8.8.8 dst=192.168.60.200 sport=53 dport=50725 mark=0 use=1 udp 17 25 src=192.168.61.102 dst=8.8.8.8 sport=48203 dport=53 src=8.8.8.8 dst=192.168.60.200 sport=53 dport=48203 mark=0 use=1 tcp 6 38 TIME_WAIT src=192.168.61.102 dst=51.68.121.59 sport=56092 dport=80 src=51.68.121.59 dst=192.168.60.200 sport=80 dport=56092 [ASSURED] mark=0 use=1 conntrack v1.4.7 (conntrack-tools): 4 flow entries have been shown.Aussi bien en UDP qu'en TCP, les numéro de port de la source sont suffisants pour identifier les couples qui discutent.
Bien entendu, la table de suivi de connexions se rafraîchit avec les nouvelles connexions, mais efface également celles qui n'ont plus été utilisées pendant «un certain temps»
L'outil conntrack
permet d'étudier encore plus en profondeur ce que le kernel voit passer à la condition que des règles de filtrage mettant en œuvre le suivi de connexions soient activées. Si le cœur vous en dit:
apt install conntrack man conntrack
C'est un cas relativement peu fréquent, qui n’apparaît qu'avec certains protocoles applicatifs comme FTP où une connexion assure les commandes FTP et que ces dernières peuvent initier des connexion annexes pour le transfert de données. Voir l'étude du protocoel FTP pour plus de détails.