--- title: "Configuración avanzada de caché Squid en Ubuntu 24.04" description: "Configura Squid en Ubuntu 24.04 como proxy con caché en disco y memoria, reglas ACL por red y horario, autenticación de usuarios y comprobación de aciertos." category: "Caché y CDN" language: es source: https://cubepath.com/es/docs/caché-y-cdn/configuracion-avanzada-de-cache-squid updated: 2026-09-25 --- # Configuración avanzada de caché Squid en Ubuntu 24.04 Squid es un proxy HTTP con caché que lleva décadas usándose para controlar el acceso a internet de una red y ahorrar ancho de banda guardando las respuestas más pedidas. En este tutorial instalarás Squid en Ubuntu 24.04, le darás una caché en disco y en memoria bien dimensionada, restringirás quién puede usarlo con ACL, añadirás autenticación por usuario y contraseña y comprobarás que la caché devuelve aciertos. ## Requisitos previos - Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM. - Unos 10 GB libres en disco para la caché. - Un usuario no root con privilegios `sudo`. - La dirección IP o el rango de red desde el que se conectarán los clientes al proxy. En esta guía se usa `203.0.113.0/24` como ejemplo: sustitúyelo por **tu_red**. > Importante: un proxy abierto a todo internet se convierte en pocas horas en un relé de spam y abusos. Limita siempre el acceso por IP y, si es posible, también con usuario y contraseña, como se hace en esta guía. ## Paso 1: Instalar Squid Ubuntu 24.04 incluye Squid 6 en sus repositorios. Instálalo junto con `apache2-utils`, que aporta la utilidad `htpasswd` que usarás más adelante para crear usuarios: ```bash sudo apt update sudo apt install squid apache2-utils ``` El servicio arranca automáticamente. Comprueba la versión y el estado: ```bash squid -v | head -n 1 sudo systemctl status squid --no-pager ``` ```output Squid Cache: Version 6.x ● squid.service - Squid Web Proxy Server Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; preset: enabled) Active: active (running) ``` Por defecto Squid escucha en el puerto `3128` y solo acepta peticiones desde el propio servidor. ## Paso 2: Entender dónde va la configuración El archivo principal es `/etc/squid/squid.conf`, muy largo y lleno de comentarios. En Ubuntu ese archivo incluye todos los `*.conf` de `/etc/squid/conf.d/` justo antes de las reglas finales `http_access allow localhost` y `http_access deny all`. Por eso lo más limpio es no tocar `squid.conf` y poner tu configuración en un archivo propio dentro de `conf.d`. Comprueba que la línea `include` está presente: ```bash grep -n '^include' /etc/squid/squid.conf ``` ```output include /etc/squid/conf.d/*.conf ``` Squid evalúa las reglas `http_access` en orden y se queda con la primera que coincide, así que el orden de las líneas en tu archivo importa. ## Paso 3: Configurar la caché Crea el archivo de configuración de la caché: ```bash sudo nano /etc/squid/conf.d/10-cache.conf ``` Añade este contenido: ```ini # Caché en disco: tipo, ruta, tamaño en MB, directorios de nivel 1 y 2 cache_dir ufs /var/spool/squid 8000 16 256 # Tamaño máximo de un objeto guardado en disco maximum_object_size 512 MB # Memoria RAM dedicada a los objetos más usados cache_mem 512 MB maximum_object_size_in_memory 4 MB # Política de reemplazo: prioriza objetos pequeños y muy pedidos cache_replacement_policy heap LFUDA memory_replacement_policy heap GDSF # Tiempo de frescura según tipo de archivo: min (minutos), porcentaje, max (minutos) refresh_pattern -i \.(jpg|jpeg|png|gif|ico|webp|svg)$ 1440 50% 10080 refresh_pattern -i \.(css|js|woff2?)$ 1440 50% 10080 refresh_pattern -i \.(deb|rpm|iso|zip|tar|gz|xz)$ 10080 90% 43200 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern . 0 20% 4320 # Ocultar la versión de Squid en páginas de error y cabeceras httpd_suppress_version_string on visible_hostname proxy.your_domain ``` Algunas notas sobre estos valores: - `cache_dir` reserva 8000 MB en disco. Ajusta la cifra a tu espacio libre, dejando margen para el sistema. - `cache_mem` no es la memoria total de Squid, sino la que dedica a guardar objetos en RAM. El proceso consumirá bastante más, así que no pases de un cuarto de la RAM del servidor. - `refresh_pattern` solo se aplica cuando el servidor de origen no envía `Cache-Control` ni `Expires`. Si el origen dice cuánto cachear, Squid lo respeta. - Sustituye `your_domain` por un nombre que identifique el proxy; aparecerá en las cabeceras `X-Cache`. Squid necesita crear la estructura de directorios de la nueva caché antes de usarla. Para el servicio, inicializa la caché y vuelve a arrancarlo: ```bash sudo systemctl stop squid sudo squid -z --foreground sudo systemctl start squid ``` Verifica que la sintaxis es correcta y que los directorios se han creado: ```bash sudo squid -k parse 2>&1 | grep -iE 'error|warning' || echo "Configuración correcta" sudo ls /var/spool/squid | head ``` ```output Configuración correcta 00 01 02 ... ``` ## Paso 4: Definir quién puede usar el proxy Ahora crea las reglas de acceso. Además de permitir tu red, este ejemplo bloquea una lista de dominios, impide redes sociales en horario laboral y bloquea la descarga de ejecutables por HTTP. Primero crea el directorio para las listas de dominios y una lista de bloqueo: ```bash sudo mkdir -p /etc/squid/listas sudo nano /etc/squid/listas/bloqueados.txt ``` Escribe un dominio por línea. El punto inicial incluye también todos los subdominios: ```text .example-malware.com .example-phishing.net ``` Después crea el archivo de reglas: ```bash sudo nano /etc/squid/conf.d/20-acl.conf ``` ```ini # Redes de clientes autorizados acl clientes src 203.0.113.0/24 # Horario laboral: lunes a viernes de 08:00 a 18:00 acl horario_laboral time MTWHF 08:00-18:00 # Dominios bloqueados siempre (cargados desde archivo) acl bloqueados dstdomain "/etc/squid/listas/bloqueados.txt" # Redes sociales, bloqueadas en horario laboral acl redes_sociales dstdomain .facebook.com .instagram.com .tiktok.com .x.com # Ejecutables (solo detectable en HTTP, no en HTTPS) acl ejecutables urlpath_regex -i \.(exe|msi|bat|scr|ps1)$ http_access deny bloqueados http_access deny clientes redes_sociales horario_laboral http_access deny clientes ejecutables http_access allow clientes ``` Varias condiciones en la misma línea `http_access` deben cumplirse todas a la vez. La regla final `http_access deny all` de `squid.conf` rechaza cualquier cliente que no esté en `clientes`. > Nota: con HTTPS el cliente abre un túnel `CONNECT` y Squid solo ve el nombre del dominio, no la URL completa. Por eso `dstdomain` funciona con cualquier sitio, pero `urlpath_regex` solo afecta al tráfico HTTP sin cifrar. Comprueba la sintaxis y recarga: ```bash sudo squid -k parse 2>&1 | grep -iE 'error|warning' || echo "Configuración correcta" sudo systemctl reload squid ``` ## Paso 5: Añadir autenticación de usuarios La restricción por IP no basta si los clientes cambian de ubicación o comparten IP con otros. Con autenticación básica, Squid pide usuario y contraseña al navegador. Crea el archivo de contraseñas con el primer usuario. `htpasswd` te pedirá la contraseña de forma interactiva: ```bash sudo htpasswd -c /etc/squid/passwords your_user ``` Para añadir más usuarios, repite el comando sin `-c`, que sobrescribiría el archivo. En Ubuntu Squid se ejecuta con el usuario `proxy`, que necesita poder leer el archivo: ```bash sudo chown root:proxy /etc/squid/passwords sudo chmod 640 /etc/squid/passwords ``` Edita el archivo de reglas: ```bash sudo nano /etc/squid/conf.d/20-acl.conf ``` Añade al principio la configuración del programa de autenticación y sustituye la última línea `http_access allow clientes` por la versión que exige usuario: ```ini auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords auth_param basic children 5 auth_param basic realm Proxy corporativo auth_param basic credentialsttl 2 hours acl usuarios proxy_auth REQUIRED ``` ```ini http_access allow clientes usuarios ``` Recarga y confirma que no hay errores: ```bash sudo squid -k parse 2>&1 | grep -iE 'error|warning' || echo "Configuración correcta" sudo systemctl reload squid ``` > Advertencia: la autenticación básica envía la contraseña codificada en Base64, no cifrada, entre el navegador y el proxy. Úsala solo a través de una red privada o una VPN, o con contraseñas que no se reutilicen en otros servicios. ## Paso 6: Abrir el puerto en el firewall Permite el puerto `3128` únicamente desde la red de tus clientes: ```bash sudo ufw allow from 203.0.113.0/24 to any port 3128 proto tcp sudo ufw status ``` Si UFW no estaba activo, permite antes SSH con `sudo ufw allow OpenSSH` y actívalo con `sudo ufw enable`. ## Paso 7: Comprobar que la caché funciona Desde un equipo de la red autorizada, pide la misma URL dos veces a través del proxy. Sustituye `your_server_ip`, `your_user` y la contraseña: ```bash curl -s -o /dev/null -D - -x http://your_user:your_password@your_server_ip:3128 http://example.com/ | grep -i x-cache ``` La primera petición no está en la caché: ```output X-Cache: MISS from proxy.your_domain X-Cache-Lookup: MISS from proxy.your_domain:3128 ``` Repite el comando. Si el origen permite cachear la respuesta, verás un acierto: ```output X-Cache: HIT from proxy.your_domain X-Cache-Lookup: HIT from proxy.your_domain:3128 ``` En el servidor, el registro de acceso muestra el resultado de cada petición (`TCP_MISS`, `TCP_HIT`, `TCP_MEM_HIT`, `TCP_DENIED`, `TCP_TUNNEL` para HTTPS): ```bash sudo tail -n 5 /var/log/squid/access.log ``` ```output 1758790000.123 215 203.0.113.10 TCP_MISS/200 1256 GET http://example.com/ your_user HIER_DIRECT/93.184.215.14 text/html 1758790004.456 0 203.0.113.10 TCP_MEM_HIT/200 1263 GET http://example.com/ your_user HIER_NONE/- text/html ``` Para ver la proporción global de aciertos, consulta el gestor de caché desde el propio servidor (la configuración por defecto solo lo permite desde `localhost`): ```bash curl -s http://127.0.0.1:3128/squid-internal-mgr/info | grep -iE 'hits as % of' ``` ```output Hits as % of all requests: 5min: 34.2%, 60min: 28.9% Hits as % of bytes sent: 5min: 41.0%, 60min: 37.5% ``` Comprueba también que las ACL funcionan: una petición a un dominio de `bloqueados.txt` debe devolver `403 Forbidden` y aparecer como `TCP_DENIED/403` en el log. ## Paso 8 (opcional): Encadenar con otro proxy padre Si tienes un Squid central y proxies en cada sede, puedes hacer que los locales pidan al central lo que no tienen en caché. En el proxy local, crea el archivo: ```bash sudo nano /etc/squid/conf.d/30-peer.conf ``` ```ini # Proxy padre: nombre, tipo, puerto HTTP, puerto ICP (0 = sin ICP) cache_peer proxy-central.your_domain parent 3128 0 no-query default # Dominios internos que siempre se piden directamente acl internos dstdomain .intranet.your_domain always_direct allow internos never_direct allow all ``` `never_direct allow all` obliga a enviar todo lo demás al padre. Si el padre exige autenticación, añade `login=usuario:contraseña` a la línea `cache_peer`. Recarga con `sudo systemctl reload squid` tras validar con `squid -k parse`. ## Solución de problemas **Squid no arranca tras cambiar `cache_dir`.** Revisa el log con `sudo journalctl -u squid -n 50`. Si aparece un error sobre directorios de caché inexistentes, vuelve a ejecutar `sudo squid -z --foreground` con el servicio parado y comprueba que `/var/spool/squid` pertenece al usuario `proxy`. **Todas las peticiones devuelven `TCP_DENIED/403`.** La IP del cliente no coincide con la ACL `clientes`, o el orden de las reglas hace que una `deny` se aplique antes. Mira qué IP aparece en `access.log`, ya que detrás de un NAT puede no ser la que esperas. **El navegador pide la contraseña en bucle.** Comprueba que el usuario `proxy` puede leer el archivo con `sudo -u proxy cat /etc/squid/passwords` y prueba las credenciales manualmente: `printf 'your_user your_password\n' | sudo -u proxy /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords` debe responder `OK`. **Casi nunca hay `HIT`.** La mayor parte del tráfico actual es HTTPS y pasa por túneles `CONNECT` que Squid no puede cachear sin descifrarlo. La caché es efectiva sobre todo con tráfico HTTP, como repositorios de paquetes o actualizaciones de software. ## Conclusión Ya tienes Squid funcionando en Ubuntu 24.04 con caché en disco y memoria, reglas de acceso por red, horario y dominio, y autenticación por usuario. Como siguientes pasos puedes usarlo como caché de paquetes `apt` para varios servidores configurando `Acquire::http::Proxy` en cada uno, revisar periódicamente `access.log` para afinar las listas de bloqueo o poner el acceso al proxy detrás de una VPN como WireGuard para no exponer el puerto 3128.