Encapsulateur IPv4 in IPv6 et socket Raw
Salut tout le monde,
j'essaye d'implémenter un encapsulateur IPv4 in IPv6. Je sais que les tunnels IP4IP6 existe sous linux mais j'ai besoin de le faire moi-même pour y apporter quelques modifications. Pour faire ça, j'utilise libipq (qui est un peu obsolète je sais).
Le principe est le suivant:
Code:
1 2 3 4 5
|
IPv4/IPv6 IPv4/IPv6
Host A ---------------> Host B
@IPv4A @IPv4B
@IPv6A @IPv6B |
L'Host A ping l'host B en IPv4 (ping @IPv4B).
Avec libipq, j'encapsule le ping V4 dans un paquet IPv6 ce qui donne une représentation du paquet suivante: [@IPv6A @IPv6B][@IPv4A @IPv4B][ICMPv4].
L'host B reçoit bien le ping IPv4 in IPv6. Je décaspule toujours grace à libipq l'en-tête IPv6. Cela donne le echo request IPv4 suivant: [@IPv4A @IPv4B][ICMPv4].
Ensuite, avec un raw socket ou je met sin->addr à @IPv4B, "j'envoi" le IPv4 echo request afin d'avoir un echo reply en réponse.
Le noyau me répond bien avec un echo reply mais c'est là que les soucis commencent.
L'echo reply a comme source address @IPv4B (logique) mais aussi comme destination address @IPv4B alors qu'évidemment, j'attends @IPv4A pour répondre au ping. Je pense que ça a quelque chose à voir avec le fait que mon echo request est "envoyé localement" au moment de la decapsulation mais j'arrive pas à voir vraiment pourquoi et surtout comment résoudre le þroblème.
Veuillez notez aussi que je fais que décapsuler/encapsuler les headers, je ne modifie jamais la source ou destination address.
Si quelqu'un a des infos, ça serait vraiment sympa.
Merci d'avance,
Tanguy