SSH como Proxy SOCKS

SOCKS

SOCKS es un protocolo de internet que facilita el encaminamiento de paquetes entre aplicaciones cliente-servidor via un servidor proxy. Proxying - en general - se refiere a la conexión entre dos redes a nivel de aplicación, sin que conlleve permitir una conexión directa al nivel de red.

Figura: Una instalación SOCKS típica

SOCKS es por tanto un protocolo de red de representación que permite a las máquinas en un lado del servidor SOCKS un acceso completo a las máquinas en el otro lado del servidor SOCKS. A menudo SOCKS es usado como un cortafuegos de red, redirigiendo solicitudes de conexión entre máquinas a ambos lados del servidor SOCKS. El servidor SOCKS autentifica y autoriza las solicitudes, establece una conexión proxy y permite el paso de los datos entre las máquinas.

Por ejemplo, quiero descargar una página desde un servidor web en una intranet en la ULL. Supongamos que no puedo porque un cortafuegos lo impide. Hago que mi navegador comunique con el servidor proxy. El proxy envía envía la petición al servidor web y envía los datos recibidos a mi navegador.

Una desventaja habitual del uso de proxys a nivel de aplicación es la ausencia de transparencia: sólo los programas escritos con soporte al esquema de representación particular podrán acceder al mismo. Sin embargo SOCKS no es específico de un protocolo de alto nivel como HTTP o SMTP. Provee servicios generales: establecer una conexión TCP, trazear una ruta, señalar un host, etc. Muchos de estos servicios se sitúan en la frontera entre aplicaciones y librerías que proveen acceso a servicios de red. Una consecuencia de este alto nivel es que es posible hacer que aplicaciones que no estaban preparadas para SOCKS funcionen con SOCKS mediante un simple reemplazo de las viejas librerías dinámicas adecuadas por versiones de las librerías que están preparadas para funcionar con SOCKS.

La Opción -D port

La opción -D [bind_address:]port del cliente ssh especifica une redirección de puertos a nivel de aplicación (dinámica). Funciona asignando un socket para la escucha en el lado local. Cuando se haga una conexión a dicho puerto los datos son transmitidos a través del canal seguro y el protocolo de la aplicación es utilizado para determinar a donde conectarse desde la máquina remota. ssh actúa como un servidor SOCKS2.6. Actualmente se soportan los protocolos SOCKS4 y SOCKS5. Esto se conoce como redirección de puertos dinámica (en inglés dynamic port forwarding). Puede ser establecida también en el fichero de configuración.

Veamos un ejemplo. Supongamos que estamos en un internet-café o en una conferencia o en el campus de la universidad donde no estamos seguros de que los datos que se envían sobre la red inalámbrica no puedan estar siendo leídos. Queremos establecer un tunel seguro para la navegación, consulta del correo, etc. Estando en mi portátil escribo:

$ ssh -N -D 9999 europa &

Ahora en mi navegador firefox (estos pasos pueden cambiar dependiendo de la versión):

editar 
  => preferencias 
    => configuración

o bien

editar 
  => preferencias 
    => avanzado
      => red
       => configuración

En la ficha que aparece, relleno la entrada Servidor SOCKS:

Servidor SOCKS: localhost      Puerto: 9999

Ahora visito con el navegador una página que indique mi IP de origen. Una de estas puede valer:

El servidor HTTP indica que la IP del navegador es la de europa no la del portatil.

También podemos usar curl (curl es un programa parecido a wget pero con mayor número de funcionalidades. Véase http://curl.haxx.se/ y la entrada de la Wikipedia para cURL) con el servidor SOCKS creado:

$ curl --socks5 localhost:9999 -dump http://www.tracemyip.org/ | egrep '[0-9]+\.[0-9]+\.[0-9]+' -

Esto descargará la página en http://www.tracemyip.org/ y la filtrará mediante la regexp pasada a egrep. Podremos ver como la dirección IP detectada es la de la máquina remota (europa).

Además la comunicación entre la máquina remota y mi portatil va cifrada.

Ejercicio 2.1.25   Averigue si la navegación web desde su ordenador ocurre a través de un proxy. Si es así, ¿Cuál es la dirección IP de ese proxy?

El programa tsocks

Sin embargo no todos los programas vienen preparados para coonectarse a un proxy SOCKS. Si es el caso que el programa que nos interesa no provee opciones para conectarse a un proxy SOCKS podemos utilizar el programa tsocks, el cuál permite una conexión transparente con un servidor SOCKS.

Requiere que las opciones se pongan en un fichero de configuración:

$ cat .tsocks.conf
server = 127.0.0.1
server_port = 9999
Si no somos el administrador debemos indicar donde se encuentra nuestro fichero de configuración:

$ cat bin/viaservername
#!/bin/sh

TSOCKS_CONF_FILE=$HOME/.tsocks.conf
export TSOCKS_CONF_FILE
exec tsocks "$@"
Ahora podemos ejecutar un comando sin soporte SOCKS como wget via el proxy SOCKS:
$ viaservername wget http://www.tracemyip.org/
--12:01:17--  http://www.tracemyip.org/
           => `index.html.2'
Resolviendo www.tracemyip.org... 66.7.206.179
Conectando a www.tracemyip.org|66.7.206.179|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: no especificado [text/html]
....
12:01:18(61.01 KB/s) - `index.html.2' guardado [31497]

Veamos la dirección IP de origen en el fichero index.html

$ egrep '[0-9]+\.[0-9]+\.[0-9]+' index.html
...  value = "remote SSH server IP" type="text" ...

Véase También



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