Administration réseau sous Linux/Tcpdump

Un livre de Wikilivres.

Dans un réseau ethernet relié par un concentrateur (ou hub), chaque machines reçoit tous les paquets qui circulent sur le réseau. En fonctionnement normal, les cartes réseau ne réceptionnent que les paquets qui leur sont destinés, mais on peut faire en sorte qu'elles transmettent tous les paquets au système.

Les hub sont de moins en moins utilisés. Ils sont généralement remplacés par des commutateurs (ou switch) qui savent déterminer (en fonction de l'adresse MAC) sur quel câble il faut envoyer un paquet. Les machines ne reçoivent donc généralement que les paquets qui leur sont destinés.

L'utilitaire tcpdump permet d'inspecter les paquets qui sont reçus et transmis par une carte réseau.


Filtrage[modifier | modifier le wikicode]

Il est possible de sélectionner les paquets à "écouter" en fonction d'expressions. Ainsi, ne seront affichées / traitées que les informations pour lesquelles le résultat de l'expression est vérifié. Une expression est composée de primitives et d'opérateurs logiques.

Une primitive est un identifiant précédé de mots clés qui indiquent le type de l'identifiant. Par exemple la primitive src port 21 contient les éléments suivants :

  • le mot clé src qui indique que l'identifiant ne porte que sur la source du paquet
  • le mot clé port qui indique que l'identifiant est le port du paquet
  • l'identifiant 21

La primitive correspond donc au port source 21.

De la même manière, la primitive ether src 00:11:22:33:44:55 indique l'adresse ethernet (ou MAC) source 00:11:22:33:44:55.

Les primitives les plus courantes sont les suivantes :

src <adresse>
l'adresse source est <adresse>
dst <adresse>
l'adresse destination est <adresse>
host <adresse>
l'adresse source ou destination est <adresse>
port <port>
le port source ou destination est <port>
src port <port>
le port source est <port>
dst port <port>
le port destination est <port>
portrange <port1>-<port2>
le port est compris entre <port1> et <port2>. On peut préciser l'origine avec les mots clés src ou dst et le protocole avec les mots clés tcp ou udp.

Les primitives peuvent être reliées avec les opérateurs logiques and, or et not. Par exemple l'expression suivante va trouver tous les paquets en provenance de tiny mais dont le port n'est pas le port ssh :

src tiny and not port ssh

Il est également possible de spécifier un protocole: udp, tcp, icmp.

Options[modifier | modifier le wikicode]

Plusieurs options permettent de modifier le comportement de tcpdump :

-i <interface>
sélectionne l'interface réseau sur laquelle tcpdump écoute. Par défaut il prend la première active (sauf lo).
-x
affiche également les données contenues dans les paquets trouvés, sous forme hexadécimale
-X
affiche les données des paquets sous forme ASCII
-s <nombre>
par défaut, seuls les 68 premiers octets de données sont affichés. Ce paramètre permet de modifier ce nombre.
-w
pour spécifier le chemin d'un fichier où sauvegarder le dump.

Exemples[modifier | modifier le wikicode]

tcpdump src 192.168.0.1

Ici, les seuls paquets affichés sont ceux en provenance de 192.168.0.1. Nous pouvons également préciser nos préférences en ajoutant un critère :

tcpdump src 192.168.0.1 and port 80

Là, le seul port qui nous intéresse est 80 (http).

Voici une ligne complète qui ne laisse vraiment passer que les paquets en provenance de 192.168.0.1 vers 212.208.225.1, sur le port 53 en udp.

tcpdump -x -X -s 0 src 192.168.0.1 and dst 212.208.225.1 and port 53 and udp

Nous avons demandé l'affichage du contenu des paquets au format hexadécimal et ascii (-x -X) et ce, quelle que soit leur taille (-s 0). Nous obtenons les informations désirées :

0x0000:  4500 003b 0000 4000 4011 ca00 c1fd d9b4  E..;..@.@.......
0x0010:  c1fc 1303 80a1 0035 0027 213d 14c2 0100  .......5.'!=....
0x0020:  0001 0000 0000 0000 0377 7777 056c 696e  .........www.lin
0x0030:  7578 036f 7267 0000 0100 01              ux.org.....