informatique:logiciels:tcpdump
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
informatique:logiciels:tcpdump [2009/12/16 15:31] – Filtrer les paquets TCP SYN pteu | informatique:logiciels:tcpdump [2023/02/07 10:46] (current) – [Filtrer les messages ICMP] 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===== | ||
- | * '' | + | |
+ | | ||
* '' | * '' | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
+ | * '' | ||
* '' | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
* '' | * '' | ||
* '' | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
=====Filtres===== | =====Filtres===== | ||
Line 25: | 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 41: | 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 52: | Line 139: | ||
tcp-fin | tcp-fin | ||
</ | </ | ||
+ | |||
+ | Exemple d' | ||
+ | <code bash> | ||
+ | tcpdump ' | ||
+ | </ | ||
+ | |||
* types ICMP | * types ICMP | ||
- | < | + | < |
icmp-echoreply | icmp-echoreply | ||
icmp-routeradvert | icmp-routeradvert | ||
Line 71: | 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> | ||
- | tcpdump -i eth0 'ip[9] = 1' | + | Puis, pour ne capturer que les trames issues ou à destination |
- | qui permet d' | + | <code bash> |
- | tcpdump -i eth0 icmp | + | tcpdump -i eth0 host 192.168.0.1 |
+ | </ | ||
- | L' | + | D' |
- | tcmpdump 'ip[6] & 0x20' = 32 | + | |
+ | <code bash> | ||
+ | tcpdump -i eth0 not host toto | ||
+ | tcpdump -i eth0 host toto and net 192.168.0.0/ | ||
+ | </ | ||
+ | |||
+ | 2 équivalents qui permettent d' | ||
+ | <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 à 1518 octet, le standard Ethernet) : | ||
+ | <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==== | ||
+ | |||
+ | L' | ||
+ | < | ||
+ | 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 " | ||
- | Ce dernier | + | 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==== | ||
+ | |||
+ | Cet exemple permet de sélectionner les paquets TCP ayant un port source < 1024 : | ||
tcpdump ' | tcpdump ' | ||
Ici on débute à l' | Ici on débute à l' | ||
Line 98: | 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 112: | 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 ' | ||
+ | </ | ||
+ | |||
+ | ====Filtrer les messages ICMP==== | ||
+ | |||
+ | La balise " | ||
+ | <code bash> | ||
+ | tcpdump -nni eth0 icmp[0] == 5 | ||
+ | </ | ||
+ | Pour connaitre la liste exhaustive des différents messages ICMP, go [[https:// |
informatique/logiciels/tcpdump.1260977516.txt.gz · Last modified: 2013/10/14 20:55 (external edit)