Icono del sitio Binario 0

Implementación de HTTP/3 y QUIC en Nginx con TLS 1.3

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

HTTP/3 y QUIC representan la evolución del protocolo web para mejorar la velocidad, la eficiencia y la resiliencia de las conexiones. HTTP/3 se basa en QUIC, un protocolo de transporte sobre UDP, que reemplaza el tradicional TCP utilizado por HTTP/1.1 y HTTP/2. Entre sus principales ventajas se incluyen:

Nginx ha incorporado soporte para HTTP/3 y QUIC en su línea principal (mainline), aunque algunas funcionalidades requieren builds específicos o parches adicionales.

Contexto y directivas de configuración

La configuración de HTTP/3 y QUIC en Nginx se organiza en distintos contextos, que determinan dónde se puede ubicar cada directiva:

DirectivaContextoFunción
http3 on/offhttp, serverHabilita la negociación del protocolo HTTP/3.
http3_hq on/offhttp, serverHabilita HTTP/0.9 para pruebas de interoperabilidad QUIC.
http3_max_concurrent_streams numberhttp, serverMáximo de streams HTTP/3 concurrentes por conexión.
http3_stream_buffer_size sizehttp, serverTamaño del buffer para lectura/escritura de streams QUIC.
quic_active_connection_id_limit numberhttp, serverLímite de IDs de conexión activas en el servidor.
quic_bpf on/offmainPermite la migración de conexiones QUIC mediante eBPF (Linux ≥5.7).
quic_gso on/offhttp, serverOptimiza el envío en lotes usando UDP_SEGMENT.
quic_host_key filehttp, serverClave secreta para tokens de validación y resets sin estado.
quic_retry on/offhttp, serverHabilita retry de QUIC para validación de dirección.
ssl_early_data on/offhttp, server, locationHabilita 0-RTT en TLS 1.3.

Configuración general

A continuación, se presenta un ejemplo completo de configuración mínima de Nginx con soporte HTTP/3 y QUIC:

# --- MAIN CONTEXT ---
worker_processes auto;
error_log /var/log/nginx/error.log notice;

quic_bpf off;  # requiere Linux ≥5.7

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;

        log_format quic '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$http3"';

    access_log /var/log/nginx/access.log quic;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # --- HTTP/3 & QUIC ---
    http3 on;
    http3_hq off;
    http3_max_concurrent_streams 128;
    http3_stream_buffer_size 64k;
    quic_active_connection_id_limit 2;
    quic_gso off;
    quic_retry off;

    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    server {
        listen 443 ssl http2;
        listen 443 quic reuseport;

        server_name ejemplo.com;

        ssl_certificate /etc/nginx/certs/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/privkey.pem;
        quic_host_key /etc/nginx/quic_host.key;

        ssl_early_data on;  # habilita 0-RTT

        add_header Alt-Svc 'h3=":443"; ma=86400; persist=1';
        add_header QUIC-Status $quic;

        root /var/www/html;
        index index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        location /static/ {
            ssl_early_data on;  # solo en recursos estáticos
        }

        location /login {
            ssl_early_data off;  # no permitir 0-RTT en rutas sensibles
        }
    }
}

Generación de la clave QUIC

QUIC requiere una clave secreta para tokens de validación y resets sin estado (quic_host_key). Se puede generar con OpenSSL:

openssl genpkey -algorithm X25519 -out /etc/nginx/quic_host.key
chown root:root /etc/nginx/quic_host.key
chmod 600 /etc/nginx/quic_host.key

Nota: La clave debe permanecer secreta y persistente. Si se cambia, los tokens generados con la clave anterior serán inválidos.

Pruebas y verificación

Para comprobar que el servidor soporta HTTP/3 y QUIC:

# Usando curl compilado con soporte HTTP/3
curl -I --http3 https://ejemplo.com/

Se puede verificar la cabecera Alt-Svc para confirmar que el navegador detecta HTTP/3:

curl -sI https://ejemplo.com | grep Alt-Svc

Consideraciones de seguridad

  1. Early Data (0-RTT): permite enviar peticiones antes de completar el handshake TLS. Esto incrementa el riesgo de ataques de repetición (replay attacks). Solo debe habilitarse en peticiones idempotentes, como recursos estáticos. Nunca en rutas de login o transacciones.
  2. QUIC y firewalls: QUIC utiliza UDP; asegúrate de abrir los puertos correspondientes (por defecto UDP/443).
  3. Compatibilidad kernel: Directivas como quic_bpf y quic_gso dependen de características del kernel Linux moderno (≥5.7 y soporte UDP_SEGMENT).
  4. Tokens y claves: La gestión de quic_host_key es crítica. Cambiarla invalida tokens activos; se recomienda rotación controlada solo si es necesario.

Conclusión

Integrar HTTP/3 y QUIC en Nginx permite mejorar significativamente el rendimiento de sitios web modernos, especialmente en entornos con alta latencia o clientes móviles. La correcta configuración de directivas, junto con TLS 1.3 y early data controlado, garantiza un equilibrio entre rendimiento y seguridad.

Este artículo proporciona una guía completa y un ejemplo de configuración listo para producción, que puede adaptarse según necesidades de virtualhosts, certificados y rutas específicas.

Salir de la versión móvil