Skip to main content

Tunel HTTP a través de un proxy

Posted in

Siguiendo con el artículo sobre tunel DNS, hoy explicaré como hacer un tunel HTTP a través de un proxy. Es común que en algunos sitios como: universidades, colegios, oficinas, etc... Nos restringen la conexión a internet, limitándonos a utilizar sólo protocolos HTTP (puertos 80 y 443), y también prohibiendo la entrada en algunos sitios web. Además, nuestro tráfico es monitorizado y almacenado en logs, lo que viene a ser una molestia bastante importante.

Para saltarnos estas restricciones, veremos dos opciones distintas: httpTunnel y CorkScrew. En ambos casos es necesario disponer de un servidor a internet para que haga de puente.


HttpTunnel

El concepto quizás sea un poco complicado de entender, así que he hecho el siguiente gráfico para que sea más fácil:

Suponemos lo siguiente:

  1. El servidor proxy tiene la IP: 192.168.0.1
  2. Sólo permite el tráfico HTTP por los puertos 80 y 443
  3. Nuestro servidor "puente" tiene la IP: 1.2.3.4
  4. En nuestro servidor puente hay un ssh en el puerto 22
  5. Tenemos httptunnel instalado en ambas máquinas (aptitude install httptunnel)

Lo que vamos a hacer, es utilizar hts (httptunnel server), en nuestro servidor para que escuche el puerto 443 (HTTPs) y redireccione el tráfico al puerto 22 (SSH). De esta manera nos podremos conectar a él mediante protocolo SSH, lo que nos dá libertad suficiente como para crear un socks5 o tunel SSH, y acceder libremente a internet.

Nota: utilitzamos el puerto 443 para que parezca menos sospechoso, pero también serviria el puerto 80

El servidor puente

Tenemos que dejar el servidor puente preparado, para podernos conectar cuando nos convenga.

hts -F 1.2.3.4:22 443 -c 10M

Ahora tendremos un servicio escuchando en el puerto 443, lo comprobamos:

netstat -antp
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      32618/hts

Bién, todo listo en el servidor.

Nuestro PC (cliente)

Pues ahora nos encontramos conectados con nuestro PC, en la red donde está el servidor proxy. Tenemos que ejecutar htc (httptunnel client) para que conecte con el servidor mediante el puerto 443.

htc -P 192.168.0.1:80 -U "Mozilla/5.0 (Linux; U; Linux mola 2010; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6" 1.2.3.4:443 -F 2222 -c 10M

Si el proxy requiere autenticación, podemos usar el parámetro:

-A USUARIO:PASSWORD

Si todo va bién, ahora en nuestro PC tenemos un servicio escuchando en el puerto 2222

netstat -antp
tcp        0      0 0.0.0.0:2222            0.0.0.0:*               ESCUCHAR    9996/htc

Si nos conectamos a este puerto, estaremos conectándonos al puerto 22 del servidor puente, lo probamos:

ssh root@localhost -p 2222

Si entramos en el servidor, todo ha funcionado correctamente!
Ahora, con una conexió ssh hacia fuera, podemos hacer lo que queramos, por ejemplo un proxy SOCKS5 en el puerto 8888:

ssh -fND localhost:8888 root@localhost -p 2222

También podriamos configurar una VPN mediante SSH, proximamente, en otro artículo, explicaré como hacerlo.

Nota: Yo he conseguido rates de 800KiB/s, no está nada mal


CorkScrew

El segundo método, es mediante el software CorkScrew. Si hemos entendido el anterior, este nos parecerá un juego de niños. Lo único que hace corkscrew es encapsularnos el tráfico en el protocolo HTTP, lo utilizaremos como proxy. Suponemos que nos encontramos en el escenario anterior. Vamos allá!

El servidor puente

Corkscrew no redirecciona el tráfico. Entonces necesitamos que nuestro servidor ssh esté corriendo en el puerto 443 (o cualquier otro permitido por el proxy). Para ello, podemos utilizar esta simple regla de iptables:

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 22

Nuestro PC (cliente)

Simplemente necesitamos ejecutar ssh con corkscrew como proxy

ssh root@1.2.3.4 -p 443 -o ProxyCommand="corkscrew 192.168.0.1 80 %h %p"

Fácil, no? también podemos crear el tunel SOCKS5:

ssh -fND localhost:8888 root@1.2.3.4 -p 443 -o ProxyCommand="corkscrew 192.168.0.1 80 %h %p"

Podemos usar un alias para no tener que teclear tanto:

alias ssh_proxy='ssh -lroot -p443 -oProxyCommand="corkscrew 192.168.0.1 80 %h %p" '
ssh_proxy 1.2.3.4

Si necesitamos autenticación en el servidor proxy:

echo "USUARIO:PASSWORD" > ~/.proxy_pass
ssh root@1.2.3.4 -p 443 -o ProxyCommand="corkscrew 192.168.0.1 80 %h %p ~/.proxy_pass"

Enlaces de interés