lunes, 18 de marzo de 2013

SSH Tunneling


Como ya sabemos SSH es un protocolo de comunicaciones el cual abre un canal encriptado de tipo cliente-servidor lo cual le da un grado de seguridad mayor a otros utilizados con los mismos fines. Generalmente se utiliza para realizar login remoto a sistemas en linea de comandos, como ser sistemas UNIX o bien dispositivos de red (routers, switches, etc).

Este protocolo también puede ser utilizado para transmitir a través de su canal encriptado otro tipo de tráfico, esta metodología es llamada SSH Tunneling.

NOTA: SSH Tunneling solo funciona con tráfico TCP (por definición de protocolo, si no entienden el por que... antes de seguir leyendo el documento leer sobre capa 3 y 4 de modelo OSI, así como también los protocolos que lo constituyen).


Por que utilizar SSH Tunneling? 

Hay varios motivos por los cuales utilizar SSH Tunneling, algunos de ellos son:

  • Tenemos que acceder a un equipo en una red remota, el cual solo soporta acceso inseguro a puerto 80, obviamente no voy a querer exponer el puerto 80 hacia internet y como tengo una IP dinámica no puedo generar una regla que permita únicamente mi tráfico.
  • Un cliente al que le instalé un firewall me dice que no puede navegar en cierto sitio, pero que no sabe que error le dio el sistema ya que apagó la PC y ya va camino a su casa (típico). Tengo que de alguna forma simular estar dentro de su red para ver como es el comportamiento.





Estos casos anteriores los puedo solucionar mediante SSH Tunneling.

Hay dos tipos de túneles SSH (dinámico y estático). El estático es básicamente un port-forwarding dentro de un canal seguro, por lo cual todas las conexiones a un puerto local definido se transmitirán hacia el extremo remoto en otro puerto también definido.

En este documento veremos el dinámico  sobre el cual no es necesario definir un único puerto para trabajar, podremos utilizarlo para transmitir diversa información (http, smtp, etc).

Básicamente podemos encapsular otro protocolo TCP dentro de un canal SSH para simular estar dentro de una red remota.


Como utilizarlo? 

Esto dependerá de nuestro sistema operativo y la aplicación que utilicemos para levantar la conexión SSH al equipo remoto. Básicamente la forma en que funciona el túnel dinámico es simulando un proxy SOCKS en nuestro equipo, por lo cual lo que nosotros transmitimos a través de este SOCKS es lo que va a llegar a este destino.

Por ejemplo: Si queremos encapsular tráfico http/https, debemos configurar en nuestro navegador este proxy (que no será mas que nuestro equipo local / puerto definido). Lo mismo sucederá si queremos encapsular tráfico POP3/SMTP, nuestro cliente de correo deberá soportar un proxy SOCKS y lo debemos configurar.

Como hacemos para levantar este "proxy SOCKS"?

Aquí va a depender de la aplicación que utilicemos para levantar la conexión SSH. A continuación 2 ejemplos dependiendo del sistema operativo que se utilice, son ejemplos por lo que se podría utilizar estas u otras aplicaciones que tengan la misma funcionalidad.


  1. Mi Worstation es basada en Unix y tengo instalado el cliente ssh.

    Se debe ejecutar el siguiente comando:

    ssh –D [puerto_origen] –p [puerto_ssh_remoto] [usuario]@[ip_destino]

    Por ejemplo, para levantar un túnel hacia un servidor SSH que corre en el equipo con IP 1.1.1.1 sobre el puerto 8022 y abrir el puerto local 8081 (el cual será nuestro proxy SOCKS):

    [ping@pong ~]# ssh -D 8081 -p 8022 root@1.1.1.1

    Nos solicitará el correspondiente password y ya tendremos el túnel levantado. En este caso nos logueamos como root, pero podría ser cualquier usuario que tenga permitido SSH.
  2. Mi Workstation corre alguna de las versiones del sistema operativo Window$.

    Aparte de enviarte mi mas sentido pésame. Te puedo recomendar utilizar el cliente SSH PuTTY aunque existen otros con las mismas funciones.

    Para configurar la conexión en PuTTY se configuran los datos de host/puerto remoto, también se debe configurar el túnel, para lo que debemos configurar las siguientes opciones:

    Opción SSH, Tunnels:

    Source Port: (puerto local en el cual funcionará el proxy socks)
    Destination: Dynamic


Ahora ya tenemos el túnel levantado y nuestro proxy SOCKS corriendo, lo que debemos hacer es configurar la aplicación la cual queremos encapsular. Recordar siempre que hay que configurarlo como proxy SOCKS, la IP del proxy es nuestro propio equipo (loopback) y el puerto del proxy es el que definimos al momento de generar la conexión (en nuestro ejemplo anterior 8081.

Un ejemplo de como configurar un navegador de internet (en nuestro caso firefox).



No hay comentarios:

Publicar un comentario