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

  • Tener un subdominio técnico (p. ej. blackhole.tudominio.com) apuntando al proxy Nginx.
  • Emitir un certificado válido para ese subdominio con Let’s Encrypt.
  • Definir dos server blocks (HTTP y HTTPS) con default_server.
  • Permitir sólo el ACME challenge y devolver 404 para todo lo demás.

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

Prerrequisitos

  • DNS: A/AAAA de blackhole.tudominio.com al Nginx.
  • Puertos 80/443 abiertos al Nginx.
  • Acceso root o sudo.
  • Nginx instalado.
  • Certbot (o tu cliente ACME preferido). Ejemplos con webroot.

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 [email protected] --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

  • HTTP (host inventado):
curl -i -H "Host: noexiste.tudominio.com" http://TU_IP

Debe devolver HTTP/1.1 404 Not Found.

  • HTTPS (SNI apuntando a un host inventado):
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

  • No uses HSTS en el “blackhole”; no aporta y puede anclar políticas innecesarias.
  • Si el ruido en logs es alto, puedes desactivar el access_log:

    access_log off;
  • Si necesitas “cortar” conexiones en lugar de 404, existe return 444;, pero aquí mantenemos 404 como pediste.
  • El orden de los archivos en sites-enabled no afecta a la selección por default_server; lo importante es el flag en listen.

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.

Compartir:

Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.