informatique:logiciels:tcpdump
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
informatique:logiciels:tcpdump [2010/09/14 08:45] – -nn pteu | informatique:logiciels:tcpdump [2020/10/07 14:36] – [Paramètres] pteu | ||
---|---|---|---|
Line 8: | Line 8: | ||
< | < | ||
tcpdump < | tcpdump < | ||
+ | </ | ||
+ | |||
+ | A la fin d'une capture, on a le retour suivant : | ||
+ | <code bash> | ||
+ | 0 packets captured | ||
+ | 130 packets received by filter | ||
+ | 35 packets dropped by kernel | ||
+ | </ | ||
+ | * **packets captured** indique le nombre de paquet capturés | ||
+ | * **packets received by filter** apparemment sa signification dépend de l'OS ; en général cela semble indiquer les paquets qui sont arrivés sur l' | ||
+ | * **packets dropped by kernel** sont les paquets supprimés par manque de ressources. Cela vient du fait que le processeur n' | ||
+ | * utiliser des filtres pour baisser la charge CPU | ||
+ | * augmenter le buffer de réception des sockets : | ||
+ | Pour connaitre la taille du buffer (taille par défaut et taille max) de réception d'une socket : | ||
+ | <code bash> | ||
+ | sysctl net.core.rmem_default | ||
+ | net.core.rmem_default = 110592 | ||
+ | sysctl net.core.rmem_max | ||
+ | net.core.rmem_max = 131071 | ||
+ | </ | ||
+ | |||
+ | On peut l' | ||
+ | <code bash> | ||
+ | sysctl net.core.rmem_max=1013760 | ||
+ | sysctl net.core.rmem_default=1013760 | ||
</ | </ | ||
=====Paramètres===== | =====Paramètres===== | ||
- | * '' | + | |
+ | | ||
* '' | * '' | ||
* '' | * '' | ||
Line 19: | Line 45: | ||
* '' | * '' | ||
* '' | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
* '' | * '' | ||
* '' | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
=====Filtres===== | =====Filtres===== | ||
Line 26: | Line 60: | ||
* par protocole : '' | * par protocole : '' | ||
* par adresse Ethernet : '' | * par adresse Ethernet : '' | ||
- | * par IP : ''< | + | * par IP : '' |
* par réseau IP : '' | * par réseau IP : '' | ||
* par port : '' | * par port : '' | ||
* par plage de ports : '' | * par plage de ports : '' | ||
+ | * source ou destination (s' | ||
* par taille de paquet (égal ou inférieur/ | * par taille de paquet (égal ou inférieur/ | ||
- | * source ou destination (s' | ||
* par vlan (dot1q) : '' | * par vlan (dot1q) : '' | ||
* par label MPLS : '' | * par label MPLS : '' | ||
Line 42: | Line 76: | ||
* OU : '' | * OU : '' | ||
* OU logique : '' | * OU logique : '' | ||
+ | |||
+ | ====Analyse avancée des entêtes==== | ||
+ | |||
+ | On peut préciser à tcpdump d' | ||
+ | <code bash> | ||
+ | proto[x:y] | ||
+ | </ | ||
+ | On analyse à partir de l' | ||
+ | |||
+ | C'est important de connaitre le format des entêtes du protocole analysé ; par exemple pour IPv4 : | ||
+ | < | ||
+ | 0 | ||
+ | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | |Version| | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Time to Live | Protocol | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Destination Address | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Options | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | DATA ... | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | </ | ||
+ | |||
+ | ... ou TCP : | ||
+ | < | ||
+ | 0 | ||
+ | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Source Port | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Sequence Number | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Acknowledgment Number | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Data | | ||
+ | | Offset| Reserved | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Options | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | </ | ||
====Divers==== | ====Divers==== | ||
* flags TCP | * flags TCP | ||
- | < | + | < |
tcp-ack | tcp-ack | ||
tcp-psh | tcp-psh | ||
Line 53: | Line 139: | ||
tcp-fin | tcp-fin | ||
</ | </ | ||
+ | |||
+ | Exemple d' | ||
+ | <code bash> | ||
+ | tcpdump ' | ||
+ | </ | ||
+ | |||
* types ICMP | * types ICMP | ||
- | < | + | < |
icmp-echoreply | icmp-echoreply | ||
icmp-routeradvert | icmp-routeradvert | ||
Line 72: | Line 164: | ||
</ | </ | ||
+ | Exemple : capturer les paquets icmp qui ne soient pas du PING (ni echo request ni echo reply). | ||
+ | <code bash> | ||
+ | tcpdump ’icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’ | ||
+ | </ | ||
- | =====Exemples===== | ||
- | tcpdump -i eth0 not host toto | + | =====Exemples d' |
- | | + | Pour être lisible, le maître mot dans une capture est de restreindre la sortie au maximum. La première chose est donc de n' |
+ | <code bash> | ||
+ | tcpdump -D | ||
+ | 1.eth0 | ||
+ | 2.eth1 | ||
+ | 3.any (Pseudo-device that captures on all interfaces) | ||
+ | 4.lo | ||
+ | </code> | ||
- | | + | Puis, pour ne capturer que les trames issues ou à destination de la machine 192.168.0.1 sur l' |
- | qui permet | + | <code bash> |
- | tcpdump -i eth0 icmp | + | tcpdump -i eth0 host 192.168.0.1 |
+ | </ | ||
+ | |||
+ | D'autres exemples : | ||
+ | |||
+ | <code bash> | ||
+ | tcpdump -i eth0 not host toto | ||
+ | tcpdump -i eth0 host toto and net 192.168.0.0/ | ||
+ | </ | ||
+ | |||
+ | 2 équivalents | ||
+ | <code bash> | ||
+ | tcpdump -i eth0 'ip[9] = 1' | ||
+ | tcpdump -i eth0 icmp | ||
+ | </ | ||
+ | |||
+ | 2 équivalents pour filtrer les //jumbo frame// (les paquets de taille supérieure | ||
+ | <code bash> | ||
+ | tcpdump -i eth1 'len > 1518' | ||
+ | tcpdump -i eth1 ' | ||
+ | </ | ||
+ | |||
+ | Filtrer les trames Ethernet ('' | ||
+ | <code bash> | ||
+ | tcpdump -e -nni eth0 ether src 00: | ||
+ | </ | ||
+ | NB : l' | ||
====Filtrer les paquets fragmentés==== | ====Filtrer les paquets fragmentés==== | ||
- | L' | + | L' |
- | tcmpdump 'ip[6] & 0x20' = 32 | + | < |
+ | tcmpdump 'ip[6] & 0x20' = 32 | ||
+ | </ | ||
Le résultat de cette addition logique peut être soit 0 soit 32 : en effet le masque ajouté avec un " | Le résultat de cette addition logique peut être soit 0 soit 32 : en effet le masque ajouté avec un " | ||
+ | |||
+ | Cependant cette méthode ne tient pas compte des derniers paquets fragmentés qui ont le bit MF = 0. En revanche ceux-ci possèdent un champ //fragment offset// non nul : | ||
+ | < | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | |Flags| | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | |||
+ | Bit 0: reserved, must be zero | ||
+ | Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment. | ||
+ | Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments. | ||
+ | </ | ||
+ | |||
+ | Une autre façon de faire est donc de chercher les paquets dont ces champs ne sont pas vide ET dont le bit DF (Don't Fragment) n'est pas égal à 1. | ||
+ | <code bash> | ||
+ | tcpdump -i eth1 ' | ||
+ | </ | ||
+ | |||
+ | ====Paquet DF==== | ||
+ | |||
+ | Pour filtrer les paquets "non fragmentables" | ||
+ | <code bash> | ||
+ | tcpdump -nnv 'ip[6] = 64' | ||
+ | </ | ||
+ | |||
+ | En effet on regarde le 7e octet de l' | ||
+ | |||
+ | Donc, les paquets non fragmentables doivent avoir cet octet égal à " | ||
====Port tcp < 1024==== | ====Port tcp < 1024==== | ||
Line 103: | Line 260: | ||
On ne fait attention qu'au flags ACK et SYN : on veut que le premier soit à 0 et le second à 1. Ceci se traduit par l' | On ne fait attention qu'au flags ACK et SYN : on veut que le premier soit à 0 et le second à 1. Ceci se traduit par l' | ||
- | < | + | |
+ | < | ||
<octet 13 de chaque paquet> ET < | <octet 13 de chaque paquet> ET < | ||
tcp[13] ET 00010010 = 00000010 | tcp[13] ET 00010010 = 00000010 | ||
Line 117: | Line 275: | ||
</ | </ | ||
(l' | (l' | ||
+ | |||
+ | ====Filtrer les paquets TCP FIN==== | ||
+ | |||
+ | On procède de la même façon que pour les TCP SYNs, mais on filtre sur le bit FIN (le bit de poids faible du 13e octet) et on ne tient pas compte du flag ACK car il est (presque ?) toujours activé de toute façon. | ||
+ | |||
+ | ^ champ -> ^ CWR ^ ECE ^ URG ^ ACK ^ PSH ^ RST ^ SYN ^ FIN ^ | ||
+ | | ce qu'on recherche | x | x | x | x | x | x | x | 1 | | ||
+ | |||
+ | Ce qui nous donne : | ||
+ | < | ||
+ | tcpdump -i eth1 -s 40 ' | ||
+ | </ |
informatique/logiciels/tcpdump.txt · Last modified: 2023/02/07 10:46 by pteu