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.
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, por ejemplo, la siguiente línea abre el puerto 12345 en todas las direcciones IP configuradas en GNU/Linux.
ssh -D 0.0.0.0:12345 usuario@ip_servidor_ssh
Veamos si el puerto está abierto:
diego@cryptos:~$ sudo ss -npltu|grep 12345
tcp LISTEN 0 0 127.0.0.1:12345 *:* users:(("ssh",pid=31856,fd=5))
tcp LISTEN 0 0 ::1:12345 :::* users:(("ssh",pid=31856,fd=4))
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:
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!
5 comentarios
Kenny · 23 julio, 2015 a las 14:46
Diego, cuál sería la diferencia (si es que la hay) a navegar a través de una VPN?
Funcionalmente, veo que sería casi lo mismo, pero técnicamente?
Abrazo.
Emiliano.
PD: Como ya se acabaron los cursos, ahora pregunto en los post del blog! =P
Diego Cordoba · 23 julio, 2015 a las 14:51
Emiliano! Usted nunca molesta con preguntas 😛
Como decís, funcionalmente no hay diferencia, y técnicamente, montar un tunel ssh es más simple que montar una vpn en la generalidad de los casos. Como en todo lo que tiene que ver con software libre y opensource, hay muchas alternativas para hacer cada cosa.
Si tenés que conectarte para traficar muchos datos, o enrutar redes enteras a través de Internet, te conviene una vpn, openvpn o ipsec, y no ssh, por más que en ssh también se pueda montar. Si por ahí necesitás salir a Internet para unos pocos protocolos que pueden correr sobre socks5, podés hacerlo de manera simple con ssh, sin complicarte demasiado con una vpn.
Todo tiene su uso, en algún momento algo va a servirte 🙂
Ramiro Vicchio · 17 diciembre, 2016 a las 13:51
Diego , como andas? Te hago una consulta , en caso que la máquina cliente tenga win , también se puede hacer?
Diego Cordoba - @d1cor · 19 diciembre, 2016 a las 14:13
Hola Ramiro! Sí, se puede con un cliente ssh como Putty. En el caso particular de Putty, en la pestaña de «sessions» colocás la dirección ip y puerto SSH de tu servidor remoto, y luego te vas a «Connection -> SSH -> Tunnels», pones un puerto de origen (Source port), por ejemplo, 12345, y marcás «Dynamic» y «Auto» en las opciones de la ventana… eso va a abrirte el puerto 12345 socks contra tu servidor, y luego solo te va a restar configurar tu navegador para que apunte a localhost:12345 como proxy. Probalo y cualquier duda escribime.
Espero te sirva!
Ramiro Vicchio · 19 diciembre, 2016 a las 14:34
Si Diego anduvo de 10 ! Gracias!!!
Los comentarios están cerrados.