IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Tunnel HTTP/IPv4 pour IPv6


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut Tunnel HTTP/IPv4 pour IPv6
    Bonjour à tous,

    après de longues recherches sur ce forum et sur d'autres, je n'ai pas pu trouvé mon bonheur, voilà pourquoi j'ouvre une nouvelle discussion.
    Je suis débutant en programmation réseau et j'ai besoin de votre aide pour la création d'une tunnel HTTP IPV4 pour IPv6.

    Voilà en gros le processus:
    1. A veut envoyer un paquet ipv6 vers B mais le réseau de A ne laisse pas passer ces paquets.
    2. Donc A construit le paquet Ipv6, puis encapsule ce paquet dans un paquet http qu’il envoie vers une machine C en IPv4.
    3. C extrait le paquet IPv6 et l’envoie vers B en indiquant sa propre adresse source.

    Mon problème est dans le fait d'encapsuler un paquet dans un autre et ensuite de l'extraire à nouveau coté serveur.

    Merci de m'aiguiller.

    Mathieu.

  2. #2
    Futur Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    J'ai surement oublié des détails techniques.

    Actuellement mon client crée une socket avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket(AF_INET, SOCK_STREAM, IPPROTO_RAW);
    et en modifie ensuite l'entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char*)&x,sizeof(x))<0);
    Enfin j'essaie de créer un paquet de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned char packet[4098];
            struct iphdr   *ip;				//l'entête IP de destination
            struct icmphdr *icmp;			//l'entête ICMP du paquet
            struct iphdr   *origip;		//l'entête IP source
            unsigned char  *data;			//les données du paquet
            int i;
     
     
            ip = (struct iphdr *)packet;
            icmp = (struct icmphdr *)(packet+IPHDRSIZE);
            origip = (struct iphdr *)(packet+IPHDRSIZE+ICMPHDRSIZE);
            data = (char *)(packet+IPHDRSIZE+IPHDRSIZE+ICMPHDRSIZE);
    Je précise ensuite la version IP dans la structure ip et origip, ainsi que le protocol.

    Mais comment réellement encapsuler un paquet IPv6 dans un IPv4 et ensuite de l'extraire à nouveau coté serveur ?

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    L'idée de base est la suivante :
    • Forger un paquet IPv6 entier -- qui se compose donc de l'en-tête IP et de la payload.
    • Forger un paquet IPv4 qui se compose de l'entête et de la payload, qui est le paquet IPv6 complet.


    Où se situe ton problème exactement ?

    Si tu ne veux pas gérer les paquets IPv4 à la main, tu traites ton flux de paquets IPv6 comme n'importe quel trafic à envoyer.

    Ça devrait te suffir pour envoyer les paquets, et les recevoir de l'autre côté. Bon, après, il te faut encore faire le logiciel de routage sur B (enfin si j'ai bien compris le rôle de B).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    Tout d'abord merci d'avoir pris le temps de me répondre.

    En fait, au niveau de la théorie sur le principe d'encapsulation et les sockets c'est plus au moins ok.
    Par contre ce qui me pose problème c'est de réaliser tout ça en C.

    Pour la création de la socket je pense que c'est bon, je peux créer une socket TCP de la manière suivante, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int s = socket(AF_INET, SOCK_STREAM, IPPROTO_RAW);
    Ensuite dois-je lui affecter l'option IP_HDRINCL pour pouvoir modifier l'entête IP?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char*)&x,sizeof(x))
    Par contre pour ce qui est de la création des paquets IPV4 et IPv6, j'ai du mal...
    J'ai trouvé des choses sur le forum et sur d'autres sites mais j'ai du mal à comprendre comment procéder.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par m.schambion Voir le message
    Par contre pour ce qui est de la création des paquets IPV4 et IPv6, j'ai du mal...
    J'ai trouvé des choses sur le forum et sur d'autres sites mais j'ai du mal à comprendre comment procéder.
    Je pense qu'il faut que tu te renseignes sur les RAW socket : une fois qu'une telle socket est établie, tu peux émettre ce que tu veux dessus, dont des paquets IPv4 (qui contiendront des paquets IPv6 en l'occurence, mais peu importe).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    Encore merci pour tes infos.
    J'ai continué mes recherches depuis mon dernier post.

    Voilà comment je compte créer mon paquet IPv6:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned char packet_ipv6[4098];
    struct iphdr   *ip_ipv6;				//l'entête IP de destination
    struct iphdr   *origip_ipv6;		        //l'entête IP source
    unsigned char  *data_ipv6;			//les données du paquet IPv6
     
    ip_ipv6 = (struct iphdr *)packet_ipv6;
    origip_ipv6 = (struct iphdr *)(packet_ipv6+IPHDRSIZE);
    data_ipv6 = (char *)(packet_ipv6+IPHDRSIZE+IPHDRSIZE);
    Et mon paquet IPv4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned char packet_ipv4[4098];
    struct iphdr   *ip_ipv4;				                        //l'entête IP de destination
    struct iphdr   *origip_ipv4;		                                //l'entête IP source
    unsigned char  *packet_ipv6_into_ipv4;			        //le paquet IPV6
     
    ip_ipv4 = (struct iphdr *)packet_ipv4;
    origip_ipv4= (struct iphdr *)(packet_ipv4+IPHDRSIZE);
    packet_ipv6_into_ipv4= (char *)(packet_ipv4+IPHDRSIZE+IPHDRSIZE);
    Et donc par la suite, une fois que j'aurais modifié les différentes entêtes avec notamment ip->version = 4 ou 6, j'affecte le paquet IPv6 dans les données du IPv4:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *((unsigned char *)data_ipv4) = packet_ipv6;
    Tu penses que c'est ok?

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    En regardant rapidement ton code, on voit que tu fais des paquets de 4K. Y-a-t'il une raison spécifique ?

    Si je te demande ça, c'est parce que si ton paquet IP est émis sur ethernet, il y a de fortes chances pour que la taille d'un paquet soit limité au plus à 1500 octets (sauf jumbo-frames et MTU spécifique, mais ça serait suprenant), à moins que tu n'utilises autre chose (genre infiniband en IPoIB, mais dans ce cas on peut se demander pourquoi utiliser IP).

    Et si tu es limité à 1500 octets et que tu émets des paquets de 4K, je pense qu'ils vont se faire jeter.


    À mon sens, le problème vient du concept "1 paquet IPv6 devient 1 paquet IPv4", alors qu'on peut aussi le concevoir de la manière suivante : j'ai des données ordonnées à émettre (en l'occurence des paquets IPv6, mais ça serait (presque) pareil si c'étaient des patates), donc je fais la boucle suivante :
    ouvrir socket ipv4
    tant que j'ai des données
    send data
    fin tant que

    Et de l'autre côté, tu reçois "normalement" tes data, que tu réassembles (le protocole t'assurant l'ordre), et que tu peux ré-emettre en RAW (du moins en théorie).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Et si tu es limité à 1500 octets et que tu émets des paquets de 4K, je pense qu'ils vont se faire jeter.
    Plus probablement se faire fragmenter, sauf si ce sont de véritables RAW sockets (mais pourquoi y recourir pour au final construire un header IP parfaitement légal ?).

  9. #9
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    (...) de véritables RAW sockets (mais pourquoi y recourir pour au final construire un header IP parfaitement légal ?).
    c'est pas faux, sauf erreur le principe ce serait d'arriver à set le champ next_header du paquet ipv6 à IPPROTO_IP, je sais pas si c'est faisable directement sans avoir recours aux raw sockets
    Edit: bon en fait j'avais compris à l'envers (4in6), en revanche il semble qu'il y a plusieurs techniques de tunneling (6in4, 6to4, 6over4, Teredo...), à mon avis il faudrait plus de précisions ici quant au type de tunnel que le PO cherche à mettre en place

    par contre des considérations plus globales au projet, j'imagine que le but c'est de se positionner en ~routeur~ (broker) un moment donné, donc de capturer les trafic du tunnel ipv6 ipv4 sur une interface pour dés-encapsuler et rebalancer les paquets ipv4 ipv6 sur une autre interface (ou alors le propos est d'envoyer un unique paquet ? ), pour moi ce serait le job d'un driver ça, donc plutôt d'un module noyau que d'un programme userland, je sais pas si ça doit entrer en considération ?
    en fait dans le cas d'un tunnel automatique il est possible qu'il n'y ait besoin d'écrire que la partie client, la désencapsulation pouvant être réalisée automatiquement donc par la pile noyau déjà existante

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Plus probablement se faire fragmenter, sauf si ce sont de véritables RAW sockets (mais pourquoi y recourir pour au final construire un header IP parfaitement légal ?).
    Il est bien question de RAW sockets ici, c'est pour ca que je parle de rejet.

    Et la fragmentation n'existant de toute maniere plus en IPv6, il y a aussi un potentiel probleme lors de la re-emission.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Il est bien question de RAW sockets ici
    pour quelle(s) raison(s) ?

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    pour quelle(s) raison(s) ?
    Parce que j'ai lu le code trop vite et en diagonal, et que j'ai interprete le IPPROTO_RAW de socket(AF_INET, SOCK_STREAM, IPPROTO_RAW); comme SOCK_RAW.

    Donc du coup merci de ta remarque
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    j'ai interprete le IPPROTO_RAW de socket(AF_INET, SOCK_STREAM, IPPROTO_RAW); comme SOCK_RAW.
    ok ! mais de toutes façons son code n'est possiblement pas valide puisqu'il n'y arrive pas

    le sujet est super intéressant de mon point de vue, mais je persiste à penser qu'il manque un certain nombre de choses à préciser avant de coder quoique ce soit

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/06/2009, 16h34
  2. [PHP 5.0] Requete HTTP distante pour gerer du contenu local
    Par keaton7 dans le forum Langage
    Réponses: 0
    Dernier message: 27/03/2009, 10h59
  3. https : exception pour un repertoire
    Par c0rwyn dans le forum Apache
    Réponses: 1
    Dernier message: 12/02/2009, 12h03
  4. Serveur HTTP Oracle pour Apex?
    Par Alain Denis dans le forum Apex
    Réponses: 1
    Dernier message: 23/11/2008, 15h17
  5. Réponses: 2
    Dernier message: 19/06/2008, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo