Existen momentos que necesitamos acceder a páginas web con ciertos parámetros, o con varios usuarios y en estos casos un proxy HTTP es una buena solución.
Montar un proxy HTTP para tu navegación web es muy sencillo en un servidor con Ubuntu/Debian, y con el servidor que contratamos con Ramnode será muy fácil realizar la instalación.
En nuestro servidor de pruebas la configuración de un proxy nos permitirá navegar con su IP y poder acceder a servicios asociados al país de esa IP. Aunque nuestro servidor de pruebas tiene instalado Debian, y este manual está pensado para Ubuntu lo pasos a seguir van a ser tan parecidos que no te costará instalarlo en Debian.
La diferencia de utilizar un tunel OpenVPN respecto a un proxy, es que no necesitarás que todo el sistema operativo funcione con esa IP, sino que podrás configurar un navegador para que funcione con la IP del servidor y el resto del sistema funcione con tu prooveedor de internet.
1. ¿Qué es Squid?
Squid es un programa que te permite realizar un proxy/caché con una gran variedad de configuraciones y usos. En este artículo vamos a ver Squid como un proxy HTTP. Al usar una caché también consigue reducir el ancho de banda y los tiempo de respuesta gracias a su caché, y reutilizando las páginas web solicitadas con más frecuencia.
Con Squid puedes conseguir control de acceso, y es excelente para acelerar un servidor, ya que funciona como caché de las páginas que ofrece el servidor.
También vamos a ver en la última parte como crear un tráfico anónimo desde el proxy hacia internet de tal manera que tu dirección IP no se enviará en el encabezado X-Forwarded-For header. Ten en cuenta que el tráfico no estará encriptado, por lo que será visible en tu red local.
Si quieres saber más sobre la configuración de squid aquí: http://www.squid-cache.org.
2. Instalar Squid en Ubuntu
Squid está disponible en los repositorios de Ubuntu. Primero actualizaremos el sistema y luego instalaremos Squid con los siguientes comandos:
sudo apt-get update sudo apt-get upgrade sudo apt-get install squid
3. Configurar Squid
En la configuración de Squid veremos apartados que pueden ser interesantes para tu configuración, pero para el objetivo del proxy que voy a montar algunas configuraciones no son necesarias.
Así que vamos a verlas para que puedas decidir cuales te son útiles.
Crear el archivo de configuración
Como he dicho anteriormente las opciones de Squid son muy numerosas, por eso el archivo de configuración tiene casi 5000 líneas, por eso tiene tanta versatilidad. Como voy a configurar un sencillo proxy HTTP la mayoría no me interesa, por lo que voy a hacer una copia y quedarme con las opciones por defecto.
Hacemos un backup de la configuración por defecto:
sudo mv /etc/squid/squid.conf /etc/squid/squid.conf.bkp
Para quedarnos con lo importante, creamos una nuevo archivo de configuración que incluyan las líneas por defecto, eliminando el resto de líneas que están comentadas, y que se refieren a la documentación o a opciones que no están activas.
Ejecutamos el siguiente comando:
grep -Eiv '(^#|^$)' /etc/squid/squid.conf.bkp > /etc/squid/squid.conf
Con esto ya tendríamos la configuración básica para configurar los parámetros que nos interesen.
ACLs y control de acceso
Squid tiene un sistema para permitir el acceso con una configuración basada en ACL’s, y según la documentación de Squid, se utilizan dos elementos:
- Elementos ACL, definen alguna propiedad de las peticiones que se realizan al proxy. Por ejemplo, si el cliente tiene una IP (src), o incluso un dominio podemos permitir o denegar su acceso desde el archivo de configuración. También podemos permitir o bloquear los puertos de salida para que solo sea posible utilizar un protocolo que establezcamos. Aquí se encuentra la documentación de acl.
- Listas de acceso: Estas consisten en una acción para permitir (allow) o denegar (deny) seguida de uno o varios elementos ACL.
Para que veas un ejemplo, si quieres permitir el acceso desde tu IP, por ejemplo 111.11.11.11 lo escribes de esta manera:
acl localnet src 111.11.11.11 # Tu Servidor IP http_access allow localnet
La primera línea crea un acl (access control list) con el nombre localnet que identifica la conexión, src es la fuente, y la IP corresponde a la de tu ordendor. Luego tenemos la directiva http_access que nos permite/deniega esa conexión que hemos identificado.
Si tuviéramos una red local podríamos configurarlo con la siguiente directiva:
acl localnet src 10.0.0.0/8
Permitiría todos los accesos desde la LAN 10.0.0.0/8.
Si tu IP es estática, sería tan fácil como poner la regla con tu IP:
acl localnet src 1.2.3.4
En el caso de que sea dinámica, la mejor solución es abrir un rango de IPs, así sería mucho menos inseguro que dejarlo abierto. Para abrir un rango de 1.2.3.0 to 1.2.3.254 tendrías que definirlo así:
acl localnet src 1.2.3.0/24
Y como en el ejemplo anterior, añadiríamos las lístas de acceso que nos permiten conectarnos a Squid:
http_access allow localhost http_access allow localnet
También podríamos permitir una lista de IP’s definiéndolas en un archivo de texto, para eso crearíamos un archivo con las distintas IPs:
nano /etc/squid/allowed_ips.txt xx.xx.xx.1 xx.xx.xx.2 xx.xx.xx.3 xx.xx.xx.4
Y por último definiríamos este archivo en la configuración de Squid:
# Clientes Permitidos acl allowed_ips src "/etc/squid/allowed_ips.txt" http_access allow allowed_ips
Con esto ya tendríamos definido los accesos a Squid, y este simplemente cargaría la configuración a usar en memoria para denegar o permitir cada petición.
NOTA: Cada petición se comprueba si pertenece a la lista de acceso y si no se produce ninguna coincidencia, la acción que se aplica por defecto es lo contrario de la última lista de acceso, así que para asegurarnos que nadie se cuele, si hemos definido listas de acceso añadir lo siguiente al final del archivo de configuración:
# And finally deny all other access to this proxy http_access deny all
En la configuración por defecto nos aparece la siguiente línea:
http_access deny CONNECT !SSL_ports
Que quiere decir que deniega el acceso a aquellas solicitudes que coinciden con el elemento CONNECT y no coincidan con el elemento SSL_Ports.
En nuestro caso como queremos un proxy abierto con usuario y clave, vamos a permitir el acceso a todo el mundo, añadiríamos la siguiente instrucción:
http_access allow
Cambiar el puerto de acceso
Por razones de seguridad yo prefiero no usar el puerto por defecto, y cambiarlo por otro cuando sea posible. Para cambiarlo tienes que buscar la línea siguiente y poner el puerto que te interese:
http_port 8888
En este ejemplo he puesto el puerto 8888 en vez del 3128 que es el que viene por defecto, cualquier puerto > 1024 será válido.
Limitar número de accesos
Otra opción que puede ser interesante es limitar el uso simultaneo de accesos al proxy para limitar la conexión, si quisiéramos limitar a tres conexiones utilizaríamos esta opción:
acl maxuserconnections maxconn 3
Nombre del proxy
Anque yo no lo usaré, podemos confiugurar un nombre para el servidor proxy. Este Hostname puede ser cualquier nombre ya que Squid te lo permite, por defecto es localhost. Encuentra la opción visible_hostname, o añadela, con el nombre que quieras a continuación:
visible_hostname UbuntuServer
Caché de Squid
Squid tiene varias opciones para configurar la caché y es interesante saber cuales son y cómo podemos configurarlas.
Opción cache_dir. Esta opción se utiliza para establecer el tamaño que queremos que use Squid del disco duro. De modo predeterminado se utiliza el formato ufs y se crea un directorio /var/spool/squid una caché de 100MB, que se divide en jerarquías de 16 directorios subordinados, hasta en 256 niveles cada uno.
Una configuración podría ser esta:
cache_dir ufs /var/spool/squid 100 16 256
También puedes aumentar el tamaño de la caché, y cuanto más grande sea más objetos se almacenarán en esta, así se consumirá menos ancho de banda. Para una caché de 2GB la configuración sería la siguiente:
cache_dir ufs /var/spool/squid 2048 16 256
A veces el formato de caché ufs puede llegar a bloquear en Squid operaciones de entrada/salida sobre el sistema de archivos cuando se conectan muchos clientes. Para evitar esta situación, es recomendable utilizar el sistema asíncrono aufs que consigue un mejor desempeño:
cache_dir aufs /var/spool/squid 2048 16 256
Opción maximum_object_size. Con esta opción definimos el tamaño máximo de los objetos que se guardan en la caché. Es recomendable utilizarla con alta carga de trabajo, ya que evita el guardar objetos en la caché de gran tamaño, que lo más probable es que sean aprovechados solo por unos pocos usuarios, por lo que se optimiza la caché con objetos pequeños que generarían una gran cantidad de peticiones hacia las webs y se sospecharía del proxy.
Para una caché con límite de objetos de 48MB sería lo siguiente:
maximum_object_size 48 MB
Opciones para la caché cache_swap_low y cache_swap_high. Cada vez que se llene la caché se puede automatizar la limpieza de esta cuando llegue a cierta cantidad. cache_swap_low establece el porcentaje a partir del cual se comenzará a limpiar la caché, y cache_swap_high establece el porcentaje en la que se limpiará la caché de manera agresiva. Para una caché que se empieza a limpiar al 90% y de manera agresiva al 95%:
cache_swap_low 90 cache_swap_high 95
Con este ejemplo la caché se limpia automáticamente, y es recomendable cuando hay muchos usuarios usando el proxy.
Algoritmos de uso de caché con cache_replacement_policy. Esta opción soporta los siguientes algoritmos para la caché:
LRU | Acrónimo de Least Recently Used, y los objetos que fueron accedidos hace mucho tiempo son eliminados primero. Ésta política es la utilizada por Squid de modo predeterminado |
LFUDA | Acrónimo de Least Frequently Used with Dynamic Aging, en el que los objetos más solicitados permanecen en la caché sin importar su tamaño, de modo que un objeto grande que se solicite con mayor frecuencia impedirá que se pueda hacer caché de objetos pequeños que se soliciten con menor frecuencia. |
GSDF | Acrónimo de GreedyDual Size Frequency, el cual optimiza la eficiencia por objeto manteniendo en la caché los objetos pequeños más frecuentemente solicitados. |
El algoritmo recomendado y que desempeña mejor rendimiento con alta carga de trabajo es LFUDA, la directiva a incluir en el archivo de Squid sería:
cache_replacement_policy heap LFUDA
La caché tiene una memoria para los objetos en tránsito, y esta se establece con la opción cache_mem, y estable la cantidad ideal necesaria de memoria para las siguientes situaciones:
- Objetos en tránsito.
- Objetos frecuentemente utilizados (hot)
- Objetos negativamente almacenados en la caché.
Los datos de estos objetos se almacenan en objetos de 4kb y esta opción especifíca el límite máximo en tamaño de los bloques, donde los objetos en tránsito tienen mayor prioridad. Los objetos frecuentemente usados y aquellos negativamente almacenados, no tienen esta limitación.
Así que en la versión Squid 3, se establecen 256MB, que es más que de sobra para pocos usuarios, pero en redes de muchos usuarios, el rendimiento se mejora con una cantidada menor. Para un límite de 48MB la configuración es la siguiente:
cache_mem 48 MB
Cómo borrar la caché
En algunos casos puede que se nos llene la caché o necesitemos borrarla por lo tanto tendremos que seguir los siguientes pasos:
Saber donde se encuentra el directorio de la cache con el siguiente comando:
grep cache_dir /etc/squid/squid.conf
El resultado será algo así:
cache_dir ufs /var/spool/squid 100 16 256
Luego apagamos squid para borrar la caché:
sudo squid -k shutdown
Con los siguientes comandos borramos el directorio de la caché:
sudo rm -rf /var/spool/squid/*
Si hubiese más directorios de caché repetiríamos el anterior comando para cada directorio.
Al haber borrado el directorio tendríamos que volver a crearlo con permisos de acceso para squid:
mkdir /var/spool/squid chown squid:squid /var/spool/squid
Y por último recrearíamos el directorio de la caché con el siguiente comando:
squid -zN
Con esto ya habríamos borrado la caché de squid.
Acceso por usuario y clave
Aunque permitamos el acceso por IP, en mi caso me interesa más crear un accceso por usuario y contraseña, para el proxy que voy a configurar. Vamos a usar la autorización «ncsa_auth» que permitirá a Squid leer y autentificar la información de usuario y contraseña usando un archivo de claves con formato NCSA http-style, cuando se acceda usando una atentificación básica de HTTP.
Lo primero que necesitamos es instalar la utilidad htpasswd de las herramientas de Apache. Para instalar estas herramientas escribimos el siguiente comando:
sudo apt-get install apache2-utils
El siguiente paso va ser crear el archivo donde vamos a guardar los usuarios y contraseñas y luego cambiar el propietario para que lo pueda abrir squid:
sudo touch /etc/squid/squid_passwd sudo chown proxy /etc/squid/squid_passwd
Luego creamos el usuario y password:
sudo htpasswd -c /etc/squid/squid_passwd <strong>user1</strong>
El argumento ‘-c’ en el comando «htpasswd» forzará a usar la encriptación CRYPT para las claves. Cambia user1 por el usuario que va a tener acceso al proxy, y te saldrá la introducción de la clave:
New password: Re-type new password: Adding password for user user1
Podrás repetir este paso para cada vez que quieras añadir un usuario de acceso al proxy.
Por último solo nos quedará abrir el archivo de configuración de Squid y añadir las siguientes líneas:
nano /etc/squid/squid.conf
Y añade estas líneas:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid_passwd auth_param basic realm proxy acl authenticated proxy_auth REQUIRED http_access allow authenticated
Guarda y cierra el archivo de configuración.
Si por alguna razón quieres eliminar un usuario de acceso al proxy, deberás borrar la entrada del archivo squid_passwd donde aparezca ese usuario. En el archivo cada usuario aparece en el formato `user:passwordhash`. Con el editor nano puedes borrar la línea donde se encuentre el cursor con el comando Ctrl+k.
Navegación anónima
Por defecto Squid reenvía la IP del cliente que está conectado al proxy hacia el sitio web solicitado, pero para configurar de manera anónima hay que desactivar esta función y ocultar las IP’s de los clientes para mostrar la dirección IP que tenemos configurada en el servidor de Squid.
Para enmascarar las IP de los que se conectan, lo primero es encontrar la siguiente línea en el archivo de configuración:
forwarded_for on
Y la cambias por:
forwarded_for off
Luego agregamos después las siguientes líneas al archivo de configuración de Squid:
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
Una vez que has guardado el archivo de configuración, reinicia Squid y se aplicará la configuración que has guardado. Ejecuta en la consola lo siguiente para reiniciar:
sudo service squid restart
Logs de Acceso
Para finalizar puedes consultar los archivos de logs, y si te ocurre a algún error o si quieres saber qué sitios web están siendo visitados por personas que se conectan al proxy, puedes utilizar estos registros que estarán en el directorio /var/log/squid:
more /var/log/squid/access.log more /var/log/squid/cache.log
También podrías cambiar la ubicación de tus archivos de logs, cambiando la el directorio en el archivo de configuración de Squid.
Convertir el timestamp del fichero de registro de Squid en otro formato
Una de las cosas que tiene el fichero de registro (el de logs en /var/log/squid/access.log) es que cuando realizamos una petición a una web, guarda la fecha y hora (el timestamp) en el siguiente formato: <unix timestamp>.<centésimas de segundo>.
Esto es complicado de leer, por lo que puedes cambiarle el formato del timestamp a otro que es legible con el siguiente comando:
cat access.log | perl -p -e 's/^([0-9]*)/"[".localtime($1)."]"/e'
4. Comprobar que todo funciona
Listo!!
Con esto ya tendríamos configurado nuestro proxy con Squid, solo nos faltaría configurar nuestro navegador con el usuario y la clave que hemos creado. En firefox sería en Editar -> Preferencias -> General -> Proxy de red y solo tendrías que poner la IP el puerto que has configurado en Squid. La contraseña y la clave te la pedirá al conectarte.
Si por alguna razón algo no funciona, primero tenemos que comprobar que Squid está escuchando en el puerto que hemos configurado. En la línea de comandos del servidor, para saber si escucha en el puerto 3128 escribiríamos:
sudo netstat -plunt | grep 3128 tcp6 0 0 :::3128 :::* LISTEN 2185/squid3
También puedes hacer una prueba, haciendo una solicitud de página web al proxy para ver la respuesta que obtienes. Simplemente en la consola escribe:
curl -I IP:PUERTO HTTP/1.1 200 OK ... X-Cache: MISS from localhost.localdomain X-Cache-Lookup: MISS from localhost.localdomain:3129 Via: 1.1 localhost.localdomain (squid/3.5.12) ...
Una vez que puedas acceder y todo esté correcto, podrás monitorizar el acceso que tienen tus usarios al servidor proxy. Con el siguiente comando de servidor verás el resultado:
sudo tail -f /var/log/squid/access.log RECT/173.194.126.55 text/html 1409354804.372 1073 192.168.0.1 TCP_MISS/200 776 GET http://xml.alexa.com/data? proxyuser1 HIER_DIRECT/23.21.109.107 text/xml 1409354842.754 963 192.168.0.1 TCP_MISS/200 2285 POST http://sd.symcd.com/ proxyuser1 HIER_DIRECT/23.51.43.27 application/ocsp-response 1409354843.234 1489 192.168.0.1 TCP_MISS/200 915 POS
Ya solo te quedará visitar whatismyip y verás que estás accediendo con la IP de tu servidor linux.
VestaCP y Squid
Puede que te haya pasado como a mi, que con todo configurado no has sido capaz de hacer funcionar el Proxy.
Esto suele pasar cuando tienes un firewall en tu servidor linux y simplemente no has abierto el puerto para poder conectarte.
VestaCP configura un firewall y es necesario abrirlo para que tu proxy funcione correctamente.
Puedes ver en el artículo de configuración de vestacp, cómo abrir el puerto que has configurado en el proxy para que te funcione.
Conclusión
Con este manual tan completo vas a poder crear un proxy, y poder manejar Squid con soltura.
También con este servidor por 15$/año, tendrás un entorno de pruebas perfecto para configurar un proxy como este.
Y por si este manual te ha parecido poco, te recomiendo esta web donde explica en detalle más opciones de Squid.
Con esto ya podrás navegar con tu proxy y tendrás más posibilidades a tu alcance que con tu conexión habitual.
Deja una respuesta