SOCKS: Montando nuestro servidor proxy con SSH

Hoy aprenderemos los conceptos de SOCKS, y podremos montar nuestro propio proxy utilizando algunas bondades de OpenSSH en Linux.


Antes que nada, una breve introducción.

SOCKS (Socket Secure) es un protocolo de Internet que permite enrutar paquetes de red entre un cliente y un servidor a través de un servidor proxy. SOCKS5 además provee autenticación, de modo que solamente los usuarios autorizados pueden acceder al servidor proxy.

Un servidor SOCKS provee un proxy para conexiones TCP a una dirección ip arbitraria.

Trabaja en capa 5 (sesión) del modelo ISO/OSI, la capa que hace de intermediaria entre las capas de transporte y presentación. Esto permite que cualquier protocolo de aplicación, como http, pueda “encapsularse” en una conexión administrada por SOCKS.

Entre los usos principales de SOCKS se encuentran eludir firewalls que bloquean determinados puertos y aplicaciones, como redes de gobierno o lugares de trabajo.

SOCKS y OpenSSH

Ahora al grano, OpenSSH provee un mecanismo para realizar un reenvío dinámico de puerto que permite a un usuario crear una conexión SOCKS local, de modo que todo el tráfico de un protocolo de aplicación como http pueda salir a la red por medio de un proxy SOCKS al que previamente habremos conectado vía túnel ssh.

Es decir, nuestro navegador podría navegar en Internet desde una ip remota que no sea la nuestra, haciendo que nuestra máquina se conecte a dicha ip remote vía ssh, y la utilice como proxy SOCKS.

De mas está aclarar que todo el tráfico entre nuestra máquina y el proxy remoto viajará por Internet cifrado utilizando el túnel SSH. Podemos verlo en la siguiente figura. En ella, un cliente (nuestra máquina) se conectará a un servidor web a través de un proxy SOCKS.

Primero establecemos la conexión SSH entre el cliente y el servidor SSH, y luego la utilizamos como proxy SOCKS, de modo que si el servidor web remoto está llevando a cabo un log de las ip’s conectadas, no va a ver nuestra ip de cliente que navega, sino la ip del servidor ssh que oficia de proxy socks.

socks

El montaje en unos pocos comandos

Lo primero, necesitamos instalar openssh server en el servidor, y el cliente para poder conectaros en nuestra máquina.

En el servidor:

aptitude install openssh-server

En el cliente:

aptitude install openssh-client

Teniendo en el servidor ssh algún usuario (NUNCA el usuario root), podemos conectarnos a él directamente desde el cliente mediante este comando:

ssh -D 12345 usuario@ip_servidor_ssh

Este comando tiene dos propósitos. Por un lado, crear el túnel ssh entre nuestro cliente y el servidor SSH, y por otro, abrir un puerto local, 12345 en nuestro ejemplo, que será el proxy socks (en este caso no lo hemos asociado a ninguna ip local, por lo que atenderá en localhost. De otra forma, si queremos que nuestro proxy escuche en otra ip distinta de la de localhost, podemos especificarlo con ip:puerto en vez de solo el puerto.

Veamos si el puerto está abierto:

Como se ve, en la ip de localhost (ipv4) y de local-link (ipv6) tenemos el puerto 12345 abierto.

No nos queda más que conectar un navegador como Firefox, o cualquiera que soporte proxy socks, a la red.

En mi caso de pruebas, les muestro la interfaz de configuración de QupSilla:

En Firefox, por ejemplo, también lo podremos configurar desde las settings:

socks

Y también en Chromium/chrome, pero esta vez desde línea de comandos al lanzar la aplicación:

chromium --proxy-server="socks5://localhost:12345"

Y ya estaremos navegando por medio del proxy!

¿Cómo probarlo? Entramos en miip.net o algún sitio similar, y verificamos que la IP que ve el sitio es, efectivamente, la de nuestro servidor SSH, no la nuestra 🙂

¡Espero que les sirva!

Cualquier duda o comentario pueden hacerlo al pie de este artículo en el blog! Gracias!