jueves, 10 de marzo de 2011

Tunel SSH inverso - Reverse SSH tunnel

Donde trabajo tenemos un servidor linux expuesto a Internet. Se trata de un debian lenny. En el servidor hay un Apache y un Ftp seguro.Mi empresa contrató en su momento un Hosting que dispone de un Firewall para proteger el servidor. Durante una revisión que se realizó en la empresa de Hosting, se hizo un análisis de los servidores buscando vulneravilidades y se encontraron problemas en el servidor.

Para proteger el servidor tenía que realizar una serie de acciones, entre ellas actualizar la distribución con los últimos parches de seguridad y actualizar el servidor Apache pasando de la versión 2.2.9 a la 2.2.14 como mínimo. Los pasos que tenía en mente eran bastante sencillos.
  1. Conectarme al servidor.
  2. Lanzar un apt-get update
  3. Lanzar un apt-get dist-upgrade
  4. Cambiar unos parámetros en la configuración del servidor Apache.
   Estimación = 10 minutos de trabajo.

Paso 1

Me conecto por ssh. 10 segundos. Todo va bien.

Paso 2

Desde la terminal lanzo el comando apt-get update. Pensé, un par de minutos bajando los datos de los paquetes y luego actualizo. Me quedo mirando la pantalla y lo único que veo es que el servidor es incapaz de resolver las direcciones de los servidores de paquetes debian. Investigando me doy cuenta de que el Firewall del Hosting tiene capado el tráfico hacia Internet, lo que hace inviable cualquier tipo de actualizacion. ¿Cuál es el proceso ahora?. Pues hay que pedir a la empresa de Hosting que abra dicho tráfico. Estimación = 2 días para que solventen el problema.

Quedo mal con mi empresa

O eso piensas rápidamente. ¿Que más puedo hacer?. Me vienen a la mente los túneles SSH. Si puedo abrir una conexión SSH también puedo generar un tunel y hacer más cosas. Lo que necesito es un tunel inverso. La idea es abrir un puerto local en el servidor remoto que se conecte a un puerto de mi puesto de trabajo donde tenga un proxy que redirija el tráfico a Internet.
En mi PC dipongo de una aplicación que abre un puerto local y redirige el tráfico al ISA Server de mi empresa. El puerto en mi PC donde está escuchando el Proxy es el 5865. Ahora se trata de abrir un tunel SSH inverso con el comando ssh -R 20000:localhost:5865 root@servidorenelhosting ¿Qué hace esto? Pues en primer lugar se conecta al servidor que está en el Hosting, abre el puerto 20000 y lo enlaza a mi PC (localhost) con el puerto 5865. El resultado es que si yo le digo al servidor que lance tráfico por el puerto 20000 en realidad ese tráfico es lanzado por el tunel contra mi PC y este lo lanza hacia Internet a través del ISA Server de mi empresa.

Pasos 2 y 3

Necesitamos que la herramienta apt-get salga por un proxy y eso lo conseguimos ejecutando el comando export http_proxy=http://localhost:20000 en el servidor. Ahora lanzamos el apt-get update y luego el apt-get dist-upgrade. Todo va como la seda. Estimación correcta = 30 minutos. (No quedas tan mal)

Lo de instalar el servidor Apache version 2.2.14 o superior es otra história.