tcpdump est un formidable outil de ligne de commande pour le reniflage de réseau. Il s’agit d’un standard industriel pour la capture et l’analyse des paquets TCP/IP.

L’outil tcpdump peut s’avérer très utile pour résoudre des problèmes de réseau. Les paquets peuvent être enregistrés dans un fichier et analysés ultérieurement. Il est conseillé de lancer cet outil de temps en temps pour surveiller votre réseau.

À quoi ressemble la sortie de tcpdump ?

tcpdump vous permet d’examiner les en-têtes des paquets TCP/IP. Il imprime une ligne pour chaque paquet et la commande continue à fonctionner jusqu’à ce que vous appuyiez sur Ctrl C pour y mettre fin.

Examinons une ligne d’un exemple de sortie :

20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181 : Drapeaux [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

Chaque ligne comprend

  • L’horodatage Unix (20:58:26.765637)
  • le protocole (IP)
  • le nom d’hôte ou l’adresse IP de la source et le numéro de port (10.0.0.50.80)
  • le nom d’hôte ou l’IP de destination et le numéro de port (10.0.0.1.53181)
  • Drapeaux TCP (Drapeaux [F.]). Les drapeaux indiquent l’état de la connexion. Il peut comprendre plusieurs valeurs, comme dans cet exemple [F.] pour FIN-ACK. Ce champ peut avoir les valeurs suivantes :
    • S – SYN. Première étape de l’établissement de la connexion.
    • F – FIN. Fin de la connexion.
    • . – ACK. Paquet d’accusé de réception reçu avec succès.
    • P – PUSH. Indique au récepteur de traiter les paquets au lieu de les mettre en mémoire tampon.
    • R – RST. La communication est interrompue.
  • Numéro de séquence des données dans le paquet.(seq 1)
  • Numéro d’accusé de réception(ack 2)
  • Taille de la fenêtre(win 453). Nombre d’octets disponibles dans le tampon de réception. Suivent les options TCP.
  • Longueur de la charge utile des données.(length 0)

Installation

Sur les distributions basées sur Debian, tcpdump peut être installé avec la commande APT :

# apt install tcpdump -y

Sur les distributions basées sur un RPM, tcpdump peut être installé avec YUM :

# yum install tcpdump -y

Ou en utilisant DNF si RHEL 8

# dnf install tcpdump -y

options de la commande tcpdump

Vous devez être root pour lancer tcpdump. Il comprend de nombreuses options et filtres. Si vous exécutez tcpdump sans aucune option, tous les paquets passant par l’interface par défaut seront capturés.

Pour voir la liste des interfaces réseau disponibles sur le système et sur lesquelles tcpdump peut capturer des paquets.

# tcpdump -D

Ou

# Tcpdump --list-interfaces
1.eth0
2.nflog (interface Linux netfilter log (NFLOG))
3.nfqueue (interface Linux netfilter queue (NFQUEUE))
4.eth1
5.any (pseudo-dispositif qui capture sur toutes les interfaces)
6.lo [Loopback]

Ceci est particulièrement utile sur les systèmes qui n’ont pas de commande pour lister les interfaces.

Pour capturer des paquets passant par une interface spécifique, utilisez le drapeau -i avec le nom de l’interface. Sans l’interface -i, tcpdump capturerala première interface réseau qu’il rencontrera.

# tcpdump -i eth1
tcpdump : sortie verbeuse supprimée, utilisez -v ou -vv pour un décodage complet du protocole
écoute sur eth1, type de lien EN10MB (Ethernet), taille de la capture 262144 octets
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 4761, seq 1, length 64
01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64 : Réponse ICMP echo, id 4761, seq 1, length 64
01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 4761, seq 2, length 64

Le drapeau -v augmente les informations que vous voyez sur les paquets, -vv vous donne encore plus de détails.

Par défaut, tcpdump résout les adresses IP en noms d’hôtes et utilise également les noms de services au lieu des numéros de ports. Si le DNS ne fonctionne pas ou si vous ne voulez pas que tcpdump effectue des recherches de noms, utilisez l’option -n.

# tcpdump -n
écoute sur eth0, type de lien EN10MB (Ethernet), taille de la capture 262144 octets
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22 : Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22 : Drapeaux [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422 : Drapeaux [P.], seq 136:236, ack 1, win 37232, length 100

Pour ne capturer qu’un ensemble de lignes, par exemple 5, utilisez l’option -c:

#tcpdump -c 5
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22 : Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22 : Drapeaux [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 136:236, ack 1, win 37232, length 100
5 paquets capturés

La sortie par défaut de tcpdump utilise des horodatages Unix. Pour capturer des paquets avec un horodatage lisible par l’homme :

# tcpdump -tttt
2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36
2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22 : Flags [.], ack 36, win 65535, length 0
2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 36:72, ack 1, win 37232, length 36
2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22 : Flags [.], ack 72, win 65535, length 0
2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422 : Flags [P.], seq 72:108, ack 1, win 37232, length 36

expressions du filtre tcpdump

Les expressions de filtre sélectionnent les en-têtes de paquets qui seront affichés. Si aucun filtre n’est appliqué, tous les en-têtes de paquets sont affichés. Les filtres couramment utilisés sont port, host, src, dst, tcp, udp, icmp.

filtre port

Utilisez le filtre de port pour afficher les paquets arrivant sur un port spécifique :

# Tcpdump -i eth1 -c 5 port 80
23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80 : Drapeaux [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971 : Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80 : Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972 : Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0

filtre hôte

Pour capturer tous les paquets arrivant ou partant de l’hôte dont l’adresse IP est 10.0.2.15 :

# tcpdump host 10.0.2.15
03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225 : Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22 : Flags [.], ack 36, win 65535, length 0
03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225 : Flags [P.], seq 36:72, ack 1, win 37232, length 36
03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22 : Drapeaux [.], ack 72, win 65535, length 0
03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225 : Drapeaux [P.], seq 72:108, ack 1, win 37232, length 36

Pour capturer des paquets d’un type de protocole spécifique, par exemple, icmp, sur l’interface eth1 :

# tcpdump -i eth1 icmp
04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 2812, seq 75, length 64
04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64 : Réponse ICMP echo, id 2812, seq 75, length 64
04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 2812, seq 76, length 64
04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64 : Réponse ICMP echo, id 2812, seq 76, length 64
04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 2812, seq 77, length 64

Combinaison d’expressions de filtre

Vous pouvez combiner ces expressions de filtrage avec les opérateurs AND, OR et NOT. Cela vous permettra d’écrire des commandes capables d’isoler les paquets avec plus de précision :

Paquets provenant d’une IP spécifique et destinés à un port spécifique :

# tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80 : Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80 : Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80 : Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499 : HTTP : GET / HTTP/1.1
00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80 : Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0

Pour capturer tous les paquets sauf ICMP, utilisez l’opérateur NOT :

# tcpdump -i eth1 not icmp

Sauvegarde des en-têtes de paquets dans un fichier

Comme la sortie de tcpdump peut défiler à l’écran assez rapidement, vous pouvez enregistrer les en-têtes de paquets dans un fichier avec l’option -w. Les fichiers pour enregistrer la sortie utilisent le format pcap et ont une extension .pcap.

PCAP signifie capture de paquets. La commande suivante enregistre 10 lignes de sortie sur l’interface eth1 dans le fichier icmp.pcap.

# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump : listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 paquets capturés
10 paquets reçus par le filtre
0 paquets abandonnés par le noyau

Vous pouvez lire ce fichier avec l’option -r:

tcpdump -r icmp.pcap
lecture du fichier icmp.pcap, type de lien EN10MB (Ethernet)
05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 3261, seq 33, length 64
05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64 : Réponse ICMP echo, id 3261, seq 33, length 64
05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 3261, seq 34, length 64
05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64 : Réponse ICMP echo, id 3261, seq 34, length 64
05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51 : ICMP echo request, id 3261, seq 35, length 64

Afficher les détails des paquets

Jusqu’à présent, nous n’avons vu que les en-têtes des paquets, pour voir le contenu des paquets, utilisez l’option -A. Celle-ci affiche le contenu du paquet en ASCII, ce qui peut s’avérer utile pour le dépannage du réseau. L’option -X peut également être utilisée pour afficher la sortie au format hexadécimal. Cela peut ne pas être très utile si la connexion est cryptée.

# tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80 : Drapeaux [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499 : HTTP : GET / HTTP/1.1
E..'..@.@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Hôte : 10.0.0.50
Connexion : keep-alive
Cache-Control : max-age=0
Upgrade-Insecure-Requests : 1
User-Agent : Mozilla/5.0 (Macintosh ; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Acceptation : text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding : gzip, deflate
Accept-Language : en-US,en;q=0.9
If-Modified-Since : Tue, 04 Mar 2014 11:46:45 GMT

Conclusion

tcpdump est facile à configurer, et une fois que vous comprenez la sortie, les différents drapeaux et les filtres, il peut être utilisé pour résoudre les problèmes de réseau et sécuriser votre réseau.