Hace un par de años en las oficinas y lugares de trabajo se usaba NAT (Network Address Translation) para proveer de acceso a internet a los trabajadores.
En la actualidad esta salida a internet se hace a traves de servidores proxy, el proxy ISA server de microsoft o para entornos Linux/UNIX el servidor proxy squid por ejemplo, aunque hay muchos mas. Estos servidores proxy nos impiden abrir sockets directamente contra servidores remotos, por lo que no nos funcionaran aplicaciones como: telnets, conexiones SSH, FTPs, etc.
En este articulo veremos como usando SSH y la caracteristica port fordwarding podemos tunelizar protocolos y hacer que funcionen distintas apliaciones que no tienen soporte nativo para ser usadas a traves de un proxy.
Programas necesarios para tunelizar conexiones.
En primer lugar, necesitaremos segun el SO que tengamos en la oficina:
- Un cliente SSH capaz de tunelizar conexiones que funcione en windows. En nuestro caso putty
- O bien un cliente SSH capaz de tunelizar conexiones que funcione en linux. En este caso, el cliente standar que viene en todas las distribuciones linux. El cliente ssh de www.openssh.com En este caso, tambien nos hara falta el netcat para poder usar el ssh a traves de un proxy , ya que el cliente ssh de por si no soporta este tipo de conexion de forma nativa.
- Por ultimo el cliente ssh que viene con CYGWIN (entorno Linux-Like que corre en windows) tambien deberia funcionar, aunque este aun no lo he probado. (cuando lo pruebe ampliare este articulo)
En segundo lugar necesitamos un ordenador en el exterior de la oficina que disponga de un servidor ssh. En este caso nos valdria cualquier linux/UNIX con el demonio sshd instalado o bien un ordenador con windows y el paquete sshwindows instalado (este ultimo me falta por comprobar). En principio en la informacion sobre el demonio sshwindows, pone que este es capaz de hacer port fordwarding que es la caracteristica del SSH que nos permite tunelizar conexiones.
Configuración standard de los servidores proxy en una oficina normal.
Los servidores proxy por norma general se configurar para que permitan trafico a traves de si mismos por los puertos 80 (trafico http normal) y 443 (trafico http encriptado o https). Cuando el trafico va encriptado el servidor proxy debe de permitir el metodo CONNECT ya que las conexiones https no pueden cachearse, por lo que en cierta manera una conexión https es una conexion directa entre el cliente y el servidor.
Configuración del servidor SSHD
El servidor proxy solo dejara conexiones CONNECT por el puerto 443 y los servidores SSHD escuchan por el puerto 22 por lo que tendremos que hacer una de estas dos cosas:
- Redirigir el puerto 443 de nuestro servidor al puerto 22
- Poner el demonio SSHD para que escuche tambien en el puerto 443
Para redirigir el puerto 443 al 22 podemos usar la siguiente sentencia IPTABLES:
iptables -t nat -A PREROUTING -i ippp0 -p tcp --dport 443 -j REDIRECT --to-port 22
Para poner el demonio SSHD a escuchar en el puerto 443 vamos al fichero de configuracion del servicio para el caso de debian /etc/sshd/sshd_config lo editamos con nuestro programa favorito y añadimos la siguiente linea Port 443 de tal forma que la seccion de puertos quede asi:Donde INTERFAZ sere el interface externo por donde sale a internet nuestro servidor, normalmente eth0, eth1, ppp0, etc
# What ports, IPs and protocols we listen for
Port 22
Port 443
Ahora lo unico que hay que hacer es reiniciar el servicio.
MUCHO OJO en este paso!!!! ya que si hemos dejado mal la configuración del servidor SSHD al reiniciarlo podemos quedarnos sin conexion….
SOLUCION: tener varias sesiones SSH abiertas contra el servidor. De esta manera, si al reiniciarlo no nos deja conectarnos, podemos usar una de las que ya teniamos abiertas para dejar las cosas como estaban.
/etc/init.d/ssh restart
Configuración del cliente SSH para windows (putty) para ser usado a traves de un proxy.
Ahora solo nos falta configurar el cliente ssh para que se conecte a internet a traves de nuestro proxy.
En el caso del putty lo unico que hay que hacer es ir a la sección: Connection->Proxy y rellenar los siguientes valores:
Proxy_hostname: con el nombre o la ip de nuestro servidor proxy.
Port: puerto donde escucha el servidor, normalmente suele ser el 8080.
Una vez hecha la configuración para que salgamos por el servidor proxy, solo queda lanzar la conexion contra el equipo al que queremos conectarnos para ello rellenamos los datos siguientes Host y Port.
OJO!!! tenemos que lanzar la conexion contra el puerto 443, ya que es ahi donde nos deja conectarnos el proxy.
Ademas si vamos a conectarnos con asiduidad a esta maquina lo mejor que podemos hacer es ponerle un nombre en Saved Sessions y pinchar en el boton Save asi las siguientes veces solo tendremos que pinchar dos veces sobre ese nombre para poder conectarnos.
Si hemos seguido todos los puntos correctamente, tendremos abierta una sesion remota contra el equipo de casa y nos pedira el login y el password. ;P
Configuración del cliente SSH para windows (putty) para tunelizar conexiones.
Una vez que ya hemos conseguido poder abrir una sesión contra el servidor SSHD remoto lo unico que nos queda es tunelizar la conexión.
Para ello tendremos que configurar el cliente SSH putty de la siguiente manera. Vamos a Connection->SSH->Tunnels y ahi ponemos (Por ejemplo):
- Source port: 8021 (tiene que estar por encima del 1024, ya que si estuviera por debajo, tendriamos que correr el putty como administrador)
- Destination: nombre de maquina o IP a la que queremos conectarnos en nuestro caso ftpremoto, luego pondremos dos puntos y el numero de puerto remoto al que nos conectaremos.
Despues basta con pinchar en Add para que nos lo añada a Fordwarded ports una vez añadido el puerto para poder lanzar la conexión tunelizada pincharemos 2 veces sobre la pareja: L8021 ftpremoto:21
El servidor ssh nos volvera a pedir nuestro login/pass y una vez autentificados nos abrira una conexión tunelizada entre el puerto 8021 de nuestra maquina local al puerto 21 de la maquina ftpremoto
Es decir, si configuramos nuestro cliente FTP favorito (FireFTP, FileZilla) para que se conecte a localhost:8021 lo que realmente estara haciendo es conectarse al puerto 21 de la maquina ftpremoto.