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.

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:

sudo apt update
sudo apt install squid apache2-utils

El servicio arranca automáticamente. Comprueba la versión y el estado:

squid -v | head -n 1
sudo systemctl status squid --no-pager
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:

grep -n '^include' /etc/squid/squid.conf
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é:

sudo nano /etc/squid/conf.d/10-cache.conf

Añade este contenido:

# 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:

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:

sudo squid -k parse 2>&1 | grep -iE 'error|warning' || echo "Configuración correcta"
sudo ls /var/spool/squid | head
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:

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:

.example-malware.com
.example-phishing.net

Después crea el archivo de reglas:

sudo nano /etc/squid/conf.d/20-acl.conf
# 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.

Comprueba la sintaxis y recarga:

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:

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:

sudo chown root:proxy /etc/squid/passwords
sudo chmod 640 /etc/squid/passwords

Edita el archivo de reglas:

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:

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
http_access allow clientes usuarios

Recarga y confirma que no hay errores:

sudo squid -k parse 2>&1 | grep -iE 'error|warning' || echo "Configuración correcta"
sudo systemctl reload squid

Paso 6: Abrir el puerto en el firewall

Permite el puerto 3128 únicamente desde la red de tus clientes:

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:

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é:

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:

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):

sudo tail -n 5 /var/log/squid/access.log
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):

curl -s http://127.0.0.1:3128/squid-internal-mgr/info | grep -iE 'hits as % of'
	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:

sudo nano /etc/squid/conf.d/30-peer.conf
# 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.