A medida que pasan los años, Internet deja de ser una red libre para convertirse, cada vez más rápidamente, en un lugar controlado, censurado, filtrado y bloqueado. Tal vez impensado hace algunos años, hoy es común tolerar casos de censura burda y cruda por parte de gobiernos, corporaciones (o en el trabajo/oficina/escuela) y proveedores de servicios de Internet (ISPs), tal como el caso del bloqueo a Twitter por parte del gobierno turco para cubrir un escándalo de corrupción.

Por esta razón, los usuarios con ciertos conocimientos de redes y sistemas debemos contar con todas las técnicas y herramientas que nos permitan escapar del control, censura, filtrado y shaping de tráfico. Para cuidar nuestra libertad, que es lo más importante que tiene Internet según mi parecer.

En esta ocasión me complace presentarles este artículo que explica detalladamente cómo escaparle a la censura de una red corporativa y un proxy HTTP restrictivo. Todo nació a causa de que el proxy HTTP de mi red corporativa no me permite visitar alexa.com (el sitio de estadísticas de accesos a sitios Web propiedad de Amazon). Tal vez por parecer una URL de página triple equis, o el nombre artístico de un travesti (?). La cosa es que no puedo entrar a alexa.com. Challenge accepted.

El escenario es el siguiente: estoy dentro de una red corporativa; el firewall perimetral no me permite la salida hacia ningún sitio:puerto; sólo el proxy HTTP tiene permitida la salida hacia los puertos 80 y 443; el proxy está abierto o cuento con un usuario para acceder al mismo. ¿Qué necesito para lograr la navegación libre hacia Internet? Un servidor SSH accesible desde Internet escuchando en el puerto 443. O, si el proxy permite conexiones HTTPS hacia cualquier puerto, simplemente un servidor SSH accesible desde Internet.

El primer paso consiste en engañar al proxy HTTP para enmascarar una conexión SSH como si fuese tráfico SSL. Tal como expliqué en el artículo Cómo crear un túnel SSH a través de un proxy HTTP debido a que las conexiones SSL son encriptadas, los servidores proxy HTTP no pueden examinar el contenido de las mismas ni mucho menos modificar los pedidos. Por lo tanto es posible hacer pasar una conexión SSH como si fuera una sesión SSL utilizando corkscrew.

Una vez configurado corkscrew, siguiendo los pasos del artículo Cómo crear un túnel SSH a través de un proxy HTTP, logramos el acceso SSH a nuestro servidor externo haciéndole el bypass al proxy HTTP.

SSH es una herramienta magnífica que ofrece una gran cantidad de posibilidades. No sólo permite abrir un simple login remoto seguro, sino que también es posible implementar todo tipo de túneles, abrir shells reversas, ejecutar comandos remotos y además implementar un proxy SOCKS. Así es.

Del manual de OpenSSH (man ssh), cuando se utiliza el cliente OpenSSH con la opción -D, es posible especificar un forwarding de puertos dinámico a nivel aplicación, actuando efectivamente como un servidor proxy SOCKS. Esto funciona creando en el cliente un socket para que escuche en un puerto local (opcionalmente asignado a una dirección específica). Cada vez que se hace una conexión a este puerto, la conexión se reenvía a través del túnel SSH, y el protocolo a nivel aplicación es utilizado para determinar hacia donde conectarse desde la máquina remota.

De mínima sólo es necesario especificar un puerto para escuchar localmente, por ejemplo:

[emi@hal9000 ~]$ ssh -D 666 -p 443 root@host01.outsideworld.net
Privileged ports can only be forwarded by root.
[emi@hal9000 ~]$ ssh -D 6666 -p 443 root@host01.outsideworld.net
root@host01.outsideworld.net's password:
Last login: Sat Feb  7 19:40:34 1934 from hal9000
[root@host01.outsideworld.net ~]#

El servidor SSH en el host "host01.outsideworld.net" escucha en el puerto 443. Tal como se observa, los puertos privilegiados (<1024) sólo pueden ser utilizados por root, por lo tanto debo utilizar un puerto mayor a 1024 (o autenticarme localmente como root). En el ejemplo elegí el puerto 6666.

Una vez que la conexión sucede exitosamente, se abre la sesión SSH en el host remoto (notar el cambio de prompt). Es necesario dejar esta sesión abierta mientras deseemos utilizar el proxy SOCKS. Desde otra shell local es posible comprobar que el puerto local 6666 está abierto y escuchando peticiones:

[emi@hal9000 ~]$ netstat -nl | grep 6666
tcp        0      0 127.0.0.1:6666              0.0.0.0:*                   LISTEN
tcp        0      0 ::1:6666                    :::*                        LISTEN

El resultado es un proxy SOCKS local que es capaz de acceder libremente a Internet a través del host externo "host01.outsideworld.net", tal como se observa en la figura:


Gráfico creado con yEd.

Ahora sólo resta configurar un browser para que se conecte a Internet a través de este proxy SOCKS. A modo de ejemplo voy a utilizar Opera, aunque funciona con cualquier navegador.

Cuando intento ingresar a alexa.com utilizando el proxy HTTP de la red corporativa, se bloquea el acceso:

¡Ouch, man!

Abrir la configuración de Opera desde:

Opera > Settings > Preferences...

Y luego acceder a la configuración del proxy desde la pestaña "Advanced > Network", utilizando el botón "Proxy Servers...":

Configurar el proxy SOCKS local ingresando la dirección IP "127.0.0.1" y el puerto especificado en el cliente SSH (en este ejemplo, el puerto 6666):

Ahora es posible navegar libremente cualquier sitio en Internet, por ejemplo páginas triple equis o de travestis artistas, tales como alexa.com:

Para minimizar el tráfico por el túnel SSH es recomendable usar dos navegadores, uno "liberado" configurado con el proxy SOCKS (por ejemplo Opera) para entrar a sitios filtrados, y otro configurado con el proxy corporativo para usar la mayoría del tiempo (por ejemplo Firefox).

Luchemos juntos por una Internet libre y abierta para todos.


Tal vez pueda interesarte


Compartí este artículo