Files
api-ping/DEPLOYMENT.md
2025-08-17 00:09:08 +02:00

6.2 KiB

Deployment con Nginx - API Ping Service

Esta guía explica cómo configurar nginx como proxy reverso para el servicio de ping, asegurando que se obtenga correctamente la IP real de los clientes.

🔧 Configuración de Nginx

1. Configuración Básica

server {
    listen 80;
    server_name your-domain.com;
    
    # Configuración para obtener IP real del cliente
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    
    # IPs confiables (ajustar según tu infraestructura)
    set_real_ip_from 10.0.0.0/8;
    set_real_ip_from 172.16.0.0/12;
    set_real_ip_from 192.168.0.0/16;
    
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

2. Rate Limiting en Nginx

# En el bloque http {}
http {
    # Zona de rate limiting para API general
    limit_req_zone $binary_remote_addr zone=api:10m rate=30r/h;
    
    # Zona específica para ping (más restrictiva)
    limit_req_zone $binary_remote_addr zone=ping:10m rate=5r/10m;
    
    # Rate limiting por IP real (después del proxy)
    limit_req_zone $realip_remote_addr zone=real_ip:10m rate=5r/10m;
}

# En el bloque server {}
server {
    location /api/ping {
        limit_req zone=ping burst=5 nodelay;
        proxy_pass http://127.0.0.1:3000;
        # ... otros headers de proxy
    }
}

3. SSL/HTTPS (Recomendado)

server {
    listen 443 ssl http2;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/private.key;
    
    # Headers de seguridad
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    
    # ... resto de la configuración
}

🌐 Configuración para Cloudflare

Si usas Cloudflare, agrega estas IPs confiables:

# IPs de Cloudflare (actualizar periódicamente)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
# ... (ver archivo nginx.conf completo)

# Headers específicos para Cloudflare
real_ip_header CF-Connecting-IP;

🚀 Pasos de Deployment

1. Preparar la Aplicación

# Compilar para producción
npm run build

# Iniciar en modo producción
npm start

# O usar PM2 para gestión de procesos
npm install -g pm2
pm2 start npm --name "api-ping" -- start
pm2 save
pm2 startup

2. Configurar Nginx

# Copiar configuración
sudo cp nginx.conf /etc/nginx/sites-available/api-ping
sudo ln -s /etc/nginx/sites-available/api-ping /etc/nginx/sites-enabled/

# Verificar configuración
sudo nginx -t

# Recargar nginx
sudo systemctl reload nginx

3. Variables de Entorno

# .env.production
NODE_ENV=production
TRUST_PROXY=true
RATE_LIMIT_MAX=10
RATE_LIMIT_WINDOW_MS=60000

🔍 Verificación del Setup

1. Verificar Headers de Proxy

# Verificar que nginx está pasando los headers correctos
curl -H "X-Forwarded-For: 203.0.113.1" http://your-domain.com/api/status

2. Test de Rate Limiting

# Script para probar rate limiting
for i in {1..8}; do
  echo "Request $i:"
  curl -s http://your-domain.com/api/ping \
    -H "Content-Type: application/json" \
    -d '{"target":"8.8.8.8","count":1}' \
    | jq '.rateLimit // .error'
  sleep 1
done

3. Verificar IP del Cliente

El endpoint /api/status ahora incluye información de debugging:

{
  "clientInfo": {
    "ip": "203.0.113.1",
    "isProxied": true,
    "userAgent": "curl/7.68.0",
    "proxyHeaders": {
      "x-forwarded-for": "203.0.113.1",
      "x-real-ip": "203.0.113.1"
    }
  }
}

🛡️ Seguridad Adicional

1. Fail2ban para Protección DDoS

# /etc/fail2ban/jail.local
[api-ping]
enabled = true
port = http,https
filter = api-ping
logpath = /var/log/nginx/api-ping-access.log
maxretry = 20
bantime = 3600
findtime = 300

2. Monitoreo de Logs

# Monitorear requests sospechosos
tail -f /var/log/nginx/api-ping-access.log | grep -E "(429|5[0-9]{2})"

# Analizar IPs con más requests
awk '{print $1}' /var/log/nginx/api-ping-access.log | sort | uniq -c | sort -nr | head -10

📊 Monitoreo y Métricas

1. Nginx Status

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}

2. Logs Estructurados

log_format api_ping '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   '"$http_x_forwarded_for" "$http_x_real_ip" '
                   '$request_time $upstream_response_time';

access_log /var/log/nginx/api-ping-access.log api_ping;

🔧 Troubleshooting

Problema: IP incorrecta

# Verificar headers que llegan a la aplicación
curl -H "X-Debug: true" http://your-domain.com/api/status

# Verificar configuración de nginx
sudo nginx -T | grep -A 10 -B 10 real_ip

Problema: Rate limiting no funciona

# Verificar que la IP se está obteniendo correctamente
# La aplicación debe usar la IP real, no la del proxy (127.0.0.1)

Problema: CORS

# Verificar headers CORS
curl -H "Origin: http://example.com" -H "Access-Control-Request-Method: POST" \
     -X OPTIONS http://your-domain.com/api/ping -v

📝 Checklist de Deployment

  • Aplicación compilada para producción
  • PM2 o similar configurado para gestión de procesos
  • Nginx configurado con proxy_pass
  • Headers X-Forwarded-* configurados
  • real_ip_header configurado
  • IPs confiables (set_real_ip_from) configuradas
  • Rate limiting configurado en nginx (opcional)
  • SSL/HTTPS configurado
  • Headers de seguridad configurados
  • Logs configurados
  • Monitoring configurado
  • Backup y recovery plan preparado

Con esta configuración, el servicio obtendrá correctamente la IP real de los clientes incluso cuando esté detrás de nginx, Cloudflare u otros proxies. 🎉