Filtres pour tcpdump

tcpdump est un formidab’ outil de capture réseau pour GNU/linux, permettant de gérer de la MAC, jusqu’au protocole embarqué dans le meilleur des cas.

Il faut l’installer, en supposant que le système cible est debian ou l’un de ses dérivés :

# apt-get update
# apt-get install tcpdump

tandis que le monde RedHat aura tapé son équivalence :

# yum install tcpdump

Peu importe la distribution utilisée, cela installera la principale dépendance, à savoir libpcap.


Voici une série d’exemples de filtres basiques mais fort utiles, à taper en root dans un terminal :

# tcpdump -D

traduction : affiche la liste des interfaces où tcpdump sera en mesure de capturer du trafic.


# tcpdump -i eth0 host 192.168.100.1

traduction : affiche le trafic sur eth0, à destination ou en provenance de l’hôte 192.168.100.1.

Pour quitter :

[CTRL] + C

tcpdump est humble, quand on le quitte, il affiche si il a vu passer des paquets qu’il n’a pu afficher. Il totalise donc les paquets ’loupés’ ainsi que la somme des paquets qui ont transité sur l’interface lors de la capture.


# tcpdump -i any port 80 or 8080 -n

traduction : affiche le trafic sur toutes les interfaces, sur les ports soit 80, soit 8080, et sans résoudre les noms DNS.

Spécifier l’(les) interface(s) d’écoute est fortement recommandé, même si on souhaite écouter toutes les interfaces. C’est logique, avant de capturer, tcpdump doit passer l’interface en mode ’promiscuité’, ce qui entre autres, permet à l’interface d’accepter des paquets qui ne lui sont pas explicitement destinés.


# tcpdump -i eth0 dst port 80 and not host 192.168.100.10 -vv

traduction : affiche le trafic sur eth0, à destination d’un port 80, en omettant l’hôte 192.168.100.10, en affichant le protocole embarqué si il est reconnu.

L’option -n n’étant pas positionnée, le système capturant le trafic va tenter de résoudre les noms de tous les hôtes impliqués dans la capture. Par résoudre les noms, j’entends : faire référence au fichier /etc/hosts ou bien une requête (m)DNS.

Résoudre des noms en cours de capture peut ralentir l’affichage de la capture voire occasionner un débordement de mémoire, cela dépend bien sûr du nombre de requêtes DNS à envoyer-recevoir-interpréter.

À ce titre, l’option -n devrait être positionnée tant qu’on a pas besoin de résoudre les noms au travers d’une capture.


# tcpdump -i eth0 tcp and dst portrange 20000-21000

traduction : affiche le trafic sur eth0, protocole TCP, à destination de la plage de ports comprise entre 20000 et 21000.


# tcpdump -i eth0 udp and dst port 5060 -nc 500 -w /point_de_montage/dossier/fichier.pcap

traduction : sur eth0, on cherche les paquets UDP, à destination du port 5060, sans résoudre les noms, on écrit les 500 premiers paquets filtrés dans un fichier, puis on quitte.

Le fichier produit est fin prêt pour être ouvert par cablerequin !


# tcpdump -i eth0 ip6

traduction : sur eth0, affiche tout le trafic ipv6.


# tcpdump -i eth0 port 5060 and src net 10.0.0.0/8 -vn

traduction : affiche le trafic sur eth0, le port 5060 depuis le réseau 10.0.0.0/8, en s’efforçant de détailler le protocole embarqué et sans résoudre les noms.

Nous sommes sur le port dédié au sip (sip peut s’appuyer sur TCP, pas seulement UDP).


On peut notifier certains arguments à tcpdump d’une manière plus textuelle :

# tcpdump -i eth0 port http -v

traduction : affiche sur eth0, le trafic sur le port nommé ’http’

Cela va amener tcpdump à constituer son filtre en s’appuyant sur les alias définis dans /etc/services et /etc/protocols.
Il va donc pouvoir déterminer le(s) numéro(s) de port(s), et si il doit écouter TCP, UDP, ou les deux.
Le protocole HTTP devrait être affiché lors de cette capture.


# tcpdump -i eth0 icmp and dst host www.pouet.net

traduction : affiche sur eth0, le trafic ICMP à destination de l’hôte www.pouet.net.

Cela va lancer des requêtes DNS préalables afin de connaître l’(les) adresse(s) à écouter et afficher les paquets qui en résultent (à manier avec précaution selon la quantité/variété de noms à resoudre).


# tcpdump -i eth0 udp and port 67 or 68 -env

traduction : affiche le trafic sur eth0, en UDP, sur les ports 67 et/ou 68, en affichant les informations de la MAC, sans résoudre les noms, verbose niveau 1.

Dans l’état, ce filtre peut être utile pour débugger un serveur DHCP par exemple.
tcpdump peut donc se positionner juste au dessus de la LLC et afficher les entêtes de couche 2 . Si on souhaite creuser plus bas, il faut l’utiliser en conjonction avec ethtool.


# tcpdump -i eth0 src host 10.10.10.10 -Xn

traduction : affiche le trafic sur eth0 en provenance de l’hôte 10.10.10.10, en ASCII et héxadécimal, sans résoudre les noms.


Je disais plus haut que tcpdump est humble, ce n’est pas si vrai, hélas. Il vous dit ce qu’il a fait, ce qu’il n’a pas fait mais ne vous révèle pas quand il le fait à moitié...

# tcpdump -i eth0 ether host de:ad:bb:ee:ee:ff -nes0

traduction : affiche les trames de l’hôte ayant de:ad:bb:ee:ee:ff pour adresse MAC, sans résoudre les noms, en affichant les informations de couche 2, en s’efforçant de ne pas tronquer ces trames.

Un processeur et une interface réseau fortement sollicités (quelques flux RTP par exemple) donnent moins de temps à tcpdump pour inspecter chaque paquet sur la pile.


# tcpdump -i eth0 icmp and greater 95 -n

traduction : affiche sur eth0, les paquets ICMP d’une taille supérieure ou égale à 95 octets, sans résoudre les noms DNS.

L’argument ’less’ produit l’effet inverse, en substituant ’greater’ à ’less’ dans la commande ci-dessus, tcpdump afficherait les paquets d’une taille inférieure ou égale à 95 octets.

Attention, dans cet exemple, ces 95 octets reflètent la somme de :
- l’ICMP + sa charge utile (8 octets + 56 octets)
- l’entête IP (20 octets)
- l’entête Ethernet (14 octets)
- un autre octet, pour faire 95

L’erreur commune, c’est oublier d’inclure ethernet dans les calculs, probablement parce que tcpdump ne l’affiche pas par défaut.

Cela nous fait au total 94 octets pour un ping. Le filtre énoncé plus haut affichera donc les ping avec une longueur non standard.


D’autres filtres plus évolués à venir.

Non-sens divers, vus sur d’autres pages parlant de la même chose :

Ces analyseurs sont passifs, ils n’émettent aucune trame sur le réseau, leur utilisation est donc indétectable par les autres hôtes du réseau.

==> Ce n’est pas tout à fait vrai, ça requête les DNS tant qu’on lui a pas commandé de ne pas le faire. Voici d’autres commentaires bien avisés, qui parlent de couche 2 cette fois.

Tcpdump est un outil gratuit installé par défaut sur les distributions linux.

==> Surtout pas d’outil d’audit installé par défaut. (Parsambleu ! Mortecouille !!!)
Au cas où j’ai mal compris, il n’existe pas d’analyseur réseau par défaut, ni de méta-paquet.
Par contre, j’atteste de la présence de ce genre d’outils sur des distributions orientées audit et sécurité par exemple.


La consultation de la manpage ’pcap-filter’ vous montrera toutes les possibilités d’arguments à apporter à tcpdump.