5. Filtrage de l'affichage après capture

Le filtrage à postériori est certainement l'étape la plus importante dans l'analyse réseau. C'est cette opération qui permet d'isoler l'information pertinente. La granularité de la syntaxe de filtrage disponible avec Wireshark est très importante. Il est possible de retenir un champ unique parmi les 820 protocoles supportés. Voici quelques exemples de filtrage allant du plus général au plus détaillé.

5.1. Isoler une connexion TCP

Après avoir réalisé une capture, il est possible d'isoler une connexion TCP en repérant son établissement (le début) et sa libération (la fin). En cliquant sur le bouton droit de la souris après avoir sélectionné n'importe quelle trame appartenant à la connexion à isoler, il faut valider l'option Follow TCP Stream.

A la suite de cette opération, Wireshark ouvre une nouvelle fenêtre contenant les données vues de la couche transport.

5.2. Syntaxe du filtrage à postériori

Comme indiqué ci avant, la granularité de la syntaxe de filtrage est très importante. Elle peut donc s'avérer très complexe à manipuler. Wireshark offre plusieurs solutions pour rendre l'apprentissage de cette syntaxe interactif.

Tout d'abord, l'opération précédente de filtrage simplifié (voir Section 5.1, « Isoler une connexion TCP ») n'était qu'un cas particulier de saisie interactive de filtre de capture. En sélectionnant l'option Follow TCP Stream, on a «saisi» un filtre avec la syntaxe suivante :

(ip.addr1 eq 192.168.1.92 and ip.addr eq 80.247.225.35) \
and3 (tcp.port4 eq 327835 and tcp.port eq 80)

Cette expression est extraite de la Barre de filtrage. Elle doit tenir sur une ligne unique quel que soit sa longueur.

1

ip.addr : sélection d'une adresse IP.

2

eq 192.168.1.9 : valeur particulière d'adresse IP. L'opérateur eq correspond à un test d'égalité. Il est aussi possible d'utiliser la syntaxe du langage C pour les tests :

  • == : égalité,

  • != : différence,

  • >= : supérieur ou égal,

  • <= : inférieur ou égal.

3

Les opérateurs logiques tels que and et|ou or associés aux parenthèses servent à composer des expressions de sélection précises.

4

tcp.port : sélection d'un numéro de port du protocole TCP de la couche transport.

5

eq 32783 : valeur particulière de port TCP. La syntaxe de test est identique pour tous les champs des différents protocoles reconnus.

La construction interactive des filtres d'affichage peut se faire à l'aide de la souris. Voici 2 exemples «simplistes» :

Option TCP MSS

Admettons que l'on veuille repérer toutes les trames capturées dans lesquelles l'option MSS (Maximum Segment Size) apparaît. On développe alors l'en-tête TCP d'un paquet correspondant à une demande de connexion pour faire apparaître cette option. En cliquant sur le bouton droit de la souris on accède au menu Prepare a Filter.

L'expression préparée apparaît dans la champ de la Barre de filtrage :

tcp.options.mss_val == 1460

Supposons maintenant que l'on veuille afficher toutes les trames ayant cette option indépendamment de sa valeur. Il suffit alors de supprimer le test :

tcp.options.mss_val
Fragmentation IP

Admettons que l'on veuille observer la fragmentation IP en repérant les champs correspondants de l'en-tête des paquets IP. Tout d'abord, il faut «provoquer» la fragmentation IP artificiellement. On utilise deux hôtes avec chacun une interface Ethernet et un hub. En réduisant la taille maximum des données transmises par paquet (Maximum Transmit Unit) sur l'interface Ethernet d'un hôte, on observe plus facilement les effets de la fragmentation.

  __________
 |_=_=_=_=_// Hub
   |     |
  /       \_______
  |.....          \
.------,~         |.....
|Hote_A|'       .------,~
|      ||       |Hote_B|'
\------ /       |      ||
 ======/        \------ /
192.168.254.128  ======/
                192.168.254.2

Hote_A # ifconfig eth0 mtu 256
Hote_A # ping -s 128 -c 5 192.168.254.2
PING 192.168.254.2 (192.168.254.2) 128(156) bytes of data.
136 bytes from 192.168.254.2: icmp_seq=1 ttl=64 time=0.591 ms
136 bytes from 192.168.254.2: icmp_seq=2 ttl=64 time=0.528 ms
136 bytes from 192.168.254.2: icmp_seq=3 ttl=64 time=0.554 ms
136 bytes from 192.168.254.2: icmp_seq=4 ttl=64 time=0.545 ms
136 bytes from 192.168.254.2: icmp_seq=5 ttl=64 time=0.546 ms

--- 192.168.254.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.528/0.552/0.591/0.036 ms
Hote_A # ping -s 8192 -c 5 192.168.254.2
PING 192.168.254.2 (192.168.254.2) 8192(8220) bytes of data.
8200 bytes from 192.168.254.2: icmp_seq=1 ttl=64 time=15.4 ms
8200 bytes from 192.168.254.2: icmp_seq=2 ttl=64 time=15.4 ms
8200 bytes from 192.168.254.2: icmp_seq=3 ttl=64 time=15.4 ms
8200 bytes from 192.168.254.2: icmp_seq=4 ttl=64 time=15.4 ms
8200 bytes from 192.168.254.2: icmp_seq=5 ttl=64 time=15.4 ms

--- 192.168.254.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 15.444/15.462/15.481/0.079 ms

On observe ensuite le résultat sur l'affichage des trames capturées. La syntaxe du filtre est :

ip.flags.df == 0

Connaissant maintenant la syntaxe d'identification de la fragmentation IP, il sera toujours possible d'appliquer le même filtre sur une capture beaucoup plus importante en volume.

5.3. Documentation de référence sur les filtres d'affichage

La documentation sur l'ensemble des champs des protocoles reconnus utilisables dans les expressions de filtres d'affichage est disponible à l'adresse : Display Filter Reference.