Je ne me souvenais plus : comment fonctionne une capture réseau avec la libpcap (tcpdump, wireshark, etc.) dans le noyau Linux ? À quel endroit du noyau le trafic est-il capturé par la libpcap ?
Explication concise dans les pages 10-12 de ce document que l'on peut recouper avec le code Linux de la libpcap.
En gros :
Création d'une socket de type RAW (entête Ethernet conservé), famille d'adresses AF/PF_PACKET (contournement de la partie TCP/IP de la pile réseau), protocole ETH_P_ALL (tous les protocoles). Dans le noyau (Linux), le protocole PF_PACKET, en tant que protocole générique, est traité très tôt par la pile réseau, après que le pilote de la carte réseau ait copié le paquet en RAM, et bien avant la couche IP (schéma) et Netfilter (le pare-feu de Linux). On voit la socket dans /proc/<PID_tcpdump>/fd ;
Association de la socket à une interface réseau (bind()) ;
Activation éventuelle du mode promiscuous. tcpdump -p permet de ne pas l'activer ;
Application d'un éventuel filtre BPF/LSF (kernel-land) sur la socket. tcpdump -d affiche le bytecode BPF ;
Activation d'un espace mémoire partagé kernel/user-land afin d'éviter des copies inutiles du paquet. Détails ;
Lire les paquets reçus.