Introducción a Squid

per Victor Carceler darrera modificació 2021-11-22T11:07:06+02:00

Squid-logo.webpSquid es un conocido proxy-cache para los protocolos HTTP y HTTPS. Soporta diferentes modos de funcionamiento y cuenta con muchas características pero aquí únicamente se va a exponer una pequeña introducción a sus funciones básicas.

Instalación y configuración básica

root@buran:~# apt update
root@buran:~# apt install squid

La instalación ya incluye un fichero de configuración funcional (/etc/squid/squid.conf) en el que únicamente es necesario ajustar algunos detalles.

  1. La directiva http_port: Sirve para indicar el puerto en el que Squid aceptará peticiones, por defecto tiene el valor 3128 aunque nosotros solemos configurar el puerto 8080 (que según /etc/services corresponde a http-alt).
  2. La directiva cache_dir: Que tiene por objeto indicar el directorio que se utilizará para almacenar la cache en disco, su tamaño máximo y su tipo. Pueden utilizarse varias directivas cache_dir para que Squid gestione diferentes caches repartiendo la carga entre todas. Por defecto en las versiones actuales viene desactivada la cache en disco.
  3. La directiva cache_mem. Que indica la cantidad de memoria principal que Squid utilizará para cachear objetos. El valor por defecto es 256 MB y este valor se puede ajustar en función de las características de la máquina. Por supuesto aumentar su tamaño aumentará las opciones de obtener aciertos de cache (cache hit), pero nunca se debe aplicar hasta el punto que la máquina se vea obligada a utilizar memoria virtual.
  4. La directiva shutdown_lifetime. Por defecto tiene un valor de 30 segundos y demora el apagado del proxy. Cuando se está realizando la configuración y se quiere reiniciar el proxy con mayor velocidad conviene cambiar el valor a 1 segundo.

ACLs y control de acceso

El sistema de control de acceso de Squid está basado en ACLs. Es muy flexible y completo pero conviene tener claros algunos conceptos para poder utilizarlo.

Según nos informa la propia sección de la documentación de Squid relacionada con el control de acceso, se utilizan dos elementos:

  • Elementos ACL: especifican la concordancia con alguna propiedad de las peticiones que se realizan al proxy. Por ejemplo, la dirección IP del cliente (src), o el dominio de destino (dstdomain). Hay diferentes tipos que se pueden utilizar, su listado y descripción se encuentra al consultar la documentación de la directiva acl.
  • Listas de acceso: Consisten en una acción allow o deny seguida de uno o varios elementos ACL.

Cuando Squid arranca se carga en memoria la configuración a utilizar y se tiene en cuenta para permitir o denegar el acceso a cada petición. En este sentido es muy importante observar que las listas de acceso tienen orden y cada petición se valida con cada una de ellas hasta encontrar una coincidencia. Momento en el que se permite o deniega ignorando las siguientes listas de acceso.

Atención: Cuando una petición llega a la última lista de acceso sin que se haya producido una coincidencia, entonces la acción por defecto que se aplica a la solicitud es lo contrario de lo que especifique la última lista de acceso. Por eso normalmente se recomienda incluir como última lista de acceso algo explícito como http_access deny all.

Ejemplo:

acl SSL_ports port 443
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 CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager

http_access allow localhost


# And finally deny all other access to this proxy
http_access deny all


Las líneas acl corresponden a definiciones de elementos ACL. Conviene observar que se combinan con la operación lógica OR, de manera que el elemento Safe_ports coincide con peticiones que se dirijan a alguno de estos puertos: 80, 21, 443, 70, 210, 1025-65535, 280, 488, 591, 777.

Las líneas http_access <deny|allow> corresponden a listas ACL. Indican una acción (permitir o denegar) y utilizan la operación lógica AND para combinar sus elementos cuando son múltiples.

Es decir, la línea:

http_access deny CONNECT !SSL_ports

Deniega el acceso a aquellas solicitudes que coinciden con el elemento CONNECT Y no coincidan con el elemento SSL_Ports.

Para permitir el acceso a los clientes que se encuentran en la LAN del centro, es necesario descomentar la línea:

acl localnet src 192.168.0.0/16    # RFC1918 possible internal network

Y después permitir el acceso a los clientes locales:

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

http_access allow localnet

Convertir el timestamp del fichero de registro de Squid en otro formato

El fichero de registro para los accesos a Squid (/var/log/squid/access.log) guarda un timestamp para cada petición en formato: <unix timestamp>.<centésimas de segundo>.

Si se desea visualizar la marca temporal de cada acceso en otro formato, se puede emplear:

cat access.log | perl -p -e 's/^([0-9]*)/"[".localtime($1)."]"/e'


Squid como proxy transparente

El modo transparente permite que los navegadores utilicen el proxy de manera automática aún cuando no han sido configurados para ello. Únicamente funciona para el protocolo HTTP, con el protocolo HTTPS debe configurarse de manera explícita el uso del proxy o bien utilizar técnicas que comprometen la confidencialidad extremo a extremo.

Montar un proxy transparente para HTTP implica:

  1. Tener acceso a la puerta de enlace que utilizan los clientes para acceder a Internet.
  2. En dicha puerta de enlace, utilizar iptables para redirigir las peticiones que tienen por destino el puerto TCP 80 a Squid.
  3. Haber configurado en Squid un puerto de escucha en modo transparente.

De este modo, cuando los ordenadores de los clientes creen estar accediendo a los servidores web en realidad están alcanzando Squid, que sigilosamente tramita sus peticiones.

Así es que, se puede configurar Squid para que escuche en dos puertos. El 8080 en modo explícito (para configurar en los navegadores) y el 3128 en modo transparente.

http_port 8080
http_port 3128 transparent

Después, en la puerta de enlace será necesario activar el reenvío de paquetes (por ejemplo en /etc/sysctl.conf) y utilizar una regla de iptables para redirigir el tráfico. Por ejemplo, para redirigir el tráfico que entra por alguna interfaz eth, y tiene por destino el puerto 80 TCP de alguna máquina que no está en nuestra red podemos hacer:

iptables -t nat -A PREROUTING -i eth+ ! -d 192.168.0.0/255.255.0.0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Más información: