A veces, queremos poder navegar o chatear por Internet pero no queremos que nadie pueda conocer, ni bloquear, las páginas que visitamos o espiar nuestras conversaciones, bien porque porque estamos en el trabajo, la universidad o en una red abierta. En la red a la que estamos conectados puede que utilicen un proxy para controlar y bloquear servicios. Este bloqueo podría ser por puerto o por protocolo.
Es posible que bloqueen algunas URLs, o IPs, pero seguramente tenemos acceso a la web, es decir, los puertos 80 y 443. Crearemos un túnel seguro para poder navegar seguros y evitar estas restricciones. Eso sí, puede que aparezca en algún log que nos hemos conectado a nuestra máquina remota.
Proxy SOCKS
Una manera de montar un túnel seguro es mediante un [proxy SOCKS][proxy SOCKS]. Aprovechamos el hecho de que el puerto 443 no está bloqueado.
En nuestro servidor remoto, podemos configurar openssh
para que
escuche en el puerto 443, añadiendo un Listen 443
al fichero
/etc/ssh/sshd_config
. Pero si ya tenemos un servidor web, por ejemplo
apache2
, que sirve conexiones seguras, podemos hacer uso de sslh
,
que permite que ambos servicios, SSL y SSH, compartan el puerto 443.
En nuestra máquina, lo primero que haremos será configurar ssh
para
que pueda pasar a través del proxy
maligno que nos obligan a usar,
mediante corkscrew
-está en los repositorios-. Editamos el fichero
~/.ssh/config
, y añadimos:
ProxyCommand /usr/local/bin/corkscrew proxy.evil.com 80 %h %p
En lugar de corkscrew
, podríamos utilizar proxytunnel
:
ProxyCommand proxytunnel -v -p proxy.evil.com:80 -r remotehost:443 -d %h:%p -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)\n"
Ahora ya podemos crear el proxy SOCKS desde nuestra máquina local:
$ ssh -f -N -D 1080 user@remotehost
Si no estamos obligados a utilizar un proxy, no hace falta que
editemos el fichero ~/.ssh/config
, y el proxy SOCKS se crea
ejecutando el mismo comando que acabamos de lanzar.
Sólo queda configurar alguna aplicación, por ejemplo Firefox. Vamos al
Menú Editar > Preferencias > Avanzado > Red > Configuración de la conexión > Configuración manual del proxy
y ponemos:
Servidor SOCKS: localhost
Puerto: 1080
Y listos.
SSH over HTTP-Proxy
Otra manera de hacerlo es a través de un proxy HTTP. En nuestra máquina remota, vamos a configurar Apache para que haga de proxy HTTP.
Activamos el módulo:
$ sudo a2enmod proxy_http
Podemos realizar la configuración a nivel de módulo o de VirtualHost.
Tener un proxy HTTP que redirija peticiones, mediante la directiva
ProxyRequests
, puede ser un peligro, dado que, mal configurado,
podría permitir que cualquiera accediera a través de nosotros ocultando
su identidad. Utilizar un proxy inverso, mediante la directiva
ProxyPass
y la directiva ProxyRequests Off
, es menos crítico, porque
los clientes sólo pueden conectar a los sitios que hemos configurado
específicamente.
Limitaremos el acceso para sólo permitirlo desde la propia máquina o
desde una conexión SSH. Editamos el fichero
/etc/apache2/mods-enabled/proxy.conf
:
Listen 889
ProxyRequests On
AllowCONNECT 22
ProxyVia On
Order deny,allow
Deny from all
Allow from 127.0.0.1
Por un lado, el proxy no está escucha en el puerto por defecto, el 8080, sino que lo hace en el 889. Además, este puerto no está abierto ni el firewall ni en el router. El motivo de este cambio de puerto es que en la máquina remota tenía instalado Varnish, que es un acelerador web, que puede ser utilizado tanto para cachear contenido estático, como para balancear la carga o para incrementar la seguridad de nuestro servidor web. Sin embargo, en este caso, esto no supondrá ningún problema.
Por otro, permitimos el método CONNECT al puerto 22, donde corre SSH, y permitimos el acceso únicamente desde la propia máquina. Una vez hechos los cambios, no olvidemos reiniciar el servidor web.
Ahora ya podemos crear el túnel desde nuestra máquina; redirigiremos el puerto remoto 889 a nuestro puerto local 8080, realizando la conexión por SSH en el puerto remoto 443:
$ ssh -L 8080:localhost:889 user@server.at.home -p 443
Igual que en el caso anterior, si tenemos que utilizar de forma
obligatoria el proxy maligno, editamos el fichero ~/.ssh/config
:
ProxyCommand /usr/local/bin/corkscrew proxy.evil.com 80 %h %p
Para configurar Firefox, vamos al Menú Editar > Preferencias > Avanzado > Red > Configuración de la conexión > Configuración manual del proxy y ponemos:
HTTP Proxy: localhost (Usar este servidor proxy para todos los protocolos)
Puerto: 8080
Si queremos configurar que se use el proxy desde el terminal, en
aquellos programas que utilizan la variable de entorno HTTP_PROXY
:
$ export HTTP_PROXY='http://localhost:8080/'
Y para quitarlo:
$ export HTTP_PROXY=''
Tanto desde Firefox como desde el terminal, podríamos haber puesto la IP, o el nombre, de un equipo remoto que tenga abierto un proxy HTTP.
Sin utilizar el método CONNECT
Si no podemos utilizar el método CONNECT para conectarnos al puerto 443 de nuestra máquina remota, podemos probar a cambiar de puerto, por si hubiera alguno permitido.
Si no encontramos ninguno, todavía podemos establecer un túnel
utilizando HTTP mediante httptunnel
-también está en los
repositorios-. Consta de dos programas, un cliente y un servidor. En
nuestra máquina remota, ejecutamos el servidor, redirigiendo el puerto
80 al 22. En este caso, si ya teníamos instalado Varnish, deberemos
utilizar otro puerto, y abrirlo en el firewall.
$ hts -F localhost:22 80
En nuestra máquina local ejecutaremos el cliente, que redirige el puerto local 8080 al puerto remoto 80, que a su vez es redirigido al puerto 22 remoto, utilizando el proxy maligno obligatorio de la red a la que nos conectamos:
$ htc -P proxy.evil.com:80 -F 8080 remotehost:80
Referencias
» SSH Through or Over Proxy » Accessing Trillian Pro Remotely and Through an Encrypted Tunnel » Using Corkscrew to tunnel SSH over HTTP » Tunneling SSH over HTTP(S) » Bypass Any Firewall » SSHThroughHTTPProxy » Tunneling SSH over an HTTP-Proxy Server » Apache Module mod_proxy