Comprendre les filtres tcpdump
tcpdump utilise la syntaxe de filtrage de libpcap, souvent appelée syntaxe BPF (Berkeley Packet Filter). La même syntaxe s’applique aux filtres de capture de Wireshark, tshark et dumpcap. Un filtre se compose de primitives simples que l’on combine avec and, or et not.
Les primitives : type, sens, protocole
- Type :
host(une adresse),net(un réseau en notation CIDR),portetportrange. - Sens :
src(émetteur) oudst(destinataire). Sans précision, les deux conviennent. - Protocole :
tcp,udp,icmp,ip,ip6,arp,etheret d’autres.
tcp dst port 443 src net 10.0.0.0/8 ether host 00:11:22:33:44:55
Combiner et mettre des parenthèses
Dans libpcap, and et or ont la même priorité et sont évalués de gauche à droite. a or b and c signifie donc (a or b) and c. Mettez des parenthèses dès que vous mélangez les deux. Dans le générateur, chaque paire de parenthèses correspond à un groupe.
Placez toujours le filtre entre apostrophes, sinon le shell interprète lui-même les parenthèses et les caractères spéciaux :
sudo tcpdump -nn -i eth0 'host 10.0.0.5 and (port 80 or port 443)'
Filtrer les drapeaux TCP
tcp[tcpflags] donne accès aux drapeaux de l’en-tête TCP. tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn ne retient que le premier paquet de chaque connexion : SYN activé, ACK désactivé. Cela ne fonctionne qu’en IPv4, car libpcap ne retrouve pas l’en-tête TCP derrière les en-têtes d’extension IPv6.
Filtres courants
| Objectif | Filtre |
|---|---|
| Trafic d’un hôte | host 192.168.1.10 |
| Trafic entre deux hôtes | host 10.0.0.5 and host 10.0.0.20 |
| Web sans sa propre session SSH | (port 80 or port 443) and not port 22 |
| DNS | port 53 |
| DHCP | udp portrange 67-68 |
| Ouverture de connexion | tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn |
| Connexions réinitialisées | tcp[tcpflags] & tcp-rst != 0 |
| Ping | icmp[icmptype] == icmp-echo |
| Paquets du VLAN 100 | vlan 100 and host 10.1.1.1 |
| Gros paquets (problèmes de MTU) | greater 1400 |
Conseils pratiques
-nndésactive la résolution DNS et des noms de port. L’affichage est immédiat et tcpdump ne génère pas lui-même de trafic DNS.-i anycapture sur toutes les interfaces à la fois (Linux).- Si vous êtes connecté en SSH, excluez votre propre session avec
not port 22, sinon vous verrez surtout votre propre affichage. -w fichier.pcapenregistre les paquets bruts. Ouvrez ensuite le fichier dans Wireshark ou avectcpdump -r.- Pour le trafic VLAN,
vlandoit précéder les autres conditions, car il décale la position des en-têtes suivants. - Pour les longues captures, faites tourner les fichiers avec
-C(taille) ou-G(durée) et limitez leur nombre avec-W.
FAQ
Comment enregistrer une capture pour Wireshark ?
Indiquez un nom de fichier dans les options, sous « Écrire dans un fichier (-w) », par exemple capture.pcap. tcpdump y écrit alors les paquets bruts, et vous pouvez ouvrir ce fichier directement dans Wireshark.
Pourquoi tcpdump affiche-t-il « syntax error » ?
Le plus souvent, le shell interprète les parenthèses ou les caractères spéciaux parce que le filtre n’est pas entre apostrophes. Le générateur place donc toujours le filtre entre apostrophes. Les autres causes sont des fautes de frappe dans les mots-clés ou des parenthèses manquantes.
Le filtre fonctionne-t-il aussi dans Wireshark ?
Oui, comme filtre de capture, car Wireshark utilise lui aussi libpcap. Les filtres d’affichage de Wireshark ont une autre syntaxe, par exemple ip.addr == 10.0.0.5 au lieu de host 10.0.0.5.
Pourquoi mon filtre ne trouve-t-il rien sur le trafic VLAN ?
Avec une étiquette VLAN, l’en-tête IP est décalé de 4 octets. Placez donc la règle VLAN en premier, par exemple vlan 100 and host 10.0.0.5. Sur certains systèmes Linux, la carte réseau retire l’étiquette avant, et vlan devient inutile.
Mes saisies sont-elles envoyées quelque part ?
Non. Le générateur fonctionne entièrement dans votre navigateur. Le lien de partage enregistre le filtre après le #, et le navigateur n’envoie pas cette partie au serveur.