Tutorial configurar un proxy HTTP anónimo con Squid

En Software, Tutoriales y Guías, Webmasters por

Estos días me encontré con la necesidad de configurar un proxy HTTP anónimo con Squid para unos compañeros. El objetivo ademas de ocultar la IP era que todos pudiesen acceder con la misma IP a una página web para evitar bloqueos.

Tutorial configurar un proxy HTTP anónimo con Squid

La solución elegida fue Squid 3, que no es más que un servidor proxy cache. En artículos anteriores hablamos sobre cómo configurar proxy SOCKS, que son más flexibles pero en este caso necesitaba un proxy HTTP.

Ademas en este tutorial aprenderemos a configurar Squid 3 no sólo para que el proxy sea anónimo sino que ademas lo protegeremos con usuario y password para que no pueda acceder personas no autorizadas y también aprenderemos a limitar el acceso a determinadas páginas a través del proxy.

Cómo siempre el tutorial está probado bajo Ubuntu, en este caso fue la versión 12.04 x64 pero creo que es aplicable en cualquier versión superior de Ubuntu e incluso otras distribuciones Linux como CentOS o Debian. Recomiendo emplear un servidor VPS asequible y barato en el que hacer pruebas antes de poner el proxy a funcionar para el público.

¿Qué es Squid?

Squid es un proxy cache multiplataforma que ayuda a reducir los tiempos de respuesta. Es de código abierto y gratuito.
Con lo dicho hasta ahora parece algo muy similar a Varnish Cache del que ya hemos hablando, pero hay diferencias sustanciales entre ambos de las que no voy a hablar ahora, pero si decir que para el propósito de este artículo que es crear un proxy HTTP anónimo con autentificación, Squid es la mejor opción (con Varnish no se podría).

Instalar Squid 3 en Ubuntu paso a paso

La instalación de Squid en Ubuntu es muy sencilla, ejecutamos el siguiente comando:
apt-get install squid3 apache2-utils

El paquete apache2-utils lo necesitamos porque usamos la herramienta htdigest para crear los usuarios para nuestro proxy anónimo con Squid.

Con esto ya tenemos Squid 3 instalado y funcionando, ahora viene el paso más temido, la configuración de Squid. Lo mostraremos de forma sencilla y paso a paso, pero n oesta de más tener la documentación de Squid a mano.

Configurar Squid 3 como proxy anónimo de forma fácil

El archivo de configuración por defecto de Squid 3 viene con un montón de texto e incluso se hace interminable su lectura. No recomiendo eliminarlo, pero si conservarlo con otro nombre por si necesitamos consultarlo, para esto ejecutamos el comando:
mv /etc/squid3/squid.conf /etc/squid3/squid.conf.bak

Una vez hecho esto paramos Squid con el comando:
service squid3 stop

Ahora crearemos un archivo de configuración nuevo para nuestro proxy anónimo que ademas requerirá de usuario y password para poder ser utilizado. Lo primero es ejecutar nano para crear el archivo con el siguiente comando:
nano /etc/squid3/squid.conf

El contenido del archivo de configuración es el siguiente:

auth_param digest program /usr/lib/squid3/digest_pw_auth -c /etc/squid3/password
auth_param digest realm proxy
acl authenticated proxy_auth REQUIRED
acl whitelist dstdomain .google.com .googleapis.com .geotrust.com
http_access allow authenticated whitelist
http_access deny all
http_port 3528

#Safe ports
acl SSL_ports port 443          # https
acl SSL_ports port 563          # snews
acl SSL_ports port 873          # rsync
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 631         # cups
acl Safe_ports port 873         # rsync
acl Safe_ports port 901         # SWAT

#Anonymous proxy
via off
forwarded_for off
request_header_access Allow allow all
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access User-Agent allow all
request_header_access Cookie allow all
request_header_access All deny all

Ahora iremos comentado detenidamente las diferentes partes. La primera línea:

auth_param digest program /usr/lib/squid3/digest_pw_auth -c /etc/squid3/password

Indica el programa de autentificación y con el parámetro -c se indica la localización del archivo que contiene los passwords de usuario.

La segunda línea:

auth_param digest realm proxy

Indica el nombre que será enviado al cliente para la autentificación del proxy, en nuestro caso he elegido el nombre “proxy”.

La tercera linea:

acl authenticated proxy_auth REQUIRED

Es una directiva que obliga a que el usuario esté autentificado para usar el proxy.

Ahora vienen tres lineas que forman el apartado de restringir webs:

acl whitelist dstdomain .google.com .googleapis.com .geotrust.com
http_access allow authenticated whitelist
http_access deny all

Vemos que en la primera linea creamos la lista de dominios permitidos con la opción dstdomain y llamamos a esta lista whitelist. La siguiente línea indica que permite acceso a authenticated (esto viene de las lineas anteriores donde hablábamos de la autentificación de los usuarios) y a whitelist.
Y la última línea indica que el resto que no cumpla las condicione previas no tendrá acceso.

Dentro de este grupo de configuraciones encontramos la línea:

http_port 3528

Nos define el puerto de nuestro proxy HTTP.

El apartado #Safe ports es descriptivo, sencillamente indica que puertos son seguros para el uso del proxy. El apartado #Anonymous proxy ya es más interesante, en él se establecen que cabeceras envía el proxy. Es muy importante prestar atención a las que se especifican como inactivas con “off” o las que se deniega su uso con “All deny all”, en nuestro caso son las líneas:

via off
forwarded_for off
...
request_header_access All deny all

Hay que deshabilitar estas cabeceras porque muestran nuestra IP real y queremos que el proxy sea anónimo. Las demás cabeceras se mantienen activas porque no revelan nuestra IP.

Cómo agregar usuarios al proxy HTTP anónimo con Squid

El proxy está configurado, pero necesitamos agregar al menos un usuario para poder usarlo. El procedimiento es muy sencillo, ejecutamos el comando:
htdigest -c /etc/squid3/passwords proxy usuario1

En este comando donde pone “proxy” se refiere al nombre realm, del que hablamos en la linea segunda del archivo de configuración. Como usamos como nombre “proxy”, a la hora de agregar usuarios habrá que emplear también el realm de nombre “proxy”. Donde pone usuario1, ahí colocamos el nombre de usuario. Después de ejecutar el comando nos pedirá que introduzcamos el password dos veces.

Cómo configurar un proxy HTTP anónimo en FireFox

Muchos os preguntareis como configurar en FireFox este proxy HTTP con usuario y password, porque en las opciones de red de FireFox sólo nos deja usar proxy HTTP que no necesitan autentificación. La solución más sencilla es emplear un plugin para FireFox que se llama FoxyProxy, este si permite usar proxy HTTP con autentificación de usuario y password.