Túnel de datagramas

Programa cliente/servidor multiplataforma simple que reenvía datagramas UDP a través de una conexión TCP (también conocida como túnel). El cliente se une a un grupo de multidifusión y reenvía los datagramas recibidos al servidor, que a su vez los multidifunde en su propia subred.
- Diseñado pensando en la simplicidad
- Probado en OSX 10.13.3 , Ubuntu 16.04 y Centos 7.4
- NO compatible con Windows
Contenido
Requisitos
Instalación
Sinopsis
Ejemplos
¿Cómo funciona?
El protocolo DTEP
Licencias
Requisitos
- Una computadora que ejecuta una distribución de Linux o Mac OS
- Un compilador de c++
Instalación en 10 segundos
- Descarga o clona el repositorio.
- Vaya al repositorio:
cd <path_to_the_repo>/DatagramTunneler
- Construya el DatagramTunneler simplemente ejecutando make:
- Estás listo para ejecutar el binario DatagramTunneler:
./bin/DatagramTunneler -h
Para obtener más información sobre cómo ejecutarlo, consulte la sinopsis a continuación.
Sinopsis
Para utilizar DatagramTunneler, primero debe iniciar el lado del servidor y luego el lado del cliente. Si no lo hace, el cliente simplemente no podrá conectarse al servidor y saldrá de inmediato.
Servidor
dgramtunneler --server -i <udp_iface_ip> -t <tcp_listen_port> [-u <udp_dst_ip>:<port>]
- <udp_iface_ip> : interfaz utilizada para publicar los datagramas reenviados
- <tcp_listen_port> : puerto tcp utilizado para escuchar las conexiones del cliente
- <udp_dst_ip>:<port> : (opcional) IP de destino udp y puerto donde el servidor publica los datagramas reenviados. Si no se proporcionan, los datagramas se publican en el mismo canal al que se une el cliente.
Cliente
dgramtunneler --client -i <udp_iface_ip> -t <tcp_srv_ip>:<tcp_srv_port> -u <udp_dst_ip>:<port>
- <udp_iface_ip> : interfaz utilizada para unirse al canal de multidifusión proporcionado por -u
- <tcp_srv_ip>:<port> : IP y puerto del servidor al que se reenviará el datagrama
- <udp_dst_ip> : <puerto> : IP destino udp y puerto del canal al que queremos unirnos
Ejemplos
(No olvides dar una pequeña estrella si esta herramienta te resulta útil :]) lado del servidor:
./bin/datagramtunneler --server -i 192.168.0.104 -u 228.14.28.52:1234 -t 28052
lado del cliente:
./bin/datagramtunneler --client -i 192.168.0.105 -u 228.1.2.3:7437 -t 192.168.0.104:28052
¿Cómo funciona?
El propósito de DatagramTunneler es transferir datos de multidifusión de una subred A a otra subred B donde ese canal de multidifusión no está disponible. Para lograr esto, DatagramTunneler se divide en 2 lados: un lado del cliente y un lado del servidor, como se muestra en el siguiente diagrama: 
El lado del cliente
El lado del cliente debe ejecutarse en la subred donde se puede unir el canal de multidifusión. Una vez iniciado hará lo siguiente:
- conectarse al servidor DatagramListener (TCP)
- unirse al canal de multidifusión (UDP)
- reenviar todos los datagramas recibidos al servidor utilizando la conexión TCP establecida. Los datagramas se transmiten a través de TCP utilizando el Protocolo de encapsulación Datagram Tunneler (o DTEP).
El lado del servidor
El lado del servidor debe ejecutarse en la subred donde la multidifusión no está disponible. Una vez iniciado hará lo siguiente:
- escuche una conexión de cliente (tenga en cuenta que solo se acepta una conexión durante la vida útil de las instancias de Servidor/Cliente. Una vez que se desconecta el túnel, ambos extremos salen.
- Una vez que se establece una conexión con un cliente, publicará todos los datagramas enviados por el cliente a un canal de multidifusión. Ese canal puede ser cualquier cosa especificada al iniciar el servidor, o si no se especifica, utilizará el mismo canal de multidifusión codificado con el datagrama que recibió (cf. DTEP).
El protocolo de encapsulación del túnel de datagramas (DTEP)
El Protocolo Datagram Tunneler o DTEP es un protocolo binario simple, que se describe en el siguiente diagrama: 
Un paquete DTEP tiene un encabezado de 1 byte que especifica el tipo de carga útil que contiene.
Tipo de paquete 0x00 = LATIDO
Este tipo de paquete no tiene carga útil. El cliente lo envía al servidor y ayuda a garantizar que ambos extremos de la conexión sepan si el otro extremo está activo.
Tipo de paquete 0x01 = DATOS
Este paquete encapsula el datagrama observado por el cliente. Aquí está su descripción completa: 
Aunque este diagrama debería explicarse por sí mismo, aquí hay un desglose de todos los campos:
- Longitud del datagrama : número de bytes del datagrama encapsulado (la longitud del encabezado DTEP NO está incluida)
- Dirección de canal UDP : dirección de destino del grupo de multidifusión al que se unió el cliente para recibir ese datagrama
- Puerto de canal UDP : puerto de destino del grupo de multidifusión al que se unió el cliente para recibir ese datagrama
- Datagrama UDP encapsulado : datagrama real recibido por el cliente desde el canal de multidifusión
Licencias
Cf LICENCIA