sábado, 3 de mayo de 2008

SSH Tunneling

Un problema común
Uno de los grandes problema con que lidio lidiaba en los servidores de producción, es que comúnmente tienen reglas de firewall estrictas que sólo permiten el tráfico TCP/IP por el puerto del servicio que están ejecutando (servidor web, base de datos, FTP, etc.) y el puerto de SSH (22) con fines de administración.

Además en la mayoría de los casos el acceso SSH está limitado sólo desde algunos de los equipos de la red local y en ningún caso permiten el acceso SSH desde Internet.

Esta situación hace muy difícil los procesos de administración, actualización y solución de contingencias ya que la única manera de acceder al servidor era ir físicamente al datacenter o intermediar telefónicamente con un operador que con suerte sabe ejecutar los comandos de shell cd y ls.

Otro problema que se nos puede presentar es la necesidad de encriptar conexiones de protocolos inseguros, como por ejemplo una conexión FTP.


La solución
Una solución para poder acceder a sistemas remotos es estableciendo un Tunnleing SSH, el cual consiste en redirigir (forward) las conexiones TCP dirigidas hacia un puerto específico hacia otro host por medio de la conexión encriptada de SSH. No soporta redirección de paquetes UDP.

En los siguientes ejemplos utilizaremos como ejemplo las siguientes direcciones IP:
  • Servidor (con acceso restringido): 1.1.1.1
  • Equipo de administración (tiene acceso al servidor): 1.1.1.2
  • Equipo local (sin acceso al servidor): 1.1.1.3
El tunneling SSH tiene dos modalidades de redirección: remote port forwarding que permite redirigir conexiones TCP desde el equipo remoto y local port forwarding que permite redirigir las conexiones TCP desde el equipo local.

En shell, la sintaxis tradicional para establecer una conexión SSH es la siguiente:
ssh user@host
La sintaxis para establecer un tunneling consiste en indicar adicionalmente:
  1. El tipo de redirección: "R" para remote port forwarding y "L" para local port forwarding.
  2. El puerto que se redireccionará.
  3. El host y puerto hacia el cual se redigirán los paquetes TCP
Quedando en:
ssh user@host -R port:host:hostport
ssh user@host -L port:host:hostport
En los siguientes ejemplos se utilizará para redirigir conecciones SSH, pero esta técnica sirve para redireccionar cualquier servicio basado en TCP.


Local port forwarding
Si quisieramos acceder por SSH al servidor 1.1.1.1 desde nuestro equipo local 1.1.1.3, el cual no tiene acceso directo, podríamos establecer inicialmente una conexión hacia el equipo de administración 1.1.1.2 y desde ahí establecer un port forwarding hacia el servidor 1.1.1.1 tal como se muestra en el siguiente esquema:


Para eso, desde nuestro equipo local 1.1.1.1 ejecutamos el siguiente comando:
ssh user@1.1.1.2 -L 2222:1.1.1.1:22
Una vez conectado al equipo remoto 1.1.1.2 todas las conecciones desde nuestro equipo local al puerto 2222 serán redirigidas al puerto 22 del servidor 1.1.1.1, con lo cual hemos logrado tener acceso al servidor remoto mediante el siguiente comando:
ssh user@localhost -p 2222
Incluso desde otro equipo que tenga acceso a 1.1.1.3 podrá conectarse al servidor 1.1.1.1 mediante SSH:
ssh user@1.1.1.3 -p 2222


Remote port forwarding
Otra modalidad para acceder al servidor 1.1.1.1 es establecer la conexión opuesta desde el equipo de administración 1.1.1.2 hacia nuestro equipo local 1.1.1.3 como se ilustra a continuación:


En este caso desde el equipo 1.1.1.2 se establecerá un remote port forwarding mediante el siguiente comando:
ssh user@1.1.1.3 -R 3333:1.1.1.1:22
Una vez conectado al nuestro equipo 1.1.1.3 todas las conecciones desde nuestro equipo local al puerto 3333 serán redirigidas al puerto 22 del servidor 1.1.1.1, con lo cual hemos logrado tener acceso al servidor remoto mediante el siguiente comando ejecutado desde 1.1.1.3:
ssh user@localhost -p 3333


SSH desde Windows
Las técnicas de tunneling también están disponibles para Windows, por ejemplo se puede utilizar el programa gratuito putty. La configuración de tunneling se realiza en la siguiente ventana de configuración:




Aplicaciones
Esta técnica nos permite acceder a casi cualquier servicio remoto, como por ejemplo la base de datos del backend o a un sitio web disponible sólo para la intranet.

Además como la conexión se realiza sobre SSH, todas las comunicaciones se realizan mediante un canal encriptado, lo que nos permite dar una mayor seguridad a conexiones vía FTP o a una base de datos.

La técnica de port forwarding es bastante flexible y poderosa, por ejemplo en algunas situcaciones he llegado a realizar hasta 3 tunnelings anidados para lograr alcanzar servidores que están extremadamente resguardados.

2 comentarios:

Juan Puig dijo...

Pero para hacer redirección de puertos necesitarás privilegios de root en 1.1.1.2 no?

Se supone que es la computadora de tu trabajo por ejemplo?

José Rodríguez dijo...

Sólo es necesario tener privilegios de root si quieres hacer un forward de un puerto igual o inferior a 1024.

Además el "port forwarding" es una funcionalidad que se puede activar/desactivar en el archivo de configuración sshd_config mediante el parámetro "AllowTcpForwarding".