Cédric Temple

Administrateur système en logiciels libres

tcpdump, informations essentielles

2019-05-10 » notes pour plus tard

Ce contenu est fourni sous licence CC BY-NC-SA 4.0

Informations essentielles sur tcpdump

Introduction

Quelques notes sur tcpdump : les informations essentielles que je garde sur l’utilisation de tcpdump.

Quelques bases

# lister les interfaces sur lesquelles tcpdump est capable d'écouter
tcpdump --list-interfaces
# filtrer sur le nom d'une interface
tcpdump -i enp3s0f1
# filtrer sur le nom d'une interface et n'afficher qu'une partie du trafic (ici, le trafic udp)
tcpdump -i enp3s0f1 'udp'
# être plus verbeux (1 seul v, pas trop verbeux, + de v, très verbeux)
tcpdump -i enp3s0f1 -vvv
# dumper les paquets en ASCII
tcpdump -i enp3s0f1 -A
# possibilité de faire une combinaison de filtres (exemple bateau ici)
tcpdump -i enp3s0f1 '(udp port 53 or icmp ) and net 192.168.1.0/24 and not host 192.168.1.3'

Sauvegarder/relire la trace réseau dans un fichier

Pour sauvegarder les données, on utilise le switch -w suivi d’un nom de fichier :

# pour tout enregistrer
tcpdump -i enp3s0f1 -w file.out
# pour enregistrer seulement les données correspondant à un filtre
tcpdump -i enp3s0f1 -w file.out 'udp port 53'

Pour relire les données du fichiers, on utilise le switch -r suivi d’un nom de fichier :

# pour lire le fichier et afficher toutes les données
tcpdump -r file.out
# pour lire le fichier et afficher seulement les données correspondant à un filtre
tcpdump -r file.out 'udp port 53'

Pour sauvegarder dans plusieurs fichiers, un par minute, on utilise le switch -G. Avantages :

  • on peut effacer les fichiers au fur et à mesure
  • on peut récupérer les fichiers au fur et à mesure pour les analyser par un outil graphique, comme Wireshark
# on sauvegarde dans un fichier différent toutes les 60s
# on nomme le fichier en fonction de l'heure
tcpdump -i enp3s0f1 -G 60 -w file_%Hh%Mmin%Ssec.out
# pendant que tcpdump tourne, on peut voir les fichiers se créer :
ls file*
file_15h51min47sec.out  file_15h52min54sec.out  file_15h54min03sec.out

Pour relire tous les fichiers générés, il ne faut pas utiliser l’option -r mais l’option -V (majuscule !). Un petit trick pour relire tous les fichiers générés, on utilise “-V -“ et on passe le nom de tous les fichiers sur l’entrée standard :

ls file_*.out | tcpdump -V - 'filtre tcpdump souhaité'

Quelques filtres utiles sur IPv4/IPv6

# filtrer pour n'avoir que le trafic IPv4
tcpdump -i enp3s0f1 'ip'
# filtrer pour n'avoir que le trafic IPv6
tcpdump -i enp3s0f1 'ip6'
# filtrer sur une IP : pour voir toutes les communications d'une IPv4 ou une IPv6
tcpdump -i enp3s0f1 'host 192.168.1.1'
tcpdump -i enp3s0f1 'host 2001:0db8::42'
# pour ne voir que les communications provenant d'une IP source
tcpdump -i enp3s0f1 'src 192.168.1.1'
# ... ou une destination IPv6
tcpdump -i enp3s0f1 'dst 2001:0db8::42'
# provenant ou à destination d'un réseau IPv4 ou IPv6
tcpdump -i enp3s0f1 'net 192.168.56.0/24'
tcpdump -i enp3s0f1 'net 2001:0db8::/32'
# si on veut filtrer le réseau par la source
tcpdump -i enp3s0f1 'src net 192.168.56.0/24'
# ou la destination
tcpdump -i enp3s0f1 'dst net 2001:0db8::/32'
# on peut combiner les filtre bien sûr
tcpdump -i enp3s0f1 'src 192.168.1.1 and dst 192.168.1.3'
tcpdump -i enp3s0f1 'src net 192.168.1.0/24 and net dst 172.16.4.0/24'

Quelques filtres utiles sur TCP

# filtrer sur le protocole TCP uniquement
tcpdump -i enp3s0f1 'tcp'
# filtrer sur HTTP
tcpdump -i enp3s0f1 'tcp port 80'
# filtrer sur HTTP et HTTPs
tcpdump -i enp3s0f1 'tcp port 80 or tcp port 443'
# filtrer pour n'avoir que les paquets TCP ACK
tcpdump -i enp3s0f1 'tcp[tcpflags] == tcp-ack'
# filtrer pour n'avoir que les paquets TCP SYN
tcpdump -i enp3s0f1 'tcp[tcpflags] == tcp-syn'
# filtrer pour n'avoir que les paquets TCP PUSH
tcpdump -i enp3s0f1 'tcp[tcpflags] == tcp-push'
# filtrer pour n'avoir que les paquets TCP RESET
tcpdump -i enp3s0f1 'tcp[tcpflags] == tcp-rst'

Quelques filtres utiles sur UDP

# filtrer sur le protocole UDP uniquement
tcpdump -i enp3s0f1 'udp'
# filtrer sur DNS
tcpdump -i enp3s0f1 'udp port 53'
# filtrer sur DHCPv4
tcpdump -i enp3s0f1 'udp port 67 or udp port 68'
# filtrer sur DHCPv6
tcpdump -i enp3s0f1 'udp port dhcpv6-server or udp port dhcpv6-client'
# filtrer sur les requêtes SNMP
tcpdump -i enp3s0f1 'udp port 161'
# filtrer sur les trap SNMP
tcpdump -i enp3s0f1 'udp port 162'

ICMPv4/ICMPv6

# voir le trafic ICMPv4 seulement
tcpdump -i enp3s0f1 'icmp'
# voir seulement les paquets ICMPv4 echo request
tcpdump -i enp3s0f1 'icmp[icmptype] == icmp-echo'
# voir seulement les paquets ICMPv4 echo reply
tcpdump -i enp3s0f1 'icmp[icmptype] == icmp-echoreply'
# voir le trafic ICMPv6 seulement
tcpdump -i enp3s0f1 'icmp6'
# voir seulement les paquets ICMPv6 Destination Unreachable
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 1'
# voir seulement les paquets ICMPv6 Packet Too Big
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 2'
# voir seulement les paquets ICMPv6 Time Exceeded
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 3'
# voir seulement les paquets ICMPv6 echo request
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 128'
# voir seulement les paquets ICMPv6 echo reply
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 129'
# voir seulement les paquets ICMPv6 Router Solicitation
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 133'
# voir seulement les paquets ICMPv6 Router Advertisement
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 134'
# voir seulement les paquets ICMPv6 Neighbor Solicitation
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 135'
# voir seulement les paquets ICMPv6 Neighbor Advertisement
tcpdump -i enp3s0f1 'icmp6 and ip6[40] == 136'

Ce contenu est fourni sous licence CC BY-NC-SA 4.0