DatagrammeTunneler
Programme client/serveur multiplateforme simple transmettant des datagrammes UDP via une connexion TCP (alias tunnel). Le client rejoint un groupe de multidiffusion et transmet les datagrammes reçus au serveur, qui à son tour les diffuse sur son propre sous-réseau.
- Conçu dans un souci de simplicité
- Testé sur OSX 10.13.3 , Ubuntu 16.04 et Centos 7.4
- NON compatible Windows
Contenu
Exigences
Installation
Synopsis
Exemples
Comment ça marche ?
Le protocole DTEP
Licence
Exigences
- Un ordinateur exécutant une distribution Linux ou Mac OS
- Un compilateur C++
Installation en 10 secondes
- Téléchargez ou clonez le référentiel.
- Allez dans le dépôt :
cd <path_to_the_repo>/DatagramTunneler
- Construisez le DatagramTunneler en exécutant simplement make :
- Vous êtes prêt à exécuter le binaire DatagramTunneler :
./bin/DatagramTunneler -h
Pour plus d'informations sur la façon de l'exécuter, consultez le synopsis ci-dessous
Synopsis
Pour utiliser DatagramTunneler, vous devez d'abord démarrer le côté serveur, puis le côté client. Si vous ne le faites pas, le client ne parviendra tout simplement pas à se connecter au serveur et quittera immédiatement.
Serveur
dgramtunneler --server -i <udp_iface_ip> -t <tcp_listen_port> [-u <udp_dst_ip>:<port>]
- <udp_iface_ip> : interface utilisée pour publier les datagrammes transmis
- <tcp_listen_port> : port TCP utilisé pour écouter les connexions client
- <udp_dst_ip>:<port> : (facultatif) IP de destination udp et port sur lequel le serveur publie les datagrammes transférés. S'ils ne sont pas fournis, les datagrammes sont publiés sur le même canal rejoint par le client.
Client
dgramtunneler --client -i <udp_iface_ip> -t <tcp_srv_ip>:<tcp_srv_port> -u <udp_dst_ip>:<port>
- <udp_iface_ip> : interface utilisée pour rejoindre le canal multicast fourni par -u
- <tcp_srv_ip>:<port> : IP et port du serveur vers lequel le datagramme sera transmis
- <udp_dst_ip> : <port> : IP de destination udp et port du canal que nous voulons rejoindre
Exemples
(N'oubliez pas de mettre une petite étoile si cet outil vous est utile :]) côté serveur :
./bin/datagramtunneler --server -i 192.168.0.104 -u 228.14.28.52:1234 -t 28052
côté client :
./bin/datagramtunneler --client -i 192.168.0.105 -u 228.1.2.3:7437 -t 192.168.0.104:28052
Comment ça marche ?
Le but du DatagramTunneler est de transférer des données de multidiffusion d'un sous-réseau A vers un autre sous-réseau B où ce canal de multidiffusion n'est pas disponible. Pour y parvenir, le DatagramTunneler est divisé en 2 côtés : un côté client et un côté serveur, comme le montre le schéma ci-dessous :
Le côté client
Le côté client doit s'exécuter dans le sous-réseau où le canal de multidiffusion peut être rejoint. Une fois démarré, il fera ce qui suit :
- se connecter au serveur DatagramListener (TCP)
- rejoindre le canal multicast (UDP)
- transmettre tous les datagrammes reçus au serveur en utilisant la connexion TCP établie. Les datagrammes sont transmis via TCP à l'aide du protocole d'encapsulation Datagram Tunneler (ou DTEP).
Le côté serveur
Le côté serveur doit s'exécuter dans le sous-réseau où la multidiffusion n'est pas disponible. Une fois démarré, il fera ce qui suit :
- écoutez une connexion client (notez qu'une seule connexion est acceptée pendant toute la durée de vie des instances serveur/client. Une fois le tunnel déconnecté, les deux extrémités se terminent.
- une fois la connexion avec un client établie, il publiera tous les datagrammes envoyés par le client sur un canal multicast. Ce canal peut être n'importe quoi spécifié lors du lancement du serveur, ou s'il n'est pas spécifié, il utilisera le même canal multicast codé avec le datagramme qu'il a reçu (cf DTEP).
Le protocole d'encapsulation du tunnelier de datagrammes (DTEP)
Le Datagram Tunneler Protocol ou DTEP est un protocole binaire simple, décrit par le schéma suivant :
Un paquet DTEP possède un en-tête de 1 octet spécifiant le type de charge utile qu'il contient.
Type de paquet 0x00 = HEARTBEAT
Ce type de paquet n'a aucune charge utile. Il est envoyé par le client au serveur et permet de garantir que les deux extrémités de la connexion savent si l'autre extrémité est active.
Type de paquet 0x01 = DATAGRAMME
Ce paquet encapsule le datagramme observé par le client. Voici sa description complète :
Bien que ce diagramme doive être explicite, voici une répartition de tous les champs :
- Longueur du datagramme : nombre d'octets du datagramme encapsulé (la longueur de l'en-tête DTEP n'est PAS incluse)
- Adresse du canal UDP : adresse de destination du groupe de multidiffusion auquel le client a rejoint pour recevoir ce datagramme
- Port canal UDP : port de destination du groupe de multidiffusion auquel le client a rejoint pour recevoir ce datagramme
- Datagramme UDP encapsulé : datagramme réel reçu par le client depuis le canal multicast
Licence
Cf LICENCE