Tunneling Directo

Tunneling es la capacidad de un protocolo de red para encapsular otro protocolo o sesión. Por ejemplo el protocolo windows SMB para la compartición de archivos es inseguro. Es posible establecer un tunel que rutea todo el tráfico SMB através de una conexión SSH.

Figura: Redirección de una Aplicación Cliente-Servidor con SSH

Se puede hacer tunneling con ssh usando las opciones -L (local) y R (remoto). Una llamada de la forma:

          ssh -L [bind_address:]port:host:hostport machine

Especifica que el puerto port en la máquina cliente debe ser redirigido al puerto hostport en la máquina host (donde quien es host es evaluado en el lado remoto).

Se crea un proceso en el cliente que escucha en el puerto port2.4. Cuando se hace una conexión a ese puerto se la redirige cifrada hasta machine y desde alli hasta el puerto hostport en la máquina remota host.

Figura: ssh -L [bind_address:]port:host:hostport machine

Por ejemplo, el comando:

mimaquina:~> ssh -N -L 1048:localhost:80 orion &
establece un tunel cifrado entre el puerto 10482.5de mimaquina y el 80 de orion (la referencia a localhost en 1048:localhost:80 es relativa a orion). Ahora podemos navegar mediante una conexión a localhost por el puerto 1048:

mimaquina:~> lynx localhost:1048/~casiano/pp2/pp20506/index.html

La parte de conexión que transcurre entre orion y mimaquina será cifrada.

Otro ejemplo. Supongamos que estamos en un país en el que esta prohibido visitar google, pero disponemos de acceso a una máquina europa en otro país mas liberal. Podemos hacer:

$ ssh -N -L9000:www.google.com:80 europa &

y ahora apuntar el navegador a http://localhost:9000. La parte de navegación entre nuestro portátil y europa va cifrada.

Figura: Tunel creado con ssh -N -L9000:www.google.com:80 europa & seguido de firefox http://localhost:9000

La opción -L indica redireccionamiento local: el cliente TCP está en la máquina local, junto con el cliente SSH. La opción va seguida de tres números:

El camino que siguen los datos es como sigue:

  1. El cliente HTTP envía sus peticiones al puerto local
  2. El cliente SSH local lee la petición en el puerto local encripta los datos y los envía por medio de la conexión SSH hasta el servidor
  3. El servicio SSH en el servidor desencripta los datos y los envía al servidor HTTP que escucha en el puerto 80
  4. Los datos recorren el camino inverso desde el servidor hasta la máquina local

Es posible especificar el redireccionamiento de puertos en el fichero de configuración usando la clave LocalForward :

LocalForward 1048 remote:80

Ejercicio 2.1.20   Repita el ejemplo anterior usando una máquina del laboratorio y una máquina externa.

Alcanzando via SSH máquinas en una intranet

Queremos acceder desde la máquina externa micasa a una máquina dentro de la red corporativa cuyo nombre es millo.

El paso habitual es conectarse a una máquina bastión cuyo nombre es bastion y desde alli hacer ssh hasta millo.

La conexión puede establecerse directamente abriendo primero un tunel directo SSH con el comando:

micasa:~> ssh -N -L2001:millo:22 bastion
El comando establece una conexión ssh con bastion e indica que los datos deben ser ruteados (crudos, sin encriptar) desde bastion hasta millo. Además establece un proceso en micasa que redirige el puerto local 2001 hacia la conexión ssh.

A partir de este momento puedo conectarme directamente a la máquina millo sin mas que conectarme a localhost en el puerto 2001:

micasa:~$ ssh -p 2001 localhost
The authenticity of host '[localhost]:2001 ([127.0.0.1]:2001)' can't be established.
RSA key fingerprint is ................................................
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2001' (RSA) to the list of known hosts.
Last login: Mon May 18 18:48:56 2009 from ...............

casiano@millo~$

Figura: ssh -N -L2001:millo:22 bastion seguido de ssh -p 2001 localhost.
La conexión directa entre una máquina externa a la intranet y una máquina de la intranet está prohibida (lado derecho)

Los pasos que ocurren son los siguientes:

  1. La conexión ssh desde micasa envía datos al puerto 2001

    micasa:~$ ssh -p 2001 localhost
    
  2. El tunel ssh establecido anteriormente los recoge desde 2001 y los lleva hasta el puerto 22 del cortafuegos bastion. El daemon SSH en el cortafuegos coopera ya que se trata de una conexión ssh por el puerto 22
  3. El servidor SSH en bastión desencripta y redirige los datos (sin que ocurra un segundo cifrado) al puerto 22 de la máquina millo
  4. El servidor ssh en millo recibe los datos, los procesa y envía la correspondiente respuesta en orden inverso

Obsérvese que la aparición del nombre de host millo en el comando de conexión

micasa:~> ssh -N -L2001:millo:22 casiano@bastion
se resuelve en bastion y no en la máquina local.



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19