lunes, octubre 26, 2015

Tunelizar UDP con ssh y socat

Tunelizar UDP con ssh y socat

Hoy me he encontrado con un pequeño problema: Quería mandar un syslog (UDP) sobre Internet a una máquina EC2 con la cual estaba haciendo pruebas en Amazon. Es cierto que podía montar una VPN con OpenVPN o usar stunnel, pero la verdad, no me apetecía estar montando certificados y quería algo rápido. La solución por la que opté fue usar socat para encapsular el tráfico UDP sobre TCP, un reenvío TCP sobre ssh para mandar los datos a la instancia EC2 en Amazon encriptados sobre el canal ssh y de nuevo socat para desencapsular los datos del flujo TCP y lanzarlos sobre el puerto UDP local.

El escenario del que parto es el siguiente:

  • Tengo configurado el daemon de syslog para que mande todo lo que recibe al puerto 5000 de la máquina a través de UDP
  • Voy a redirigir el puerto de la máquina local 4000 al puerto 4000 de la máquina en EC2 a través de un túnel ssh
  • En la máquina local, todo lo que se reciba con protocolo UDP al puerto 5000 se encapsular sobre un flujo TCP y se redirigirá a través del puerto 4000 que es donde está escuchando la redirección de puertos local.
  • En el extremo EC2 todo lo que reciba por el puerto TCP 4000, se dirigirá al puerto UDP 514, que es el syslog daemon local.
  • A modo de ejemplo, asumo que la IP de la máquina de Amazon remota es 10.11.12.13

Para que funcione correctamente hay que dar los siguientes pasos y en orden:

  1. Establecer el tunel TCP con el reenvio de puertos en la máquina local
    $ ssh -L 4000:localhost:4000 -i clave_secreta.pem -l root 10.11.12.13
  2. Realizar con socat la redirección del puerto 4000 TCP al puerto 514 UDP en el servidor EC2
    $ socat -4 TCP-LISTEN:4000 UDP:localhost:514
  3. Por último, en nuestra máquina local, mandar los datagramas UDP que recibimos por el puerto 5000 a través del túnel
    $ socat -4 UDP-LISTEN:5000 TCP:localhost:4000

Decir que en este caso concreto, syslog, podría simplemente no usar UDP y aprovechar las conexiones TCP que también soporta dicho daemon para tunelizar vía ssh directamente los datos, pero trataba de poner un ejemplo de esa encapsulación UDP sobre TCP con socat y ssh.

Otra manera de hacer esta redirección, suponiendo que tengamos credenciales de root en las dos máquinas es esta que me apunta sntg_boff: Se aprovecha las posibilidades de ssh para establecer el túnel TUN/TAP y mandar los datos sobre ssh.

No hay comentarios: