Squid es un proxy HTTP con caché muy extendido: permite navegar a través de un servidor, controlar a qué sitios se accede, registrar el tráfico y guardar en caché contenido estático. En este tutorial instalarás Squid en Ubuntu 24.04 como proxy de reenvío (forward proxy) con autenticación por usuario y contraseña, bloquearás dominios, activarás la caché en disco y limitarás el acceso con UFW.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM y unos GB libres en disco para la caché.
  • Un usuario no root con privilegios sudo y UFW activo con SSH permitido.
  • La IP pública desde la que te conectarás al proxy (your_client_ip), si quieres restringir el acceso por firewall.

Paso 1: Instalar Squid

Instala Squid y apache2-utils, que proporciona htpasswd para crear el archivo de contraseñas:

sudo apt update
sudo apt install squid apache2-utils

El paquete arranca el servicio automáticamente en el puerto 3128. Compruébalo:

systemctl status squid --no-pager
● squid.service - Squid Web Proxy Server
     Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-09-25 10:20:11 UTC; 12s ago
sudo ss -ltnp | grep 3128
LISTEN 0      256                *:3128            *:*    users:(("squid",pid=2141,fd=11))

Paso 2: Entender dónde va tu configuración

El archivo principal es /etc/squid/squid.conf. Es muy largo porque documenta todas las directivas, así que en lugar de editarlo es más limpio añadir tu configuración en /etc/squid/conf.d/, que Ubuntu incluye justo en el punto donde van las reglas de acceso propias. Compruébalo:

grep -n -E '^(include|http_access)' /etc/squid/squid.conf
...
1447:include /etc/squid/conf.d/*.conf
1455:http_access allow localhost
1458:http_access deny all

Squid evalúa las reglas http_access en orden y se queda con la primera que coincide. Por encima del include están las protecciones por defecto (deny !Safe_ports, deny CONNECT !SSL_ports, acceso al gestor de caché). Tus reglas quedan después de ellas y antes del deny all final, que es justo lo que necesitas. Los números de línea pueden variar.

Haz una copia del archivo original por si necesitas volver atrás:

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.orig

Paso 3: Crear los usuarios del proxy

Crea el archivo de contraseñas con el primer usuario. La opción -c crea el archivo, así que úsala solo esta vez:

sudo htpasswd -c /etc/squid/passwords ana

Para añadir más usuarios, omite -c:

sudo htpasswd /etc/squid/passwords luis

Squid se ejecuta como el usuario proxy, que necesita leer el archivo. Ajusta propietario y permisos para que nadie más lo lea:

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

Comprueba que el helper de autenticación valida las credenciales. Escribe el usuario y la contraseña separados por un espacio y pulsa Enter, luego Ctrl+D para salir:

sudo -u proxy /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
ana your_password
OK

Paso 4: Configurar autenticación, bloqueo de dominios y caché

Crea la lista de dominios bloqueados. Un dominio que empieza por punto incluye también todos sus subdominios:

sudo nano /etc/squid/blocked_domains.txt
.tiktok.com
.facebook.com

Crea ahora el archivo de configuración propio:

sudo nano /etc/squid/conf.d/proxy.conf
# Autenticación básica contra /etc/squid/passwords
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic children 5
auth_param basic realm Proxy
auth_param basic credentialsttl 2 hours
acl authenticated proxy_auth REQUIRED

# Dominios bloqueados
acl blocked_domains dstdomain "/etc/squid/blocked_domains.txt"

# Reglas de acceso (se evalúan en orden)
http_access deny blocked_domains
http_access allow authenticated

# Caché: 256 MB en RAM y 2 GB en disco
cache_mem 256 MB
maximum_object_size_in_memory 1 MB
cache_dir ufs /var/spool/squid 2048 16 256
maximum_object_size 100 MB

# No revelar la IP del cliente ni la presencia del proxy
forwarded_for delete
via off

Qué hace cada bloque:

  • auth_param define el programa que valida las credenciales y acl authenticated proxy_auth REQUIRED coincide con cualquier usuario válido.
  • http_access deny blocked_domains va antes del allow, así que los dominios bloqueados se deniegan incluso a usuarios autenticados.
  • cache_dir ufs /var/spool/squid 2048 16 256 reserva 2048 MB de caché en disco repartidos en 16 directorios de primer nivel y 256 de segundo.
  • forwarded_for delete y via off evitan que Squid añada cabeceras con la IP del cliente o su propia versión.

Valida la sintaxis antes de aplicar nada:

sudo squid -k parse

El comando lista la configuración procesada. Si hay un error, lo muestra con el archivo y la línea, por ejemplo FATAL: Bungled /etc/squid/conf.d/proxy.conf line 9. Si termina sin líneas ERROR ni FATAL, la configuración es correcta.

Paso 5: Inicializar la caché y reiniciar Squid

La caché en disco necesita su estructura de directorios. Detén Squid, créala con -z y vuelve a arrancarlo:

sudo systemctl stop squid
sudo squid -z --foreground
sudo systemctl start squid

Comprueba que se han creado los directorios de la caché:

sudo ls /var/spool/squid
00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F  swap.state

Para cambios posteriores de configuración no hace falta reiniciar: sudo systemctl reload squid aplica los cambios sin cortar conexiones.

Paso 6: Abrir el puerto en el firewall

Permite el puerto 3128 solo desde las IP que vayan a usar el proxy:

sudo ufw allow from your_client_ip to any port 3128 proto tcp

Si los usuarios se conectan desde IP dinámicas y no puedes restringir por origen, abre el puerto a todos (sudo ufw allow 3128/tcp) y confía en la autenticación, pero usa contraseñas largas.

Paso 7: Probar el proxy

Desde tu equipo, haz una petición a través del proxy sin credenciales. Squid debe exigir autenticación:

curl -I -x http://your_server_ip:3128 http://example.com
HTTP/1.1 407 Proxy Authentication Required
Server: squid
...

Repite con usuario y contraseña. Para HTTPS, el navegador abre un túnel con el método CONNECT y Squid responde Connection established antes de la respuesta real:

curl -I -x http://your_server_ip:3128 -U ana:your_password https://example.com
HTTP/1.1 200 Connection established

HTTP/2 200
content-type: text/html
...

Comprueba que un dominio bloqueado se deniega:

curl -I -x http://your_server_ip:3128 -U ana:your_password https://www.facebook.com
HTTP/1.1 403 Forbidden
...
curl: (56) CONNECT tunnel failed, response 403

En el servidor, cada petición aparece en el log de acceso con el usuario que la hizo:

sudo tail -n 3 /var/log/squid/access.log
1790331702.114    612 198.51.100.7 TCP_TUNNEL/200 6419 CONNECT example.com:443 ana HIER_DIRECT/93.184.215.14 -
1790331715.882      0 198.51.100.7 TCP_DENIED/403 3894 CONNECT www.facebook.com:443 ana HIER_NONE/- text/html
1790331720.301      0 198.51.100.7 TCP_DENIED/407 3993 HEAD http://example.com/ - HIER_NONE/- text/html

Para ver el tráfico en tiempo real, usa sudo tail -f /var/log/squid/access.log.

Paso 8: Configurar los clientes

En los navegadores y sistemas operativos, configura un proxy manual HTTP con host your_server_ip y puerto 3128, y marca la opción de usarlo también para HTTPS. El navegador pedirá el usuario y la contraseña la primera vez.

En Linux, muchas herramientas de línea de comandos respetan las variables de entorno de proxy:

export http_proxy="http://ana:your_password@your_server_ip:3128"
export https_proxy="$http_proxy"
curl -s https://ifconfig.me
your_server_ip

Solución de problemas

Squid no arranca después de un cambio. Ejecuta sudo squid -k parse para ver la línea con el error y revisa sudo journalctl -u squid -n 50.

Todas las peticiones devuelven 403 aunque las credenciales son correctas. Suele deberse al orden de las reglas: si una regla deny coincide antes que tu allow, gana la primera. Revisa el orden con el grep del paso 2. También ocurre si el puerto de destino no está en Safe_ports o si es un CONNECT a un puerto distinto de 443.

El navegador pide la contraseña una y otra vez. El usuario proxy no puede leer /etc/squid/passwords. Repite el chown y chmod del paso 3 y prueba el helper como se indica allí.

El cache.log muestra No space left on device. El tamaño de cache_dir supera el espacio libre. Reduce el valor en MB, recarga Squid y comprueba el espacio con df -h /var/spool/squid.

Conclusión

Has configurado Squid en Ubuntu 24.04 como proxy de reenvío con autenticación, bloqueo de dominios, caché en memoria y en disco y acceso limitado por firewall. Cada petición queda registrada con el usuario que la hizo en /var/log/squid/access.log.

A partir de aquí puedes restringir el horario de uso con ACL de tipo time, limitar el ancho de banda por usuario con delay_pools o generar informes de navegación a partir del log de acceso con herramientas como SARG.