Configuración Avanzada de Caché Squid en Linux

Squid es un proxy de caché de código abierto con más de 25 años de desarrollo que sigue siendo una referencia en entornos empresariales para control de acceso a internet, caché de contenido web y reducción del ancho de banda. Su configuración avanzada permite implementar jerarquías de caché, interceptar tráfico HTTPS mediante SSL bumping, proxies transparentes y reglas de control de acceso detalladas en servidores Linux.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS/Rocky Linux 8+
  • Al menos 1 GB de RAM (2 GB recomendado)
  • Espacio en disco para la caché (mínimo 5 GB recomendado)
  • Acceso root o usuario con privilegios sudo
  • Para SSL Bumping: Squid compilado con soporte OpenSSL

Instalación de Squid

# Ubuntu/Debian: instalar Squid con soporte SSL
sudo apt-get update
sudo apt-get install -y squid-openssl

# CentOS/Rocky Linux
sudo yum install -y squid

# Verificar versión y opciones de compilación
squid -v | grep -i ssl

# Habilitar e iniciar el servicio
sudo systemctl enable squid
sudo systemctl start squid

# Verificar estado
sudo systemctl status squid

Configuración Básica

El archivo principal de configuración es /etc/squid/squid.conf:

# Hacer copia de seguridad de la configuración original
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original

# Crear configuración base optimizada
sudo cat > /etc/squid/squid.conf << 'EOF'
# ================================================================
# Configuración de Squid - Proxy con Caché
# ================================================================

# ---- PUERTOS DE ESCUCHA ----
# Puerto estándar de proxy HTTP
http_port 3128

# Puerto para proxy HTTPS (con intercepción SSL - ver sección SSL Bumping)
# https_port 3129 ssl-bump cert=/etc/squid/ssl_cert/ca.crt key=/etc/squid/ssl_cert/ca.key

# ---- CONFIGURACIÓN DE CACHÉ ----
# Directorio de caché: tipo motor, ruta, tamaño_MB, directorios_L1, directorios_L2
cache_dir ufs /var/spool/squid 5000 16 256

# Tamaño máximo de un objeto individual almacenable en caché
maximum_object_size 512 MB

# Tamaño mínimo de objeto para cachear
minimum_object_size 0 KB

# Tamaño de caché en memoria RAM
cache_mem 256 MB

# Máximo objeto en caché de memoria
maximum_object_size_in_memory 8 MB

# ---- RENDIMIENTO ----
# Número de procesos hijos para peticiones DNS
dns_children 5

# Tiempo de conexión a servidores remotos
connect_timeout 30 seconds

# Tiempo de espera de respuesta
read_timeout 300 seconds

# ---- LOGS ----
# Formato de log de acceso
access_log /var/log/squid/access.log squid

# Log de caché
cache_log /var/log/squid/cache.log

# Rotación de logs
logfile_rotate 10

# ---- IDENTIFICACIÓN ----
# Nombre visible del proxy (ocultar versión por seguridad)
visible_hostname proxy.mi-empresa.com
httpd_suppress_version_string on

EOF

sudo squid -k parse  # Verificar sintaxis
sudo systemctl reload squid

Jerarquías de Caché

Configurar múltiples servidores Squid en jerarquía:

sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- JERARQUÍA DE CACHÉ ----
# Configurar el proxy hermano (mismo nivel)
cache_peer proxy-hermano.empresa.com sibling 3128 3130 \
    no-digest \
    proxy-only

# Configurar el proxy padre (nivel superior)
cache_peer proxy-padre.empresa.com parent 3128 3130 \
    default \
    no-query

# Política de selección de peer
prefer_direct off

# No consultar peers para dominios locales
cache_peer_access proxy-padre.empresa.com deny dominio_local
cache_peer_access proxy-hermano.empresa.com deny dominio_local

# Definir red local para no redirigir
acl dominio_local dstdomain .mi-empresa.com .intranet.local
always_direct allow dominio_local

# ICP (protocolo de comunicación entre proxies)
icp_port 3130
icp_access allow all

EOF

sudo squid -k parse
sudo systemctl reload squid

SSL Bumping

Interceptar y cachear tráfico HTTPS (requiere CA propia):

# Generar la CA (Autoridad Certificadora) propia de Squid
sudo mkdir -p /etc/squid/ssl_cert
cd /etc/squid/ssl_cert

# Generar clave privada y certificado de CA
sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 \
    -extensions v3_ca \
    -keyout ca.key \
    -out ca.crt \
    -subj "/C=ES/ST=Madrid/L=Madrid/O=Mi Empresa/CN=Squid Proxy CA"

sudo chown squid:squid ca.key ca.crt
sudo chmod 600 ca.key

# Crear base de datos de certificados SSL de Squid
sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 4MB
sudo chown -R squid:squid /var/lib/squid/ssl_db

# Configurar SSL Bumping en squid.conf
sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- SSL BUMPING (Interceptación HTTPS) ----

# Puerto HTTPS con SSL Bumping
https_port 3129 ssl-bump \
    cert=/etc/squid/ssl_cert/ca.crt \
    key=/etc/squid/ssl_cert/ca.key \
    generate-host-certificates=on \
    dynamic_cert_mem_cache_size=4MB

# Generador de certificados SSL en tiempo real
sslcrtd_program /usr/lib/squid/security_file_certgen \
    -s /var/lib/squid/ssl_db \
    -M 4MB

sslcrtd_children 5

# Pasos de SSL bumping:
# 1. peek - ver el SNI del ClientHello sin descifrar
# 2. bump - interceptar y analizar el tráfico
# 3. splice - pasar sin interceptar (para sitios bancarios, etc.)
# 4. terminate - rechazar la conexión

# Definir sitios que NO se interceptarán (privacidad)
acl sin_intercepcion dstdomain \
    .mi-banco.com \
    .paypal.com \
    .hacienda.gob.es

ssl_bump peek step1 all
ssl_bump splice step2 sin_intercepcion
ssl_bump bump step2 all

EOF

sudo squid -k parse
sudo systemctl reload squid

# Exportar el certificado CA para distribuir a los clientes
echo "Distribuir este certificado a los navegadores de los usuarios:"
sudo cat /etc/squid/ssl_cert/ca.crt

Proxy Transparente

Interceptar tráfico HTTP sin configurar proxy en los clientes:

# Configurar el puerto transparente en squid.conf
sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- PROXY TRANSPARENTE ----
# Puerto de intercepción transparente
http_port 3130 intercept

# Marcar tráfico interceptado como externo
acl trafigo_interceptado myportname 3130

EOF

# Configurar iptables para redirigir el tráfico HTTP al puerto de Squid
# El servidor Squid debe actuar como gateway de la red o estar en el camino del tráfico

# Habilitar reenvío de paquetes
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# Redirigir tráfico HTTP de la red interna al puerto de Squid
sudo iptables -t nat -A PREROUTING \
    -i eth1 \
    -p tcp \
    --dport 80 \
    ! -d 192.168.1.1 \
    -j REDIRECT --to-port 3130

# Guardar reglas de iptables
sudo netfilter-persistent save

Reglas ACL Avanzadas

Control de acceso detallado para usuarios y destinos:

sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- REGLAS DE CONTROL DE ACCESO (ACL) ----

# Definir redes permitidas
acl red_oficina src 192.168.1.0/24
acl red_servidores src 10.0.0.0/8
acl localhost src 127.0.0.1/32

# Definir horario laboral
acl horario_laboral time MTWHF 08:00-18:00
acl fin_de_semana time AS 00:00-23:59

# Categorías de sitios web
acl redes_sociales dstdomain \
    .facebook.com \
    .twitter.com \
    .instagram.com \
    .tiktok.com \
    .linkedin.com

acl streaming dstdomain \
    .youtube.com \
    .netflix.com \
    .twitch.tv \
    .spotify.com

# Lista de sitios bloqueados (desde archivo)
acl sitios_bloqueados dstdomain "/etc/squid/listas/bloqueados.txt"

# Lista blanca de sitios siempre permitidos
acl siempre_permitidos dstdomain "/etc/squid/listas/permitidos.txt"

# Control por tipo de contenido
acl descarga_archivos rep_mime_type \
    application/octet-stream \
    application/x-msdownload \
    application/x-executable

# Tipos de extensiones bloqueadas
acl ext_bloqueadas urlpath_regex -i \
    \.(exe|msi|bat|cmd|scr|pif|vbs|ps1)$

# ---- APLICACIÓN DE REGLAS ----

# Permitir siempre la lista blanca
http_access allow siempre_permitidos

# Bloquear sitios en lista negra
http_access deny sitios_bloqueados

# Red de servidores: acceso completo siempre
http_access allow red_servidores

# Red de oficina: sin redes sociales en horario laboral
http_access deny red_oficina redes_sociales horario_laboral
http_access deny red_oficina streaming horario_laboral

# Bloquear descargas de ejecutables
http_access deny red_oficina ext_bloqueadas

# Permitir red de oficina en cualquier otro caso
http_access allow red_oficina

# Permitir localhost
http_access allow localhost

# Denegar todo lo demás
http_access deny all

EOF

# Crear directorios y archivos de listas
sudo mkdir -p /etc/squid/listas
sudo touch /etc/squid/listas/bloqueados.txt
sudo touch /etc/squid/listas/permitidos.txt

# Añadir dominios bloqueados de ejemplo
cat > /etc/squid/listas/bloqueados.txt << 'EOF'
.sitio-malicioso.com
.phishing-example.com
EOF

sudo squid -k parse
sudo systemctl reload squid

Autenticación de Usuarios

Requerir autenticación para usar el proxy:

# Instalar htpasswd si no está disponible
sudo apt-get install -y apache2-utils

# Crear archivo de contraseñas
sudo htpasswd -c /etc/squid/passwords usuario1
sudo htpasswd /etc/squid/passwords usuario2

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

# Configurar autenticación básica en squid.conf
sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- AUTENTICACIÓN ----
# Programa de autenticación básica
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic children 5
auth_param basic realm "Proxy Corporativo - Introduzca sus credenciales"
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

# ACL que requiere autenticación
acl usuarios_autenticados proxy_auth REQUIRED

# Aplicar autenticación
http_access allow red_oficina usuarios_autenticados

EOF

sudo squid -k parse
sudo systemctl reload squid

Optimización del Rendimiento

sudo cat >> /etc/squid/squid.conf << 'EOF'

# ---- OPTIMIZACIÓN DE RENDIMIENTO ----

# Número de workers (usar número de CPUs - 1)
workers 3

# Tamaño del buffer de lectura
read_ahead_gap 64 KB

# Caché de resolución DNS
positive_dns_ttl 6 hours
negative_dns_ttl 1 minute

# Número de descriptores de archivo abiertos
# Asegurarse de que el sistema permite suficientes con: ulimit -n
max_filedescriptors 65535

# Configuración de objetos de memoria
memory_cache_mode always
memory_replacement_policy lru

# Política de reemplazo de caché en disco
cache_replacement_policy heap LFUDA

# Heurística de frescura de caché
refresh_pattern -i \.(jpg|jpeg|png|gif|ico|webp)$ 10080 100% 43200
refresh_pattern -i \.(css|js|woff|woff2)$ 1440 50% 43200
refresh_pattern -i \.(mp4|mkv|avi|zip|tar|gz)$ 10080 100% 43200
refresh_pattern . 0 20% 4320

EOF

# Aplicar límites del sistema operativo para Squid
cat > /etc/security/limits.d/squid.conf << 'EOF'
# Límites del sistema para el proceso Squid
squid   soft    nofile  65535
squid   hard    nofile  65535
EOF

sudo squid -k parse
sudo systemctl reload squid

# Verificar rendimiento de la caché
squidclient -h localhost -p 3128 mgr:info | grep -E "cache|request|hit"

Solución de Problemas

Squid no arranca (error de permisos en caché):

# Reinicializar la estructura de directorios de caché
sudo squid -z
sudo chown -R squid:squid /var/spool/squid
sudo systemctl start squid

SSL Bumping falla con error de certificado:

# Verificar que el certificado CA es válido
openssl x509 -in /etc/squid/ssl_cert/ca.crt -text -noout | grep -E "Subject|Validity"

# Verificar que la base de datos SSL está inicializada
ls -la /var/lib/squid/ssl_db/

# Revisar logs de Squid
sudo tail -f /var/log/squid/cache.log | grep -i ssl

Alta latencia en peticiones a través del proxy:

# Verificar estadísticas de caché
squidclient -h localhost mgr:utilization

# Verificar la tasa de aciertos
squidclient -h localhost mgr:request_hit_ratio

# Revisar si el DNS es un cuello de botella
time squidclient -h localhost -r http://www.ejemplo.com/ >/dev/null

Las ACL no bloquean el tráfico esperado:

# Probar una ACL específica
squidclient -h localhost -p 3128 -r http://facebook.com/ 2>&1 | head -5

# Ver el log de acceso en tiempo real
sudo tail -f /var/log/squid/access.log

Conclusión

Squid es una solución de proxy y caché madura que proporciona control total sobre el tráfico web en redes corporativas, desde simples reglas de acceso hasta complejas jerarquías de caché y análisis de tráfico HTTPS mediante SSL bumping. La combinación de caché agresiva con reglas ACL detalladas permite tanto reducir el consumo de ancho de banda como implementar políticas de uso aceptable, haciendo de Squid una herramienta indispensable para la gestión de infraestructura de red empresarial en Linux.