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
sudoy 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.
Advertenciaun proxy abierto a Internet sin autenticación se usa para spam y ataques en cuestión de horas. No elimines la autenticación ni la regla final
http_access deny all.
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_paramdefine el programa que valida las credenciales yacl authenticated proxy_auth REQUIREDcoincide con cualquier usuario válido.http_access deny blocked_domainsva antes delallow, así que los dominios bloqueados se deniegan incluso a usuarios autenticados.cache_dir ufs /var/spool/squid 2048 16 256reserva 2048 MB de caché en disco repartidos en 16 directorios de primer nivel y 256 de segundo.forwarded_for deleteyvia offevitan 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
Notala autenticación básica viaja codificada pero sin cifrar entre el cliente y Squid. Si te conectas desde redes no fiables, accede al proxy a través de una VPN como WireGuard o por un túnel SSH (
ssh -L 3128:localhost:3128 your_user@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.
