Voyons ce qui se passe, d'accord?
8.8.8.8 est un bon exemple, car au moins depuis mon emplacement, je peux y accéder à la fois avec traceroute
et ping
.
Essayons d'abord de ping 8.8.8.8
regarder ce qui se passe:
$ tcpdump -n host 8.8.8.8 or icmp
15:36:51.045994 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 0, length 64
15:36:51.062458 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 0, length 64
15:36:52.048350 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 1, length 64
15:36:52.073657 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 1, length 64
ping
Envoie donc une demande d'écho ICMP et attend une réponse d'écho ICMP.
Maintenant traceroute -n 8.8.8.8
:
15:41:31.803324 IP 10.4.27.179.44838 > 8.8.8.8.33435: UDP, length 24
15:41:31.815184 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.815343 IP 10.4.27.179.44838 > 8.8.8.8.33436: UDP, length 24
15:41:31.819654 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.819791 IP 10.4.27.179.44838 > 8.8.8.8.33437: UDP, length 24
15:41:31.824609 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.824754 IP 10.4.27.179.44838 > 8.8.8.8.33438: UDP, length 24
15:41:31.830506 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.830649 IP 10.4.27.179.44838 > 8.8.8.8.33439: UDP, length 24
15:41:31.834469 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.834565 IP 10.4.27.179.44838 > 8.8.8.8.33440: UDP, length 24
15:41:31.840962 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.841061 IP 10.4.27.179.44838 > 8.8.8.8.33441: UDP, length 24
15:41:31.847440 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.847634 IP 10.4.27.179.44838 > 8.8.8.8.33442: UDP, length 24
15:41:31.853664 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.853761 IP 10.4.27.179.44838 > 8.8.8.8.33443: UDP, length 24
15:41:31.859221 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.859269 IP 10.4.27.179.44838 > 8.8.8.8.33444: UDP, length 24
15:41:31.864149 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.864192 IP 10.4.27.179.44838 > 8.8.8.8.33445: UDP, length 24
15:41:31.870843 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.870922 IP 10.4.27.179.44838 > 8.8.8.8.33446: UDP, length 24
15:41:31.876200 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.876352 IP 10.4.27.179.44838 > 8.8.8.8.33447: UDP, length 24
15:41:31.882148 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.882249 IP 10.4.27.179.44838 > 8.8.8.8.33448: UDP, length 24
15:41:31.890076 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.890156 IP 10.4.27.179.44838 > 8.8.8.8.33449: UDP, length 24
15:41:31.896100 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.896163 IP 10.4.27.179.44838 > 8.8.8.8.33450: UDP, length 24
15:41:31.905037 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.905235 IP 10.4.27.179.44838 > 8.8.8.8.33451: UDP, length 24
15:41:31.913206 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.913283 IP 10.4.27.179.44838 > 8.8.8.8.33452: UDP, length 24
15:41:31.923428 IP 108.170.242.241 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.923520 IP 10.4.27.179.44838 > 8.8.8.8.33453: UDP, length 24
15:41:31.932266 IP 108.170.237.9 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.932441 IP 10.4.27.179.44838 > 8.8.8.8.33454: UDP, length 24
15:41:31.939961 IP 209.85.251.9 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.940043 IP 10.4.27.179.44838 > 8.8.8.8.33455: UDP, length 24
15:41:31.947460 IP 108.170.237.21 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.947508 IP 10.4.27.179.44838 > 8.8.8.8.33456: UDP, length 24
15:41:31.954824 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33456 unreachable, length 36
15:41:31.954888 IP 10.4.27.179.44838 > 8.8.8.8.33457: UDP, length 24
15:41:31.963601 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33457 unreachable, length 36
15:41:31.963671 IP 10.4.27.179.44838 > 8.8.8.8.33458: UDP, length 24
15:41:31.972407 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33458 unreachable, length 36
Donc traceroute
, au moins l'implémentation que j'ai installée, n'envoie pas ICMP. Il envoie plutôt des paquets UDP.
Ce qui n'est pas visible dans cette trace (même si ce serait le cas si je donnais tcpdump
un -v
pour augmenter la verbosité) est que les premières sondes ont un ttl de 1, puis il incrémente le ttl pour les sondes ultérieures. Cela provoque les routeurs entre moi et 8.8.8.8 à répondre avec une erreur ICMP ttl dépassée, c'est ainsi que traceroute découvre les routeurs entre ici et là.
Finalement, le ttl est suffisamment long pour se rendre jusqu'à 8.8.8.8, et 8.8.8.8 répond avec une erreur de port ICMP inaccessible, car il n'a aucun processus d'écoute sur le port UDP 44838. C'est ainsi que traceroute sait qu'il a atteint la destination finale .
Si quelque chose entre ici et là bloque tous les ICMP, alors ni ping ni traceroute ne fonctionneront.
Mais ce n'est généralement pas le cas que tous les ICMP sont bloqués, bien que ce ne soit pas rare non plus. Le blocage de tous les ICMP est problématique: par exemple, il rompt la découverte du chemin MTU , qui repose sur une erreur de fragmentation ICMP requise. Les paquets ICMP ont un type et un code, et les opérateurs de réseau responsables ne bloqueront que de manière sélective certains types ou codes, ceux qui présentent un risque d'abus ou divulguent des informations particulières.
Par exemple, certains hôtes ne répondront pas du tout à une demande d'écho ICMP, et donc le ping ne fonctionnera pas. L'idée est qu'en ne répondant pas aux pings, il est plus difficile pour un attaquant de découvrir quels hôtes existent sur le réseau. En pratique, cela est discutable, car il existe d'autres façons de rechercher un hôte. Par exemple, on peut envoyer un TCP SYN au port 80 pour trouver des serveurs Web.
De nombreux hôtes n'envoient pas non plus d'erreur de port ICMP inaccessible lorsqu'ils obtiennent un datagramme UDP ou un TCP SYN vers un port sur lequel ils n'ont pas d'écoute de processus, ce qui interrompt la traceroute. Encore une fois, l'idée est de rendre plus difficile pour un attaquant de cartographier le réseau, mais là encore, ce n'est qu'une frustration mineure pour un attaquant.
Parce que traceroute est un programme et non un protocole particulier, il a d'autres façons de sonder. Ils s'appuient tous sur l'incrémentation de la TTL pour découvrir les routeurs, mais différents types de sondes peuvent être envoyés, ce qui peut avoir plus ou moins de chance d'obtenir une réponse du point de terminaison. Par exemple, ma man tcpdump
liste une -I
option pour utiliser des sondes d'écho ICMP, la même chose que ping. Il doit également -T
utiliser des sondes TCP SYN au lieu d'UDP. Si vous connaissez un hôte répondra à ping
alors -I
fait beaucoup de sens. Si vous savez que l'hôte écoute sur un port TCP particulier, -T
cela a du sens, peut-être en conjonction avec l' -p
option de sélection du port.
Malheureusement, ces options peuvent nécessiter des capacités root ou spéciales, donc UDP fait un bon choix par défaut. En fait, un outil similaire,, tracepath
a ceci à dire dans sa page de manuel:
LA DESCRIPTION
Il trace le chemin vers la destination en découvrant MTU le long de ce chemin. Il utilise le port de port UDP ou un port aléatoire. Il est similaire à traceroute, ne nécessite que des privilèges de superutilisateur et n'a pas d'options fantaisistes.