Icono del sitio Binario 0

Sustituir el “Catch-All” de Nginx por un sitio con dominio técnico y Let’s Encrypt que siempre devuelva 404

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Este artículo explica cómo reemplazar un catch-all genérico en Nginx por un “sitio sumidero” (blackhole) con un dominio técnico propio, certificado Let’s Encrypt, marcado como default_server, y que responda 404 a cualquier petición que no coincida con tus server_name reales. Es útil para evitar servir por error uno de tus sitios ante hosts desconocidos o mal configurados.

Objetivo

Usa un dominio/subdominio real que controles. Let’s Encrypt no emitirá certificados para dominios inexistentes.

Prerrequisitos

1. Preparar el webroot para ACME

sudo mkdir -p /var/www/acme-challenge
sudo chown -R www-data:www-data /var/www/acme-challenge   # usa 'nginx:nginx' en CentOS/RHEL

2. Crear el bloque HTTP por defecto (80)

Archivo (Debian/Ubuntu): /etc/nginx/sites-available/00-default-404.conf
(CentOS/RHEL): /etc/nginx/conf.d/00-default-404.conf

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # Acepta cualquier Host; declaramos también el técnico
    server_name blackhole.tudominio.com;

    access_log /var/log/nginx/blackhole.access.log;
    error_log  /var/log/nginx/blackhole.error.log warn;
    server_tokens off;

    # Permitir sólo el ACME HTTP-01 (Este bloque es opcional)
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/acme-challenge;
        default_type "text/plain";
        try_files $uri =404;
    }

    # Todo lo demás => 404
    location / {
        return 404;
    }
}

Activa el sitio (Debian/Ubuntu):

sudo ln -s /etc/nginx/sites-available/00-default-404.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

3. Emitir el certificado Let’s Encrypt

Con webroot:

sudo certbot certonly \
  --webroot -w /var/www/acme-challenge \
  -d blackhole.tudominio.com \
  --agree-tos -m admin@tudominio.com --no-eff-email

(En distros con snap: sudo snap install certbot --classic y usar certbot igual que arriba).

Comprueba que se hayan creado los ficheros en:
/etc/letsencrypt/live/blackhole.tudominio.com/

4. Crear el bloque HTTPS por defecto (443)

Añade al mismo archivo de antes (o a otro, a tu gusto):

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name blackhole.tudominio.com;

    # Rutas del certificado emitido
    ssl_certificate     /etc/letsencrypt/live/blackhole.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blackhole.tudominio.com/privkey.pem;

    # Mínimos sensatos
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # Cabeceras básicas de endurecimiento
    add_header X-Content-Type-Options nosniff always;
    add_header X-Frame-Options DENY always;
    add_header Referrer-Policy no-referrer always;

    # Responder SIEMPRE 404
    location / {
        return 404;
    }
}

Valida y recarga:

sudo nginx -t && sudo systemctl reload nginx

5. Renovación automática

certbot instala systemd timers o cron. Verifica con:

sudo certbot renew --dry-run

6. Pruebas rápidas

curl -i -H "Host: noexiste.tudominio.com" http://TU_IP

Debe devolver HTTP/1.1 404 Not Found.

curl -i --resolve noexiste.tudominio.com:443:TU_IP https://noexiste.tudominio.com/

Debe negociar TLS con el cert de blackhole.tudominio.com y responder 404.

Notas y buenas prácticas

Resultado

Con estos pasos, tu Nginx tiene un default_server limpio, con certificado Let’s Encrypt y que siempre responde 404, evitando servir contenido accidental a hosts desconocidos y manteniendo un handshake TLS válido para clientes que lleguen por HTTPS.

Salir de la versión móvil