Skip to main content

Tcpdump: exemples, options et plus

Tcpdump - 2 : capture de paquets d'une ip et/ou un port (Mai 2025)

Tcpdump - 2 : capture de paquets d'une ip et/ou un port (Mai 2025)
Anonim

Tcpdump est une commande utilisée sur divers systèmes d'exploitation Linux qui rassemble les paquets TCP / IP qui transitent par une carte réseau. Tout comme un outil de détection de paquets, tcpdump peut non seulement analyser le trafic réseau, mais également l'enregistrer dans un fichier.

Contrairement à certaines commandes fournies par le système d'exploitation par défaut, vous constaterez peut-être que vous ne pouvez pas utiliser tcpdump car ce dernier n'est pas installé. Pour installer tcpdump, exécutez apt-get install tcpdump ou miam installer tcpdump, selon votre système d'exploitation.

Comment fonctionne tcpdump

Tcpdump imprime les en-têtes de paquets sur une interface réseau qui correspondent à la booléenne expression . Il peut également être exécuté avec le-w qui enregistre les données du paquet dans un fichier pour une analyse ultérieure et / ou avec le-r flag, ce qui l’amène à lire à partir d’un fichier de paquets sauvegardé plutôt que de lire des paquets à partir d’une interface réseau. Dans tous les cas, seuls les paquets qui correspondent expression sera traité par tcpdump .

Tcpdump va, sinon courir avec le-c drapeau, continuez à capturer les paquets jusqu’à ce qu’il soit interrompu par un signal SIGINT (généré, par exemple, en tapant votre caractère d’interruption, généralement Ctrl + C) ou un signal SIGTERM (généralement généré avec letuer(1) commandement); si couru avec-c drapeau, il va capturer les paquets jusqu’à ce qu’il soit interrompu par un signal SIGINT ou SIGTERM ou que le nombre spécifié de paquets ait été traité.

Les commutateurs mentionnés ci-dessus sont expliqués en détail plus loin dans cet article.

Quand tcpdump termine la capture des paquets, il rapportera les comptes de:

  • Paquets "reçus par filtre".
    • La signification de cela dépend du système d'exploitation sur lequel vous exécutez tcpdump , et éventuellement sur la manière dont le système d’exploitation a été configuré. Si un filtre a été spécifié sur la ligne de commande, sur certains systèmes d’exploitation, il compte les paquets, qu’ils aient été mis en correspondance par l’expression du filtre ou, sur d’autres, uniquement les paquets correspondant à l’expression du filtre et traités par celle-ci. tcpdump.
  • Paquets "abandonnés par le noyau".
    • C'est le nombre de paquets qui ont été abandonnés, en raison d'un manque d'espace tampon, par le mécanisme de capture de paquets dans le système d'exploitation sur lequel tcpdump est en cours d'exécution, si le système d'exploitation communique ces informations aux applications. Sinon, il sera signalé comme 0.

Sur les plates-formes prenant en charge le signal SIGINFO, telles que la plupart des BSD (Berkeley Software Distributions), il compte ces nombres lorsqu’il reçoit un signal SIGINFO (généré, par exemple, en tapant votre caractère "status", généralement Ctrl + T) et continuera à capturer les paquets.

Compatibilité Tcpdump

La lecture de paquets à partir d’une interface réseau à l’aide de la commande tcpdump peut nécessiter des privilèges spéciaux ( en train de lire un fichier de paquet enregistré ne nécessite pas de tels privilèges):

  • SunOS 3.x ou 4.x avec NIT ou BPF: Vous devez avoir un accès en lecture à / dev / nit ou dev / bpf * .
  • Solaris avec DLPI: Vous devez avoir un accès en lecture / écriture au pseudo-périphérique réseau, comme / dev / le . Sur certaines versions de Solaris au moins, toutefois, cela ne suffit pas pour tcpdump capturer en mode promiscuous; sur ces versions de Solaris, vous devez être root, ou tcpdump doit être installé entre setuid et root, afin de pouvoir capturer en mode promiscuous. Notez que, sur de nombreuses interfaces (peut-être toutes), si vous ne capturez pas en mode promiscuous, vous ne verrez aucun paquet sortant. Par conséquent, une capture non effectuée en mode promiscuous peut ne pas être très utile.
  • HP-UX avec DLPI: Vous devez être root ou tcpdump doit être installé setuid à la racine.
  • IRIX avec snoop: Vous devez être root ou tcpdump doit être installé setuid à la racine.
  • Linux: Vous devez être root ou tcpdump doit être installé setuid à la racine.
  • Ultrix et Digital UNIX / Tru64 UNIX: Tout utilisateur peut capturer le trafic réseau avec tcpdump . Cependant, aucun utilisateur (pas même le super-utilisateur) ne peut capturer en mode promiscuous sur une interface à moins que le super-utilisateur ait activé le fonctionnement en mode promiscuous sur cette interface à l'aide de pfconfig (8), et aucun utilisateur (pas même le super-utilisateur) ne peut capturer le trafic en monodiffusion reçu ou envoyé par la machine sur une interface, sauf si le super-utilisateur a activé le fonctionnement tout en copie sur cette interface à l'aide de pfconfig , alors utile La capture de paquets sur une interface nécessite probablement l'activation du mode Promiscuous ou du mode Copie Tous les modes, ou des deux modes de fonctionnement, sur cette interface.
  • BSD: Vous devez avoir un accès en lecture à / dev / bpf * .

Syntaxe de la commande Tcpdump

Comme toutes les commandes de l'ordinateur, la commande tcpdump ne fonctionne correctement que si la syntaxe est correcte:

tcpdump -adeflnNOpqRStuvxX -c compter

-C taille du fichier -F fichier

-je interface -m module -r fichier

-s snaplen -T type -U utilisateur -w fichier

-E algo: secret expression

Options de commande Tcpdump

Voici toutes les options que vous pouvez utiliser avec la commande tcpdump:

  • -une: Essayez de convertir les adresses réseau et de diffusion en noms.
  • -c: Quitter après avoir reçu compter paquets.
  • -C: Avant d’écrire un paquet brut dans un fichier de sauvegarde, vérifiez si le fichier est actuellement plus volumineux que taille du fichier et, si tel est le cas, ferme le fichier de sauvegarde actuel et en ouvre un nouveau.Savefiles après le premier savefile aura le nom spécifié avec le-w drapeau, suivi d’un nombre, commençant à 2 et continuant à la hausse. Les unités de taille du fichier sont des millions d'octets (1 000 000 octets, pas 1 048 576 octets).
  • -ré: Videz le code de correspondance de paquets compilé sous une forme lisible par l'homme vers la sortie standard et arrêtez-le.
  • -dd: Dump le code de correspondance de paquets en tant queC fragment de programme.
  • -ddd: Dump le code de correspondance de paquets sous forme de nombres décimaux (précédé d’un nombre).
  • -e: Affiche l'en-tête de niveau lien sur chaque ligne de vidage.
  • -E: Utilisation algo: secret pour décrypter les paquets ESP IPsec. Les algorithmes peuvent êtredes-cbc, 3des-cbc, coup de poisson-cbc, rc3-cbc, cast128-cbc, ouaucun. La valeur par défaut estdes-cbc. La possibilité de décrypter des paquets n’est présente que si tcpdump a été compilé avec la cryptographie activée. secret le texte ascii pour la clé secrète ESP. Nous ne pouvons pas prendre de valeur binaire arbitraire pour le moment. L'option suppose RFC2406 ESP, pas RFC1827 ESP. L'option est uniquement à des fins de débogage, et l'utilisation de cette option avec une clé vraiment «secrète» est découragée. En présentant la clé secrète IPsec sur la ligne de commande, vous la rendez visible aux autres, via ps (1) et d'autres occasions.
  • -F: Imprimez les adresses Internet 'étrangères' sous forme numérique plutôt que symbolique (cette option est destinée à éviter des lésions cérébrales graves sur le serveur yp de Sun - en général, elle bloque en permanence la traduction des numéros Internet non locaux).
  • -F: Utilisation fichier comme entrée pour l'expression de filtre. Une expression supplémentaire donnée sur la ligne de commande est ignorée.
  • -je: Écoutez interface . Si non spécifié, tcpdump recherche dans la liste d'interfaces système la plus petite interface configurée (à l'exclusion du bouclage). Les cravates sont brisées en choisissant le match le plus tôt. Sur les systèmes Linux avec des noyaux 2.2 ou ultérieurs, un interface l'argument "any" peut être utilisé pour capturer les paquets de toutes les interfaces. Notez que les captures sur le périphérique "any" ne seront pas effectuées en mode promiscuous.
  • -l: Met en tampon la ligne stdout. Utile si vous voulez voir les données tout en les capturant. Par exemple, "tcpdump -l | tee dat" ou "tcpdump -l> dat & tail -f dat".
  • -m: Charger les définitions de module MMI SMI à partir d'un fichier module . Cette option peut être utilisée plusieurs fois pour charger plusieurs modules MIB dans tcpdump .
  • -n: Ne convertissez pas les adresses d’hôte en noms. Cela peut être utilisé pour éviter les recherches DNS.
  • -nn: Ne convertissez pas non plus les noms de protocole, de port, etc.
  • -N: N'imprimez pas la qualification de nom de domaine des noms d'hôtes. Par exemple, si vous donnez ce drapeau, alors tcpdump affichera "nic" au lieu de "nic.ddn.mil".
  • -O: Ne lancez pas l'optimiseur de code de correspondance de paquets. Ceci n'est utile que si vous suspectez un bogue dans l'optimiseur.
  • -p: Ne pas mettre l'interface en mode promiscuous. Notez que l'interface peut être en mode promiscuous pour une autre raison; par conséquent, "-p" ne peut pas être utilisé comme abréviation de "ether host {local-hw-addr} ou ether broadcast".
  • -q: Sortie rapide (silencieuse). Imprimez moins d'informations de protocole pour que les lignes de sortie soient plus courtes.
  • -R: Supposons que les paquets ESP / AH soient basés sur les anciennes spécifications: RFC1825 à RFC1829. Si spécifié, tcpdump n'imprimera pas le champ de prévention de rejeu. Comme il n’existe pas de champ de version de protocole dans la spécification ESP / AH, tcpdump ne peut pas déduire la version du protocole ESP / AH.
  • -r: Lire les paquets de fichier (qui a été créé avec l'option -w). L'entrée standard est utilisée si fichier est "-''.
  • -S: Affiche les numéros de séquence TCP absolus plutôt que relatifs.
  • -s: Snarf snaplen octets de données de chaque paquet plutôt que la valeur par défaut de 68; avec la NIT de SunOS, le minimum est en réalité de 96. Soixante-huit octets suffisent pour IP, ICMP, TCP et UDP, mais peuvent tronquer les informations de protocole provenant du serveur de noms et des paquets NFS (voir ci-dessous). Les paquets tronqués à cause d'un instantané limité sont indiqués dans la sortie avec "| proto '', où proto est le nom du niveau de protocole auquel la troncature s'est produite. Notez que prendre des instantanés plus volumineux augmente le temps nécessaire au traitement des paquets et, en réalité, réduit la mise en mémoire tampon des paquets. Cela peut entraîner la perte de paquets. Vous devriez limiter snaplen au plus petit nombre qui capturera les informations de protocole qui vous intéressent. snaplen 0 signifie que vous devez utiliser la longueur requise pour capturer des paquets entiers.
  • -T: Forcer les paquets sélectionnés par " expression "à interpréter le spécifié type . Les types actuellement connus sontcnfp (Protocole Cisco NetFlow),rpc (Appel de procédure à distance),rtp (Protocole d'applications en temps réel),rtcp (Protocole de contrôle des applications en temps réel),snmp (Simple Network Management Protocol),T.V.A (Visual Audio Tool), etwb (tableau blanc distribué).
  • -t: Ne pas imprimer un horodatage sur chaque ligne de vidage.
  • -tt: Imprimer un horodatage non formaté sur chaque ligne de vidage.
  • -U: Supprime les privilèges root et remplace l'ID utilisateur par utilisateur et ID de groupe au groupe principal de utilisateur .
  • Remarque: Red Hat Linux supprime automatiquement les privilèges de l'utilisateur "pcap" si rien d'autre n'est spécifié.
  • -ttt: Affiche un delta (en microsecondes) entre la ligne actuelle et la précédente sur chaque ligne de vidage.
  • -tttt: Imprimer un horodatage au format par défaut, procédé par date sur chaque ligne de vidage.
  • -u: Imprimer les poignées NFS non décodées.
  • -v: (Légèrement plus) sortie verbeuse. Par exemple, la durée de vie, l'identification, la longueur totale et les options d'un paquet IP sont imprimées. Permet également des vérifications supplémentaires de l'intégrité des paquets, telles que la vérification du total de contrôle des en-têtes IP et ICMP.
  • -vv: Sortie encore plus verbeuse. Par exemple, des champs supplémentaires sont imprimés à partir des paquets de réponse NFS et les paquets SMB sont entièrement décodés.
  • -vvv: Sortie encore plus verbeuse. Par exemple, telnetSBSE les options sont imprimées en entier. Avec -X Les options telnet sont également imprimées en hexadécimal.
  • -w: Écrivez les paquets bruts à fichier plutôt que de les analyser et de les imprimer. Ils peuvent ensuite être imprimés avec l'option -r. La sortie standard est utilisée si fichier est "-''.
  • -X: Affiche chaque paquet (moins son en-tête de niveau de lien) en hexadécimal. Le plus petit du paquet entier ou snaplen les octets seront imprimés. Notez qu'il s'agit du paquet entier de couche de liaison. Ainsi, pour les couches de liaison qui remplissent un tampon (Ethernet, par exemple), les octets de remplissage sont également imprimés lorsque le paquet de couche supérieure est plus court que le remplissage requis.
  • -X: Lors de l’impression hex, imprimez aussi ascii. Donc si-X est également défini, le paquet est imprimé en hex / ascii. Ceci est très pratique pour analyser de nouveaux protocoles. Même si-X n'est pas également défini, certaines parties de certains paquets peuvent être imprimées en hex / ascii.
  • expression : Sélectionne les paquets qui seront vidés. Sinon expression est donné, tous les paquets sur le net seront vidés. Sinon, seuls les paquets pour lesquels expression est 'vrai' sera déversé. le expression se compose d'un ou plusieurs primitives. Les primitives consistent généralement en un identifiant (nom ou numéro) précédé d'un ou plusieurs qualificatifs. Il existe trois types de qualificatifs:
  • type : Les qualificatifs indiquent à quel genre de chose le nom ou le numéro d’identifiant fait référence. Les types possibles sonthôte, net, etPort-Par exemple, 'hôte foo', 'net 128.3', 'port 20'. S'il n'y a pas de qualificatif de type,hôte est assumé.
  • dir : Les qualificatifs spécifient un sens de transfert particulier vers et / ou depuis identifiant . Les directions possibles sontsrc, dst, src ou dst etsrc et dst (par exemple, 'src foo', 'dst net 128.3', 'src ou dst port ftp-data'). S'il n'y a pas de qualificateur de répertoire,src ou dst est assumé. Pour les couches de liaison "nulles" (c'est-à-dire, les protocoles point à point tels que le glissement), la entrant et sortant les qualificateurs peuvent être utilisés pour spécifier une direction souhaitée.
  • proto : Les qualificateurs limitent la correspondance à un protocole particulier. Les protos possibles sont: éther, fddi, tr, ip, ip6, arp, rarp, décnet, tcp, etUDP-Par exemple, 'ether src foo', 'arp net 128.3', 'tcp port 21'. S'il n'y a pas de qualificateur de proto, tous les protocoles compatibles avec le type sont supposés. Par exemple, 'src foo' signifie '(ip ou arp ou rarp) src foo' (sauf que la syntaxe n'est pas légale), 'net bar' signifie '(ip ou arp ou rarp) net bar' et 'port 53' signifie '(tcp ou udp) port 53'.
    • 'fddi' est en fait un alias pour 'ether'; l'analyseur les traite à l'identique comme signifiant "le niveau de liaison de données utilisé sur l'interface réseau spécifiée". Les en-têtes FDDI contiennent des adresses source et de destination de type Ethernet, ainsi que des types de paquets de type Ethernet. Vous pouvez ainsi filtrer ces champs FDDI uniquement. Comme dans les champs Ethernet analogues, les en-têtes FDDI contiennent également d'autres champs, mais vous ne pouvez pas les nommer explicitement dans une expression de filtre.
    • De même, "tr" est un alias pour "ether"; les déclarations du paragraphe précédent concernant les en-têtes FDDI s'appliquent également aux en-têtes Token Ring.

En plus de ce qui précède, il existe des mots clés "primitifs" spéciaux qui ne suivent pas le modèle:passerelle, diffuser, Moins, plus grand, et arithmétique expressions. Tous sont décrits ci-dessous.

Des expressions de filtre plus complexes sont construites en utilisant les motset, ou, etne pas de combiner des primitives, par exemple "hôte toto et non port ftp et non port ftp-data". Pour sauvegarder la saisie, vous pouvez omettre des listes de qualificatifs identiques (par exemple, "domaine du port ftp ou du domaine ftp de tcp est exactement le même que" domaine du port ftp du port dc tcp ou domaine du port du dst tcp ".).

Voici les primitives autorisées avec la commande tcpdump:

  • dst host hôte
    • Vrai si le champ de destination IPv4 / v6 du paquet est hôte , qui peut être une adresse ou un nom.
  • hôte src hôte
    • Vrai si le champ source IPv4 / v6 du paquet est hôte .
  • hôte hôte
    • Vrai si la source ou la destination IPv4 / v6 du paquet est hôte . Chacune des expressions d'hôte ci-dessus peut être précédée des mots-clés,ip, arp, rarp, ouip6, un péché hôte ip hôte (ce qui équivaut à éther proto ip et hôte hôte).
    • Si hôte est un nom avec plusieurs adresses IP, chaque adresse sera vérifiée pour une correspondance.
  • éther dst ehost
    • Vrai si l'adresse de destination Ethernet est ehost . Ehost peut être soit un nom de / etc / ethers, soit un numéro (voir éthers (3N) pour le format numérique).
  • éther src ehost
    • Vrai si l'adresse source Ethernet est ehost .
  • l'éther hôte ehost
    • Vrai si l’adresse source ou de destination Ethernet est ehost .
  • passerelle hôte
    • Vrai si le paquet utilisé hôte passerelle (c’est-à-dire que l’adresse source ou de destination Ethernet était hôte mais ni la source IP ni la destination IP n'étaient hôte ).
    • Hôte doit être un nom et doit être trouvé à la fois par les mécanismes de résolution de nom d'hôte en adresse IP de la machine (fichier de nom d'hôte, DNS, NIS, etc.) et par le mécanisme de résolution de nom d'hôte en adresse Ethernet de la machine (/ etc / ethers, etc.).
    • Une expression équivalente est l'éther hôte ehost et maintenant héberger hôte , qui peut être utilisé avec des noms ou des chiffres pour hôte / hôte .) Cette syntaxe ne fonctionne pas dans la configuration compatible IPv6 pour le moment.
  • dst net net
    • Vrai si l’adresse de destination IPv4 / v6 du paquet a un numéro de réseau de net . Net peut être soit un nom de / etc / networks ou un numéro de réseau (voir réseaux (4) pour plus de détails).
  • src net net
    • Vrai si l’adresse source IPv4 / v6 du paquet a un numéro de réseau de net .
  • net net
    • Vrai si l’adresse source ou de destination IPv4 / v6 du paquet a un numéro de réseau de net .
  • net net masque masque de réseau
    • Vrai si l'adresse IP correspond net avec le spécifique masque de réseau . Peut être qualifié avecsrc oudst. Notez que cette syntaxe n'est pas valide pour IPv6 net .
  • net net / len
    • Vrai si l'adresse IPv4 / v6 correspond net avec un masque de réseau len bits de large. Peut être qualifié avecsrc oudst.
  • port dst Port
    • Vrai si le paquet est ip / tcp, ip / udp, ip6 / tcp ou ip6 / udp et a une valeur de port de destination de Port . le Port peut être un numéro ou un nom utilisé dans / etc / services (voir tcp (4P) et UDP (4P)). Si un nom est utilisé, le numéro de port et le protocole sont vérifiés. Si un numéro ou un nom ambigu est utilisé, seul le numéro de port est vérifié (par exemple,port dst 513 imprimera à la fois le trafic TCP / login et le trafic UDP / Who, etdomaine portuaire imprimera à la fois le trafic TCP / Domain et UDP / Domain).
  • port src Port
    • Vrai si le paquet a une valeur de port source de Port .
  • Port Port
    • True si le port source ou destination du paquet est Port . Toutes les expressions de port ci-dessus peuvent être précédées des mots-clés,tcp ouUDP, un péché tcp src port Port , qui correspond uniquement aux paquets TCP dont le port source est Port .
  • Moins longueur
    • Vrai si le paquet a une longueur inférieure ou égale à longueur . Ceci est équivalent à len <= Longueur .
  • plus grand longueur
    • Vrai si le paquet a une longueur supérieure ou égale à longueur . Ceci est équivalent à len> = Longueur .
  • ip proto protocole
    • Vrai si le paquet est un paquet IP (voir ip (4P)) de type de protocole protocole . Protocole peut être un numéro ou l'un des noms icmp , icmp6 , igmp , igrp , pim , ah , esp , vrrp , UDP , ou tcp . Notez que les identifiants tcp , UDP , et icmp sont également des mots-clés et doivent être échappés via une barre oblique inverse (), qui est dans le C-shell. Notez que cette primitive ne chasse pas la chaîne d'en-tête de protocole.
  • ip6 proto protocole
    • Vrai si le paquet est un paquet IPv6 de type de protocole protocole . Notez que cette primitive ne chasse pas la chaîne d'en-tête de protocole.
  • protocole ip6 protocole
    • Vrai si le paquet est un paquet IPv6 et contient un en-tête de protocole avec le type protocole dans sa chaîne d'en-tête de protocole. Par exemple, protocole ipv6 6 correspond à tout paquet IPv6 avec en-tête de protocole TCP dans la chaîne d'en-tête de protocole. Le paquet peut contenir, par exemple, un en-tête d'authentification, un en-tête de routage ou un en-tête d'option saut par saut, entre l'en-tête IPv6 et l'en-tête TCP. Le code BPF émis par cette primitive est complexe et ne peut pas être optimisé par le code de l’optimiseur BPF tcpdump Cela peut donc être un peu lent.
  • ip protochain protocole
    • Équivalent àprotocole ip6 protocole , mais ceci est pour IPv4.
  • diffusion d'éther
    • Vrai si le paquet est un paquet de diffusion Ethernet. le éther le mot clé est facultatif.
  • diffusion ip
    • Vrai si le paquet est un paquet de diffusion IP. Il vérifie les conventions de diffusion des zéros et des tout-un, et recherche le masque de sous-réseau local.
  • éther multicast
    • Vrai si le paquet est un paquet de multidiffusion Ethernet. le éther le mot clé est facultatif. Ceci est un raccourci pour 'éther 0 & 1! = 0'.
  • multidiffusion ip
    • Vrai si le paquet est un paquet de multidiffusion IP.
  • multidiffusion ip6
    • Vrai si le paquet est un paquet multicast IPv6.
  • éther proto protocole
    • Vrai si le paquet est de type ether protocole . Protocole peut être un numéro ou l'un des noms ip , ip6 , arp , rarp , une conversation , aarp , décnet , sca , lat , mopdl , moprc , iso , stp , ipx , ou Netbeui . Notez que ces identifiants sont aussi des mots-clés et doivent être échappés via une barre oblique inverse ().
    • Dans le cas de FDDI (par exemple, 'protocole fddi arp') et Token Ring (par exemple,'tr protocole arp'), pour la plupart de ces protocoles, l'identification de protocole provient de l'en-tête de contrôle de liaison logique (LLC) 802.2, qui est généralement superposé à l'en-tête FDDI ou Token Ring.
    • Lors du filtrage de la plupart des identifiants de protocole sur FDDI ou Token Ring, tcpdump vérifie uniquement le champ ID de protocole d'un en-tête LLC au format dit SNAP avec un identificateur d'unité d'organisation (OUI) de 0x000000, pour Ethernet encapsulé; il ne vérifie pas si le paquet est au format SNAP avec un OUI de 0x000000.
    • Les exceptions sont iso , pour lequel il vérifie les champs DSAP (point d'accès au service de destination) et SSAP (point d'accès au service source) de l'en-tête LLC, stp et Netbeui , où il vérifie le DSAP de l'en-tête LLC et une conversation , où il recherche un paquet au format SNAP avec une OUI de 0x080007 et le type etlet Appletalk.
    • Dans le cas d'Ethernet, tcpdump vérifie le champ de type Ethernet pour la plupart de ces protocoles; les exceptions sont iso , sève , et Netbeui , pour lequel il recherche une trame 802.3, puis l’en-tête LLC comme il le fait pour FDDI et Token Ring; une conversation , où il vérifie à la fois le type Appletalk dans une trame Ethernet et un paquet au format SNAP comme il le fait pour FDDI et Token Ring; aarp , où il vérifie le type ARP d’Appletalk dans une trame Ethernet ou dans une trame SNAP 802.2 avec un OUI de 0x000000; et ipx , où il vérifie le type IPX dans une trame Ethernet, le DSAP IPX dans l’en-tête LLC, le 802.3 sans encapsulation d’IPX dans l’en-tête LLC et le type IPX dans une trame SNAP.
  • decnet src hôte
    • Vrai si l'adresse source de DECNET est hôte , qui peut être une adresse de la forme "10.123" ou un nom d’hôte DECNET. La prise en charge du nom d’hôte DECNET est uniquement disponible sur les systèmes Ultrix configurés pour exécuter DECNET.
  • decnet dst hôte
    • Vrai si l'adresse de destination DECNET est hôte .
  • hôte décnet hôte
    • Vrai si l’adresse source ou de destination DECNET est hôte .
  • ip, ip6, arp, rarp, une conversation, aarp, décnet, iso, stp, ipx, Netbeui
    • Abréviations pour éther proto p où p est l'un des protocoles ci-dessus.
  • lat, moprc, mopdl
    • Abréviations pour éther proto p où p est l'un des protocoles ci-dessus. Notez que tcpdump ne sait pas actuellement comment analyser ces protocoles.
  • vlan vlan_id
    • Vrai si le paquet est un paquet VLAN IEEE 802.1Q. Si vlan_id est spécifié, seulement vrai si le paquet a le spécifié vlan_id . Notez que le premiervlan mot clé rencontré dans expression modifie les décalages de décodage pour le reste de expression en supposant que le paquet est un paquet VLAN.
  • tcp, UDP, icmp
    • Abréviations pour ip proto p ou ip6 proto p où p est l'un des protocoles ci-dessus.
  • iso proto protocole
    • Vrai si le paquet est un paquet OSI de type de protocole protocole . Protocole peut être un numéro ou l'un des noms clnp , esis , ou isis .
  • clnp, esis, isis
    • Abréviations pour iso proto p où p est l'un des protocoles ci-dessus. Notez que tcpdump effectue une analyse incomplète de ces protocoles.
  • expr relop expr
    • Vrai si la relation est vraie, où relopper est l'un de>, <,> =, <=, =,! = et expr est une expression arithmétique composée de constantes entières (exprimées dans la syntaxe C standard), des opérateurs binaires normaux +, -, *, /, &, |, d'un opérateur de longueur et d'accesseurs de données par paquets spéciaux. Pour accéder aux données à l'intérieur du paquet, utilisez la syntaxe suivante: proto expr: taille .

Proto fait partie deéther, fddi, tr, ppp, caleçon, lien, ip, arp, rarp, tcp, UDP, icmp, ou ip6et indique la couche de protocole pour l'opération d'indexation (éther, fddi, tr, ppp, caleçon, etlien tous se réfèrent à la couche de liaison). Notez que tcp, udp , et les autres types de protocole de couche supérieure s’appliquent uniquement à IPv4, pas à IPv6 (ce problème sera résolu ultérieurement). Le décalage d'octet, par rapport à la couche de protocole indiquée, est donné par expr . Taille est facultatif et indique le nombre d'octets dans le champ d'intérêt; il peut être un, deux ou quatre, et par défaut, un. L'opérateur de longueur, indiqué par le mot clélen, donne la longueur du paquet.

Par exemple, 'éther 0 & 1! = 0'capture tout le trafic multicast. L'expression 'ip 0 & 0xf! = 5'capture tous les paquets IP avec des options. L'expression 'ip 6: 2 & 0x1fff = 0'attrape uniquement les datagrammes non fragmentés et le fragment de fragmentation zéro. Ce contrôle est implicitement appliqué à latcp etUDP opérations d'index. Par exemple, tcp 0 signifie toujours le premier octet du TCP entête et ne signifie jamais le premier octet d’un fragment intervenant.

Certains décalages et valeurs de champs peuvent être exprimés sous forme de noms plutôt que sous forme de valeurs numériques. Les décalages de champ d'en-tête de protocole suivants sont disponibles: icmptype (Champ de type ICMP),icmpcode (Champ de code ICMP), ettcpflags (Champ drapeaux TCP).

Les valeurs de champ de type ICMP suivantes sont disponibles:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

Les valeurs de champ des drapeaux TCP suivants sont disponibles:tcp-fin, tcp-syn, tcp-premier, tcp-push, tcp-push, tcp-ack, tcp-urg.

Les primitives peuvent être combinées en utilisant l’un des éléments suivants:

  • Un groupe de primitives et d'opérateurs entre parenthèses (les parenthèses sont spécifiques au shell et doivent être échappées)
  • Négation ('!'ou `ne pas')
  • Concaténation ('&&' ou 'et')
  • Alternance ('||' ou 'ou')

La négation a la plus haute priorité. L'alternance et la concaténation ont la même priorité et sont associées de gauche à droite. Notez que expliciteet Les jetons, et non la juxtaposition, sont requis pour la concaténation.

Si un identifiant est donné sans mot-clé, le mot-clé le plus récent est utilisé. Par exemple, pas hôte vs et as est l'abréviation de pas hôte vs et hôte as. Cependant, cela ne doit pas être confondu avec non (hôte vs ou as).

Les arguments d'expression peuvent être passés à tcpdump sous forme d'argument unique ou d'arguments multiples, selon ce qui est le plus pratique. En règle générale, si l'expression contient des métacaractères Shell, il est plus facile de la transmettre sous la forme d'un seul argument cité. Plusieurs arguments sont concaténés avec des espaces avant d'être analysés.

Exemples Tcpdump

tcpdump host sundown

La commande tcpdump ci-dessus est utilisée pour imprimer tous les paquets arrivant à ou partant de coucher.

tcpdump host helios et (hot ou ace )

Cet exemple tcpdump imprime le trafic entre Hélios et soit chaud ou ace.

tcpdump ip hôte as et pas helios

Vous pouvez utiliser cette commande tcpdump pour imprimer tous les paquets IP entre ace et tout hôte sauf Hélios.

tcpdump net ucb-ether

Dans l'exemple ci-dessus, tcpdump imprime tout le trafic entre les hôtes locaux et les hôtes chez Berkeley.

tcpdump 'snap de passerelle et (port ftp ou ftp-data)'

Cet exemple de commande tcpdump suivant est utilisé pour imprimer tout le trafic FTP via une passerelle Internet. snup . Notez que l'expression est citée pour empêcher le shell d'interpréter de manière erronée les parenthèses.

tcpdump ip et pas net localnet

Dans l'exemple ci-dessus, tcpdump, la commande imprime le trafic ni originaire ni à destination des hôtes locaux.

tcpdump 'tcp tcpflags & (tcp-syn | tcp-fin)! = 0 et non src et dst net localnet '

Pour l'exemple ci-dessus de tcpdump, la commande est utilisée pour imprimer les paquets de début et de fin (les paquets SYN et FIN) de chaque conversation TCP impliquant un hôte non local.

tcpdump 'snap de passerelle et ip 2: 2> 576'

La commande ci-dessus imprimera les paquets IP de plus de 576 octets envoyés via la passerelle. snup.

tcpdump 'ether 0 & 1 = 0 et ip 16> = 224'

La commande tcpdump ci-dessus affiche les paquets de diffusion IP ou de multidiffusion qui ont été ne pas envoyé par diffusion Ethernet ou multidiffusion.

tcpdump 'icmp icmptype! = icmp-echo et icmp icmptype! = icmp-echoreply'

Dans ce dernier exemple de tcpdump, la commande imprime tous les paquets ICMP qui ne sont ni des requêtes ni des réponses en écho (c.-à-d., Sans ping des paquets).

Format de sortie Tcpdump

La sortie de tcpdump dépend du protocole. Vous trouverez ci-dessous une brève description et des exemples de la plupart des formats.

En-têtes de niveau de lien. Si l'option '-e' est donnée, l'en-tête de niveau de lien est imprimé. Sur les réseaux Ethernet, les adresses source et de destination, le protocole et la longueur du paquet sont imprimés.

Sur les réseaux FDDI, l’option '-e' provoque tcpdump pour imprimer le champ 'contrôle de trame', les adresses de source et de destination et la longueur du paquet. (Le champ "contrôle de trame" régit l'interprétation du reste du paquet. Les paquets normaux (tels que ceux contenant des datagrammes IP) sont des paquets "asynchrones", avec une valeur de priorité comprise entre 0 et 7: par exemple, `async4'. Ces paquets sont supposés contenir un paquet 802.2 Logical Link Control (LLC); l'en-tête LLC est imprimé s'il est ne pas un datagramme ISO ou un paquet dit SNAP.

Sur les réseaux Token Ring, l'option '-e' provoque tcpdump pour imprimer les champs 'contrôle d'accès' et 'contrôle de trame', les adresses source et de destination, ainsi que la longueur du paquet. Comme sur les réseaux FDDI, les paquets sont supposés contenir un paquet LLC. Que l'option "-e" soit spécifiée ou non, les informations de routage source sont imprimées pour les paquets routés par la source.

(NB: La description suivante suppose la connaissance de l'algorithme de compression SLIP décrit dans la RFC-1144.)

Sur les liaisons SLIP, un indicateur de direction ("I" pour les entrées, "O" pour les sorties), le type de paquet et les informations de compression sont imprimés. Le type de paquet est imprimé en premier. Les trois types sont ip , utcp , et ctcp . Aucune autre information de lien n'est imprimée pour ip paquets. Pour les paquets TCP, l'identifiant de connexion est imprimé suivant le type. Si le paquet est compressé, son en-tête codé est imprimé. Les cas spéciaux sont imprimés comme* S + n et* SA + n , où n est le montant par lequel le numéro de séquence (ou le numéro de séquence et ack) a changé. S'il ne s'agit pas d'un cas particulier, aucune modification ou plus n'est imprimée. Un changement est indiqué par U (pointeur urgent), W (fenêtre), A (ack), S (numéro de séquence) et I (identificateur de paquet), suivi d'un delta (+ n ou -n) ou d'une nouvelle valeur. (= n). Enfin, la quantité de données dans le paquet et la longueur de l'en-tête compressé sont imprimées.

Par exemple, la ligne suivante montre un paquet TCP compressé sortant, avec un identifiant de connexion implicite; l'accusé de réception a changé de 6, le numéro de séquence de 49 et l'ID de paquet de 6; il y a 3 octets de données et 6 octets d'en-tête compressé:

O ctcp * A + 6 S + 49 I + 6 3 (6)

Paquets Arp / RARP. La sortie Arp / rarp montre le type de requête et ses arguments. Le format est destiné à être explicite. Voici un court échantillon tiré du début d'un 'rlogin' de l'hôte rtsg héberger csam :

arp qui-a csam dire rtsgréponse arp csam is-at CSAM

La première ligne indique que rtsg a envoyé un paquet arp demandant l’adresse Ethernet de l’hôte Internet csam. Csam répond avec son adresse Ethernet (dans cet exemple, les adresses Ethernet sont en majuscules et les adresses Internet en minuscules).

Cela semblerait moins redondant si nous avions fait tcpdump -n :

arp qui-a 128.3.254.6 dire 128.3.254.68réponse arp 128.3.254.6 est à 02: 07: 01: 00: 01: c4

Si nous avions fait tcpdump -e , le fait que le premier paquet soit diffusé et le second point à point serait visible:

RTSG Broadcast 0806 64: arp qui-a csam dit à rtsgCSAM RTSG 0806 64: réponse arp csam is-at CSAM

Pour le premier paquet, cela signifie que l'adresse source Ethernet est RTSG, la destination est l'adresse de diffusion Ethernet, le champ de type contient l'hex 0806 (type ETHER_ARP) et la longueur totale était de 64 octets.

Paquets TCP (NB: la description suivante suppose que vous connaissez le protocole TCP décrit dans la RFC 793. Si vous n'êtes pas familiarisé avec le protocole, ni cette description ni tcpdump ne vous seront d'aucune utilité.) . Le format général d’une ligne de protocole TCP est le suivant:

src> dst: options urgentes de la fenêtre data-seqno ack

Src et dst sont les adresses IP et les ports source et de destination. Drapeaux sont une combinaison de S (SYN), F (FIN), P (PUSH) ou R (RST) ou un simple '.' (pas de drapeaux). Data-seqno décrit la partie de l'espace de séquence couverte par les données de ce paquet (voir exemple ci-dessous). Ack est le numéro de séquence des données suivantes attendues dans l'autre sens sur cette connexion. La fenêtre est le nombre d'octets d'espace disponible dans le tampon de réception dans l'autre sens sur cette connexion. Urg indique qu'il y a des données 'urgentes' dans le paquet. Les options Les options tcp sont-elles placées entre crochets (par exemple, ).

Src, dst, et drapeaux sont toujours présents. Les autres champs dépendent du contenu de l'en-tête de protocole TCP du paquet et ne sont générés que si cela est approprié.

Voici la partie d'ouverture d'un rlogin de l'hôte rtsg héberger csam .

rtsg.1023> csam.login: S 768512: 768512 (0) gagne 4096 csam.login> rtsg.1023: S 947648: 947648 (0) ack 768513 win 4096 rtsg.1023> csam.login:. ack 1 gagne 4096rtsg.1023> csam.login: P 1: 2 (1) ack 1 victoire 4096csam.login> rtsg.1023:. ack 2 gagne 4096rtsg.1023> csam.login: P 2:21 (19) ack 1 victoire 4096csam.login> rtsg.1023: P 1: 2 (1) 21 achats 4077csam.login> rtsg.1023: P 2: 3 (1) 21 achats 4040 urg 1csam.login> rtsg.1023: P 3: 4 (1) 21 achats 4040 urg 1

La première ligne indique que le port tcp 1023 sur rtsg a envoyé un paquet au port s'identifier sur csam. leS indique que le SYN le drapeau a été mis. Le numéro de séquence du paquet était 768512 et il ne contenait aucune donnée. (La notation est 'first: last (nbytes)', ce qui signifie 'numéros de séquence premier jusqu'à mais non compris dernier lequel est nbytes octets de données utilisateur '.) Il n'y avait pas d'acquiérage, la fenêtre de réception disponible était de 4096 octets, et il y avait une option de taille maximale de segment demandant une masse de 1024 octets.

Csam répond avec un paquet similaire sauf qu'il inclut un accusé de réception pour le SYN de rtsg. Rtsg accepte alors SYN de csam. Le '.' signifie qu'aucun drapeau n'a été placé. Le paquet ne contenait aucune donnée, il n'y avait donc pas de numéro de séquence de données. Notez que le numéro de séquence ack est un petit entier (1). La première fois tcpdump voit une "conversation" tcp, il affiche le numéro de séquence du paquet. Sur les paquets suivants de la conversation, la différence entre le numéro de séquence du paquet actuel et ce numéro de séquence initial est imprimée. Cela signifie que les numéros de séquence après le premier peuvent être interprétés comme des positions relatives d'octets dans le flux de données de la conversation (le premier octet de données étant chaque direction égale à '1'). '-S' annulera cette fonction, ce qui entraînera la sortie des numéros de séquence originaux.

Sur la sixième ligne, rtsg envoie à Csam 19 octets de données (octets 2 à 20 dans la partie rtsg -> csam de la conversation). L'indicateur PUSH est défini dans le paquet. Sur la septième ligne, csam indique que les données reçues envoyées par rtsg ne comprennent pas l'octet 21. La plupart de ces données se trouvent apparemment dans le tampon de socket car la fenêtre de réception de csam a été réduite de 19 octets. Csam envoie également un octet de données à rtsg dans ce paquet. Sur les huitième et neuvième lignes, csam envoie deux octets de données urgentes poussées à rtsg.

Si l'instantané était assez petit pour que tcpdump n'a pas capturé l'intégralité de l'en-tête TCP, il interprète autant d'en-tête que possible et enregistre "" | tcp '' pour indiquer que le reste ne peut pas être interprété. Si l’en-tête contient une option fictive (une option trop petite ou dépassant la fin de l’en-tête), tcpdump le signale comme " mauvais choix '' et n'interprète pas d'autres options (puisqu'il est impossible de dire par où elles commencent). Si la longueur de l'en-tête indique que des options sont présentes mais que la longueur du datagramme IP n'est pas assez longue pour que les options soient réellement présentes, tcpdump le signale comme " mauvaise longueur de hdr ''.

Capturer des paquets avec des combinaisons de drapeaux particulières. Il y a huit bits dans la section des bits de contrôle de l'en-tête TCP:

CWR | ECE | URG | ACK | PSH | RST | SYN | AILETTE

Supposons que nous souhaitons surveiller les paquets utilisés pour établir une connexion TCP. Rappelons que TCP utilise un protocole de négociation à trois voies lorsqu’il initialise une nouvelle connexion; la séquence de connexion en ce qui concerne les bits de contrôle TCP est la suivante:

  1. L'appelant envoie SYN.
  2. Le destinataire répond par SYN, ACK.
  3. L'appelant envoie ACK.

Nous sommes maintenant intéressés par la capture de paquets ne contenant que le bit SYN défini (étape 1). Notez que nous ne voulons pas de paquets de l'étape 2 (SYN-ACK), mais simplement d'un SYN initial. Nous avons besoin d’une expression de filtre correcte pour tcpdump .

Rappelez la structure d'un en-tête TCP sans options:

0 15 31-----------------------------------------------------------------| port source | port de destination |-----------------------------------------------------------------| numéro de séquence |-----------------------------------------------------------------| numéro d'accusé de réception |-----------------------------------------------------------------| HL | rsvd | C | E | U | A | P | R | S | F | taille de la fenêtre |-----------------------------------------------------------------| Somme de contrôle TCP | pointeur urgent |-----------------------------------------------------------------

Un en-tête TCP contient généralement 20 octets de données, sauf si des options sont présentes. La première ligne du graphique contient les octets 0 à 3, la deuxième ligne indique les octets 4 à 7, etc.

Commençant à compter avec 0, les bits de contrôle TCP pertinents sont contenus dans l'octet 13:

0 7| 15| 23| 31----------------|---------------|---------------|----------------| HL | rsvd | C | E | U | A | P | R | S | F | taille de la fenêtre |----------------|---------------|---------------|----------------| | 13ème octet | | |

Regardons de plus près l'octet no. 13:

| | |---------------| | C | E | U | A | P | R | S | F | |---------------| |7 5 3 0|

Ce sont les bits de contrôle TCP qui nous intéressent. Nous avons numéroté les bits de cet octet de 0 à 7, de droite à gauche, de sorte que le bit PSH est le bit numéro 3, tandis que le bit URG est le numéro 5.

Rappelons que nous voulons capturer des paquets avec uniquement SYN défini. Voyons ce qui arrive à l'octet 13 si un datagramme TCP arrive avec le bit SYN défini dans son en-tête:

| C | E | U | A | P | R | S | F | |---------------| |0 0 0 0 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

En regardant la section des bits de contrôle, nous voyons que seul le bit numéro 1 (SYN) est défini.

En supposant que le numéro d’octet 13 soit un entier non signé de 8 bits dans l’ordre des octets du réseau, la valeur binaire de cet octet est la suivante:

00000010

Sa représentation décimale est:

7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2

Nous avons presque terminé, car nous savons maintenant que si seul SYN est défini, la valeur du 13e octet de l'en-tête TCP, interprétée comme un entier non signé de 8 bits dans l'ordre des octets du réseau, doit être exactement égale à 2.

Cette relation peut être exprimée comme

tcp 13 == 2

Nous pouvons utiliser cette expression comme filtre pour tcpdump afin de regarder les paquets qui ont seulement SYN défini:

tcpdump -i xl0 tcp 13 == 2

L'expression dit "laissez le 13ème octet d'un datagramme TCP avoir la valeur décimale 2", ce qui est exactement ce que nous voulons.

Supposons maintenant que nous devons capturer les paquets SYN, mais nous ne nous soucions pas de savoir si ACK ou tout autre bit de contrôle TCP est défini en même temps. Regardez ce qui arrive à l'octet 13 quand un datagramme TCP avec SYN-ACK arrive:

| C | E | U | A | P | R | S | F | |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|

Les bits 1 et 4 sont maintenant définis dans le 13ème octet. La valeur binaire de l'octet 13 est:

00010010

ce qui se traduit par décimal:

7 6 5 4 3 2 1 00*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18

Nous ne pouvons pas simplement utiliser 'tcp 13 == 18' dans le tcpdump expression de filtre, car cela ne sélectionnerait que les paquets pour lesquels SYN-ACK est défini, mais pas ceux contenant uniquement SYN. Rappelez-vous que nous ne nous soucions pas de savoir si ACK ou tout autre bit de contrôle est défini tant que SYN est défini.

Pour atteindre notre objectif, nous devons logiquement ET la valeur binaire de l'octet 13 avec une autre valeur afin de préserver le bit SYN. Nous savons que nous voulons que SYN soit défini dans tous les cas, nous allons donc logiquement ET la valeur du 13ème octet avec la valeur binaire d'un SYN:

00010010 SYN-ACK 00000010 SYN AND 00000010 (nous voulons SYN) ET 00000010 (nous voulons SYN) -------- -------- = 00000010 = 00000010

Nous voyons que cette opération AND produit le même résultat, que ACK ou un autre bit de contrôle TCP soit activé. La représentation décimale de la valeur AND ainsi que le résultat de cette opération étant 2 (00000010 binaire), nous savons donc que pour les paquets avec SYN défini, la relation suivante doit être vérifiée:

((valeur de l'octet 13) AND (2)) == (2)

Cela nous amène à la tcpdump expression du filtre

tcpdump -i xl0 'tcp 13 & 2 == 2'

Notez que vous devez utiliser des guillemets simples ou une barre oblique inverse dans l'expression pour masquer le caractère spécial AND ('&') du shell.

Paquets UDP. Le format UDP est illustré par ce paquet rwho:

actinide.qui> émission.qui: udp 84

Cela dit que le port qui sur l'hôte actinide envoyé un datagramme udp au port qui sur l'hôte diffuser , l'adresse de diffusion Internet. Le paquet contenait 84 octets de données utilisateur.

Certains services UDP sont reconnus (à partir du numéro de port source ou de destination) et des informations de protocole de niveau supérieur sont imprimées, notamment les demandes de service de nom de domaine (RFC-1034/1035) et les appels Sun RPC (RFC-1050) à NFS.

Requêtes de serveur de noms UDP (NB: la description suivante suppose que vous connaissez le protocole de service de domaine décrit dans la RFC 1035. Si vous n'êtes pas familiarisé avec le protocole, la description ci-dessous n'aura aucun sens.)

Les requêtes du serveur de noms sont au format:

src> dst: id op? flags qtype nom_classe (len) h2opolo.1538> helios.domaine: 3+ A? ucbvax.berkeley.edu. (37)

Hôte h2opolo demandé au serveur de domaine sur Hélios pour un enregistrement d'adresse (qtype = A) associé au nom ucbvax.berkeley.edu. L'identifiant de la requête était '3'. Le '+' indique le récursion souhaitée le drapeau a été mis. La longueur de la requête était de 37 octets, sans compter les en-têtes de protocole UDP et IP. L'opération de requête était la normale, Question , donc le champ op a été omis. Si l'opération avait été autre chose, elle aurait été imprimée entre le '3' et le '+'. De même, la classe q était la normale, C_IN et omis. Toute autre classe de classe aurait été imprimée immédiatement après le «A».

Quelques anomalies sont vérifiées et peuvent générer des champs supplémentaires entre crochets: Si une requête contient une réponse, des notices d’autorité ou une section d’enregistrements supplémentaires, ancount , nscount , ou montant sont imprimés en tant que ' n une', ' n n 'ou' n au 'où n est le compte approprié. Si l'un des bits de réponse est défini (AA, RA ou rcode) ou si l'un des bits `doit être égal à zéro 'est défini dans les octets deux et trois,` b2 & 3 = X 'est imprimé, où X est la valeur hexadécimale des octets deux et trois de l'en-tête.

Réponses du serveur de noms UDP. Les réponses du serveur de