Los web proxies son herramientas fundamentales en la infraestructura moderna: actúan como intermediarios entre clientes y servidores, ofreciendo balanceo de carga, caché, filtrado de contenido y terminación SSL. Pero un proxy mal configurado puede convertirse en la puerta de entrada perfecta para atacantes.
En este artículo te explico cómo configurar correctamente tus proxies web y qué medidas de seguridad debes aplicar para que no se transformen en un vector de ataque.
1. ¿Qué es un Web Proxy y qué tipos existen?
Un proxy web es un servidor que actúa como intermediario en las peticiones HTTP/HTTPS entre un cliente y un servidor de origen.
Tipos principales
- Proxy Directo (Forward Proxy): Se sitúa entre el cliente e Internet. Usado para filtrar contenido, controlar acceso o navegar de forma anónima.
- Proxy Inverso (Reverse Proxy): Se sitúa frente a los servidores de origen. Nginx, Apache, HAProxy y Traefik son ejemplos populares. Protege la identidad del backend y gestiona tráfico entrante.
- Proxy Transparente: Intercepta tráfico sin configuración del cliente. Común en redes corporativas y hotspots.
- Proxy SSL/TLS: Termina conexiones HTTPS, inspecciona el tráfico y reenvía al backend (a menudo por HTTP interno).
El 90% de los problemas de seguridad en proxies vienen de configuraciones por defecto sin hardening.
2. Riesgos de seguridad más comunes
Open Proxy (Proxy Abierto)
Un proxy mal configurado que acepta conexiones de cualquier origen sin autenticación. Los atacantes lo usan para lanzar ataques DDoS ocultando su IP real, escanear redes internas (SSRF), enviar spam y realizar fraudes, o consumir tu ancho de banda.
Si tu proxy aparece en listas públicas de open proxies, tu IP será baneada por servicios como Spamhaus y tu reputación quedará destruida.
SSRF (Server-Side Request Forgery)
Un atacante engaña al proxy para que realice peticiones a destinos internos no autorizados. Si el proxy no valida el destino, puede acceder a servicios internos (bases de datos, APIs, paneles de administración), metadatos de nube como 169.254.169.254, o archivos locales vía file://.
Terminación SSL insegura
Un proxy que termina TLS pero reenvía tráfico en texto plano por la red interna expone datos sensibles a cualquiera que pueda sniffar la red.
HTTP Request Smuggling
Ataque que explota diferencias en cómo el proxy y el backend interpretan los límites de las peticiones HTTP (Content-Length vs Transfer-Encoding), permitiendo inyectar peticiones maliciosas en el flujo.
Exposición de información
Headers como Server: nginx/1.18.0 o X-Powered-By: PHP/8.1 revelan la stack tecnológica y facilitan ataques dirigidos.
3. Hardening de Nginx como Reverse Proxy
# Deshabilitar la revelación de versión
server_tokens off;
# Limitar métodos HTTP
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# Limitar tamaño de peticiones
client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# Timeouts agresivos contra slow attacks
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;
keepalive_timeout 15s;
# Rate limiting por IP
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req zone=api burst=20 nodelay;
# Bloquear acceso a archivos sensibles
location ~ /\. {
deny all;
return 404;
}
# Headers de seguridad
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
# Ocultar headers del backend
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
proxy_hide_header X-AspNet-Version;
4. Hardening de Apache (mod_proxy)
# Ocultar versión
ServerTokens Prod
ServerSignature Off
# Limitar métodos
<LimitExcept GET POST HEAD>
Deny from all
</LimitExcept>
# Timeouts
Timeout 60
ProxyTimeout 30
# Rate limiting con mod_ratelimit
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 512
# Headers de seguridad
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
5. Hardening de HAProxy
# Limitar conexiones
frontend web
bind :80
bind :443 ssl crt /etc/ssl/cert.pem
stick-table type ip size 100k expire 30s store conn_rate(3s)
http-request track-sc0 src
http-request deny if { sc0_conn_rate gt 20 }
http-response del-header Server
6. Reglas de firewall y segmentación de red
Reglas esenciales con iptables
# Solo permitir tráfico HTTP/HTTPS desde fuera
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Bloquear acceso directo al backend desde el exterior
iptables -A INPUT -p tcp --dport 8080 -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
# Rate limiting anti-DDoS
iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/min --limit-burst 100 -j ACCEPT
Segmentación de red
- El proxy debe estar en una DMZ o red separada del backend.
- La comunicación proxy a backend debe ser por red interna, nunca pública.
- Usa TLS interno (mTLS) entre proxy y backend aunque estén en la misma red.
- Aplica el principio de mínimo privilegio: el proxy solo debe conocer los backends que necesita.
7. Autenticación y control de acceso
Forward Proxy con autenticación
# Nginx forward proxy con auth basic
server {
listen 3128;
auth_basic "Proxy Restringido";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
}
}
Listas blancas de destinos
Si tu proxy solo debe acceder a ciertos servicios externos, implementa una whitelist:
# Solo permitir destinos aprobados
map $http_host $allowed {
default 0;
api.stripe.com 1;
api.sendgrid.com 1;
api.github.com 1;
}
if ($allowed = 0) {
return 403;
}
8. Monitoreo y detección de anomalías
Qué monitorear
- Picos de tráfico: Un aumento repentino en conexiones puede indicar que te están usando como proxy abierto o estás bajo ataque DDoS.
- Patrones de error 4xx/5xx: Ráfagas de 403/404 pueden indicar escaneo de puertos o enumeración.
- Conexiones a destinos sospechosos: Si tu proxy accede a IPs internas o metadata endpoints de nube.
- Consumo de ancho de banda anómalo: El tráfico saliente inusualmente alto es síntoma claro de proxy abierto.
Configuración de logs en Nginx
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_addr';
access_log /var/log/nginx/access.log security;
error_log /var/log/nginx/error.log warn;
Alertas automáticas con Fail2ban
# /etc/fail2ban/jail.local
[nginx-proxy]
enabled = true
port = 80,443
filter = nginx-proxy
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 60
bantime = 3600
9. TLS y certificados
Configuración TLS robusta en Nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS (obligatorio en producción)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Renovación automática con Certbot
certbot --nginx -d tudominio.com -d www.tudominio.com
certbot renew --dry-run # verificar
10. Checklist de Hardening
Antes de poner un proxy en producción, verifica:
- No es un open proxy: Prueba con
curl -x http://TU_IP:PUERTO http://example.comdesde una IP externa. Debe rechazar la conexión. - Server tokens deshabilitados:
curl -I https://tudominio.comno debe mostrar versión del servidor. - Rate limiting activo: Prueba con herramientas como ab o siege, las peticiones excesivas deben recibir 429.
- Headers de seguridad presentes: Usa securityheaders.com para verificar.
- TLS >= 1.2: Verifica con SSL Labs. Apunta a calificación A+.
- SSRF bloqueado: El proxy no debe permitir peticiones a IPs privadas ni metadata endpoints de nube.
- Firewall configurado: Solo los puertos necesarios expuestos. El backend es inaccesible desde el exterior.
- Logs centralizados: Envía logs a Grafana Loki o un SIEM para detección temprana.
- Actualizaciones automáticas: El proxy y el SO reciben parches de seguridad puntualmente.
- Certificados TLS vigentes: Monitoreo de expiración con alertas.
11. Herramientas recomendadas
- Nginx — Reverse proxy ligero y rápido, el más usado del mundo.
- HAProxy — Balanceo de carga de alto rendimiento, ideal para tráfico masivo.
- Traefik — Proxy dinámico con auto-descubrimiento para Docker y Kubernetes.
- Caddy — Proxy con HTTPS automático vía Let's Encrypt, configuración mínima.
- Cloudflare Tunnel / ngrok — Exposición segura de servicios locales sin abrir puertos.
- Fail2ban — Baneo automático de IPs maliciosas basado en patrones de logs.
- CrowdSec — Fail2ban moderno con inteligencia colaborativa entre servidores.
- ModSecurity + OWASP CRS — WAF (Web Application Firewall) de código abierto.
Conclusión
Un web proxy correctamente configurado es un escudo. Mal configurado, es un vector de ataque. La diferencia está en los detalles: deshabilitar información de versión, implementar rate limiting, validar destinos, segmentar la red, y monitorear proactivamente.
Invertir una hora en hardening ahora te ahorrará días de respuesta a incidentes después. Y recuerda: si tu proxy no distingue entre clientes legítimos y atacantes, no tienes un proxy — tienes una puerta abierta.
¿Tienes un proxy en producción? Comparte en los comentarios qué medidas de seguridad tienes implementadas o qué dudas te surgen.