¿Estás en una red con acceso restringido a Internet? Quizás detrás de un filtro restrictivo de contenidos en una empresa, o en un país donde imponen control de contenidos generalizados.

Si te encuentras en esa circunstancia, pero tienes acceso SSH como usuario regular a algún servidor que está fuera de esas restricciones...

Sólo necesitas acceso SSH

Teniendo acceso SSH como usuario normal y corriente, sin necesidad de superusuario local, ni remoto, es posible saltarse restricciones de navegación con facilidad. Basta crear un proxy SOCKS a través de la conexión SSH, e indicarle al navegador, o aplicación equivalente, que lo use para conectarse.

Esa conexión SSH actúa como túnel cifrado para tráfico HTTP y HTTPS, e incluso DNS. El túnel lleva el tráfico desde el usuario regular en la máquina local, hacia el usuario regular en la máquina remota, desde donde «parece originarse». Desde el punto de vista de los sitios accedidos, la conexión parecera venir desde el servidor remoto, y no desde tu ubicación actual. Desde el punto de vista de un curioso, hay una conexión SSH, autorizada desde un principio según nuestra premisa.

Estableciendo el túnel SSH con proxy SOCKS

$ ssh -q -N -D 31337 -C remote.example.link

Ese comando se conectará a la máquina remote.example.link: sin ejecutar comandos (-N); estableciendo un proxy SOCKS desde el puerto 31337 en la máquina local (-D 31337) y terminado en la máquina remota; usando compresión de datos (-C) para ahorrar ancho de banda; y lo más silencioso posible (-q).

Una vez suministrada la clave para conectarse, o mejor, completada la autenticación con llaves SSH que usamos los adultos responsables, el comando se va a quedar ahí trabajando, en silencio, hasta que sea interrumpido con Ctrl-C. Por eso es conveniente ejecutarlo en un terminal dedicado para cerrarlo al terminar.

Para tener el túnel activado permanentemente, basta agregar la opción -f, y posiblemente crearle un SystemD Unit para que siempre este activo y restablezca la conexión cada vez que sea necesario. Esa es una comodidad que vale la pena tener en una máquina personal.

Pero todo eso está en man ssh...

Aplicaciones y el proxy SOCKS

Una vez establecido el túnel, basta indicarle a los navegadores o aplicaciones basadas en HTTP/HTTPS que empleen el proxy SOCKS para conectarse, en lugar de intentar conexiones directas.

El navegador Chromium es particularmente conveniente para esta maniobra, porque es posible indicarle el proxy desde la línea de comandos.

$ chromium --proxy-server="socks://localhost:31337"

Ahora puede usarse esa sesión de Chromium para navegar con libertad y privacidad, como si las conexiones salieran del servidor remoto.

Para otros navegadores, es necesario ajustar la configuración a través de sus respectivas interfaces de usuario. En el caso de Firefox, es necesario buscar en

Preferencias -> General -> Network Settings

para indicar Manual Proxy Configuration usando SOCKS5 sobre localhost y el puerto 31337. En el caso de Google Chrome, existe una opción similar al abrir el pseudo-URL chrome://settings/.

Si estás usando GNOME como ambiente de escritorio, es posible designar al proxy SOCKS de manera que sea usado por todas las aplicaciones de forma automática. La configuración es similar a lo que harías para Firefox, sólo que dentro del menú de configuración de GNOME.

Esta técnica también funciona si estás fuera del país en cuestión, tienes acceso SSH a una máquina que está dentro del país en cuestión, y quieres visitar sitios «como si estuvieras dentro» del país.

Y nadie notará la diferencia.

¿Y de donde saco acceso SSH?

La premisa de tener acceso SSH implica dos cosas:

  1. Existe el servidor remoto.example.link en el cual tienes un usuario regular al cual puedes hacer ssh.

  2. En tu ubicación está permitido hacer ssh hacia el servidor remoto.example.link.

Para cumplir con la parte (1) de la premisa, basta contratar un servidor mínimo sólo con ese propósito, o pagarle a alguien que ofrezca ese servicio. Suele ser la parte más fácil.

Para cumplir con la parte (2) puedes encontrarte un obstáculo interesante: un administrador de red.

Es posible que en la red en la cual te encuentras esté bloqueado el acceso SSH a cualquier parte (raro, pero plausible). Muchas veces basta justificar que se necesita «para trabajar» y con eso el administrador de red hace los ajustes. Ganaste.

Algunos administradores se negarán, y dirán que sólo se permite acceso a sitios web. En ese caso, es muy sencillo crear una página web legítima vía HTTPS con elementos del trabajo. Esa página tiene un URL tal que conecta con el servicio SSH. Solicitas el acceso a la página, el administrador la visita, la nota legítima, otorga permiso. Ganaste. Por goleada.

¿Cómo hacer ese URL que conecte con el servicio SSH y que además esté disimulada en el tráfico web normal? Ese es un bonito ejercicio para programadores web...