Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Programmation.c : traceroute udp ou comment faire sans icmp ?

Posté par RB () le 17 décembre 2007
Hello,

je sais que les prog de traceroute d'aujourd'hui utilisent udp pour qu'un utilisateur sans les droit root puissent l'exécuter. Ce que je ne comprend pas c'est comment cela fonctionne vu qu'effecivement les paquets udp sont envoyé avec des ttl qui augmentent mais les erreurs sont renvoyées en ICMP (donc il faut ouvrir un raw socket pour les recevoir...).



J'ai analysé avec tcpdump et effectivement, on a aucun reply udp mais que icmp, je ne comprend pas d'ou sortent les adresses des routeurs et comment elles sont remontées au programme (vu qu'il n'y a pas de raw socket ouverts en user à part socket(PF_NETLINK, SOCK_RAW, 0) (vu avec strace))



J'essaie de voir avec le code source des traceroute en ce moment mais je ne suis toujours pas au clair...



Si quelqu'un sait la réponse merci.

> Lire le message (2 commentaires, moyenne: 1).  

Vous avez demandé le commentaire #890709.

bon j'ai compris...

Posté par RB () le 18/12/2007 à 00:27. (lien). Évalué à 1.

en fait en appelant avec un socket UDP (entre autres) avec

recvmsg(sk, &msg, MSG_ERRQUEUE)

On va avoir les erreurs dans msg (struct msghdr). Ensuite il faut parser le tout et on peut retrouver différentes sources d'erreurs dont les erreurs ICMP.

man recvfrom
man cmsg

Bref, si on ne peut pas écouter les erreurs ICMP directement en raw socket, le noyau nous permet de les récupèrer quand même indirectement via ce méchanisme.

  • [^]Re: bon j'ai compris...

    Posté par peck (page perso, ) le 18/12/2007 à 10:48. (lien). Évalué à 1.

    En fait ces paquets icmp sont liés aux paquets udp envoyés car faisant partie de la même "connexion" (attention aux guillemets). Le noyau permet donc de récupérer l'information.