ELO-330: Programación de Sistemas
Tarea 3: Reflejando servidor en Internet

Objetivos: En esta tarea usted aplicará: creación de hebras, comunicación entre procesos remotos, y diseño y manejo de un protocolo de capa aplicación.

Introducción

Para aprovechar los beneficios de Internet en nuevas áreas del quehacer humano se hace necesario poder instalar servicios (servidores) en máquinas con direcciones de red privadas. Ejemplo de esto es la Internet de las Cosas (IoT por Internet of Things). En estos escenarios es común tener servicios para sensar estados, actuación o comunicación alojados en subredes con acceso a Internet a través de un servidor NAT. La presencia de un NAT impide el acceso directo a los servicios detrás de éste. En esta tarea usted desarrollará una solución básica para reflejar en Internet un servicio disponible al interior de una red privada.

Figura 1: El servidor de la red privada es reflejado en Internet vía dos procesos a desarrollar en esta tarea que corren en una máquina en Internet y otra en la subred privada

El lado derecho de la Figura 1 corresponde a la actividad de la red privada (al interior del NAT, no mostrado). Allí corre algún servidor como los ejemplos mostrados en clases. Para reflejar este servicio en Internet, para cada nuevo cliente se establece una conexión desde el proceso "retransmiter client"" al "proxy server"; a través de esta conexión se traspasa los datos del cliente al servidor reflejado y viceversa. La solución básica parte estableciendo una conexión desde el proceso "subnet retransmiter client" al "internet proxy server" que corre en Internet (conexión 1 en Figura 1). Cuando un cliente se conecta al proceso "proxy server" (conexión 2 en Figura 1), éste informa a través de conexión 1 al proceso "retransmiter client" de tal conexión. En respuesta, éste establece la conexión 3 hacia el servidor reflejado y la conexión 4 hacia el proxy server . Se puede establecer así una conexión lógica desde el cliente en Internet al servidor en la subred privada, ésta está representada por la línea roja en Figura 1. De esta manera toda petición futura que envíe el cliente llegará al servidor reflejado y viceversa. 

Nombre: ips: Internet proxy server
               src: Subnet relay client

Sintaxis:  ips <puerto_servicio_reflejado> <puerto_tunel>
                src <IP_proxy_server> <puerto_tunel> <IP_servidor_a_reflejar> <puerto_servicio_a_reflejar>

Puerto_servidor_reflejado: es el puerto donde clientes Internet se conectan con fin de tomar contacto con el servidor que está en la sunred privada.
Puerto_tunel: es aquel donde se conexta el cliente retransmisor. La primera conexión a este puerto se mantiene activa y es usada por el proxy para informar al retransmisor la llegada de un nuevo cliente.
IP_proxy_server: es la IP o nombre de la máquina donde corre el proceso "Internet Proxy Server".
Puerto_tunel: es el puerto donde el proxy server espera a un retransmisores.
IP_servidor_a_reflejar: es la IP o nombre de máquina donde corre el servidor a reflejar en Internet.
Puerto_servicio_a_reflejar: es el puerto del servicio a reflejar en Internet.

Considere 10 como un número máximo de clientes simultáneos para el servicio reflejado.

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones
* Ante la llegada de un nuevo cliente (conexión 2), el servidor proxy puede enviar al retransmisor el descriptor correspondiente socket de ese cliente. Una vez establecida la conexión túnel desde el retransmisor al proxy, el primero puede devolver el descriptor recibido. Así el proxy podrá vincular el socket del tunel con su correspondiente cliente.
* Ante la llegada de un nuevo cliente el servidor proxy, el pseudo código para el proxy puede ser algo como:
  while(1)
     nc=accept(...);  // acepta nuevo cliente
     Enviar nc (es decir un entero, su descriptor) por primera conexión desde el retransmisor.
     nt=accept(..); //  acepta nuevo túnel
     Espera y lee desde nt la llegada del descriptor;
    Crea hebras u otro y le pasa ambos descriptores (nt y lo recibido de vuelta, es decir nc) para que éstos se ocupe del re-envío de datos en ambas direcciones;
  }
* Más ayuda puede ser incluida en la medida que surjan vuestras preguntas.
* Haga su tarea de a poco y con tiempo. Con gusto atenderé todas sus preguntas en clases y horas de atención.