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

Posté par  .
Étiquettes : aucune
0
18
déc.
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.
  • # bon j'ai compris...

    Posté par  . É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  (site web personnel) . É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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.