Adios
BlogRed

Red

Crea una CDN Anycast

Crea una CDN Anycast con BIRD y NGINX: consigue un /24, guarda HTTPS en caché, prueba la conmutación por error y añade grupos Anycast regionales con GeoDNS.

Equipo de AdiosActualizado 26 de septiembre de 202625 min de lectura

Para crear una CDN Anycast, anuncia el mismo prefijo IP desde varias ubicaciones y ejecuta una caché HTTPS en cada una. Usaremos BIRD para BGP y NGINX para la caché; después mostraremos cómo agrupar los nodos perimetrales en grupos Anycast regionales seleccionados mediante GeoDNS.

Elige Anycast global o Anycast regional con GeoDNS

Anycast global usa una IP de servicio en todos tus nodos perimetrales. El DNS devuelve esa IP; BGP selecciona el nodo receptor según la política de red y las rutas disponibles. Los aciertos de caché se atienden allí. Los fallos de caché van al origen y pueden llenar la caché de ese nodo.

Anycast regional con GeoDNS añade un paso de selección. Cada grupo regional tiene una IP de servicio distinta, compartida por los nodos perimetrales del grupo. GeoDNS devuelve una IP regional; BGP selecciona un nodo que la anuncie. Esto permite elegir un grupo regional antes de que el enrutamiento de Internet elija el servidor.

Dos formas de enrutar solicitudes a una CDN Anycast
Elección de enrutamientoAnycast globalAnycast regional + GeoDNS
Respuesta DNSLa misma IP de CDN para todos.Una IP de CDN distinta para cada grupo regional seleccionado.
Anuncios BGPTodos los nodos perimetrales anuncian el mismo prefijo.Los nodos perimetrales de cada grupo anuncian el prefijo de ese grupo.
Falla un nodo perimetralRetira su ruta; los demás nodos que la anuncian siguen disponibles.Retira su ruta; otro nodo perimetral del mismo grupo puede recibir conexiones nuevas.
Una región entera fallaOtra región que anuncie la ruta puede recibir el tráfico tras la convergencia.El DNS debe seleccionar un grupo de respaldo saludable. Las respuestas DNS en caché pueden seguir apuntando al grupo averiado.
Cuándo elegirloQuieres una IP estable y un grupo global.Quieres seleccionar explícitamente un grupo regional, tener capacidad independiente o usar orígenes regionales distintos.

DNS selects an IP; BGP selects an edge; NGINX serves or fills the cache

GLOBAL ANYCAST
cdn.example.com -> one IP -> BGP -> Paris or New York cache
                                              |
                                         cache miss
                                              v
                                            origin

REGIONAL ANYCAST + GEODNS
cdn.example.com -> GeoDNS -> Europe IP -> BGP -> Paris / Frankfurt
                         -> US IP     -> BGP -> New York / Chicago
                         -> default   -> chosen fallback pool

Qué necesitas para la primera configuración

Empieza con la configuración global: dos servidores Debian 12 nuevos con systemd, BIRD 2, NGINX y BGP del cliente; un IPv4 /24 autorizado y un ASN de origen acordado; un origen HTTPS en una IP independiente; y un dominio cuyo DNS controles. Los ejemplos asumen peers BGP directos. Tu proveedor de tránsito debe proporcionar los valores reales de la conexión.

Presupuesta el espacio de direcciones y los acuerdos sobre el ASN, ambos servidores perimetrales, el tráfico de salida, el tráfico del origen, las comprobaciones de salud DNS y la supervisión. Pide presupuestos actuales y confirma que puedes usar BGP antes de contratar. Las direcciones siguientes son ejemplos de documentación; sustitúyelas por las tuyas. Mide los tiempos de despliegue y fallo en tu propia red.

Consigue un /24 y permiso para anunciarlo

Para tus propios anuncios IPv4 en Internet público, /24 es el tamaño mínimo práctico de bloque: 256 direcciones. Una mayor longitud de prefijo significa un bloque más pequeño: /25 contiene 128 direcciones y /26 contiene 64. Estos bloques pequeños suelen filtrarse. Confirma que ambas ubicaciones de alojamiento admiten BGP del cliente y aceptarán tu prefijo antes de comprarlo o alquilarlo.

Puedes alquilar un bloque con tu propio ASN, pedir espacio a un proveedor, solicitarlo directamente a un registro o comprar un bloque existente a su titular.

Formas de obtener un IPv4 /24
DerivarQué hacerComprueba antes de comprometerse
Alquila un bloque con tu propio ASNAlquila un /24 y pide al titular que autorice a tu ASN a originarlo. Tramita el ASN por separado si aún no tienes uno.Confirma las actualizaciones de ROA e IRR, el permiso para anunciar desde ambos PoPs y las condiciones de renovación y salida del alquiler.
Solicitar un bloque asignado por el proveedorPide a un proveedor como Vultr espacio de direcciones que pueda enrutar para tu configuración BGP en las ubicaciones que necesitas.Confirma si hay disponible un /24 completo, qué ASN lo origina y si puedes anunciarlo fuera de la red del proveedor.
Solicita directamente a un registroSolicita una asignación a tu registro regional de Internet. RIPE NCC tiene una lista de espera para /24 destinada a los LIR que cumplan los requisitos y nunca hayan recibido una asignación IPv4.Esta es una asignación en el marco de la política de registro. Pagar cuotas de membresía no garantiza un bloque o una fecha de entrega.
Comprar un bloque existenteCompra a un titular que venda su bloque, directamente o mediante un intermediario o mercado, y completa después el proceso de transferencia del registro.Comprueba la autoridad del vendedor, los requisitos de transferencia, las tarifas, el historial de enrutamiento y abuso, y la aceptación del proveedor de tránsito antes de pagar.

Haz que el bloque sea enrutable

Acuerda el ASN de origen con tus proveedores de tránsito. Si necesitas tu propio ASN, solicítalo a tu registro regional o a un proveedor patrocinador según los requisitos de ese registro. El ASN identifica la red que origina tu prefijo; es independiente del alquiler o la transferencia de direcciones.

Pide al titular del recurso que autorice ese ASN en RPKI: crea un ROA para el /24 con longitud máxima /24. Añade el objeto de ruta IRR correspondiente donde lo exija el proveedor de tránsito y proporciona una carta de autorización si se solicita. Un ROA autoriza el enrutamiento; no anuncia la ruta por ti.

Envía esta solicitud a ambos proveedores de alojamiento. No empieces la configuración del servidor hasta que confirmen que aceptan el prefijo y te proporcionen los ajustes del peer.

Information to exchange with each upstream

Our prefix:       [your /24]
Our origin ASN:   [your ASN]
Locations:        Paris and New York, announced simultaneously

Please confirm:
- Prefix accepted; required ROA, IRR record, and authorization
- Peer IP, peer ASN, local source IP, and any BGP password
- Direct or multihop peering
- Replies sourced from our /24 are allowed
- Global export policy and available regional communities

Prepara el primer servidor perimetral

Colocaremos el primer nodo perimetral en París y el segundo en Nueva York. Cada ubicación es un punto de presencia o PoP. Ambos reciben la misma IP de CDN; cada uno conserva su dirección unicast para SSH y solicitudes al origen.

Sustituye todas las direcciones, los ASN y los nombres example.com siguientes. Son valores de documentación, no direcciones que puedas anunciar. El ejemplo asume peers BGP conectados directamente; usa los ajustes multihop del proveedor si los necesitas.

Address plan

cdn.example.com → 203.0.113.80
                       |
                 BGP chooses a PoP
                  /             \
             Paris cache     New York cache
                  \             /
                   cache misses
                        |
              origin.example.com
                 192.0.2.10:443

Prefix:              203.0.113.0/24
CDN IP on BOTH PoPs:  203.0.113.80/32
Origin ASN:          64496
Upstream ASN:        64497
Paris node / peer:   198.51.100.10 / 198.51.100.1
New York / peer:     198.51.100.20 / 198.51.100.17

Instala los paquetes y asigna la dirección de CDN

Ejecuta esto en París. El /32 asigna localmente la dirección de CDN; la ruta blackhole que cubre el prefijo descarta paquetes destinados a direcciones no usadas del /24. La unidad systemd siguiente restaura ambos tras un reinicio, antes de que arranquen BIRD y NGINX.

Permite HTTPS hacia la IP de CDN y el puerto TCP 179 de BGP desde el peer de tu proveedor. Mantén el acceso de gestión en la dirección unicast. Esta configuración de proxy inverso no necesita reenvío de paquetes de Linux.

Paris shell

sudo apt-get update
sudo apt-get install -y bird2 nginx curl ca-certificates iproute2 python3
sudo install -d -o www-data -g www-data /var/cache/nginx/cdn

Conserva la dirección entre reinicios

Guarda esta unidad con tu IP de servicio y tu prefijo reales. Añade una interfaz dummy dedicada y conserva la configuración unicast existente del servidor.

/etc/systemd/system/cdn-address.service

[Unit]
Description=CDN service address
Before=bird.service nginx.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/sbin/ip link add anycast0 type dummy
ExecStart=/usr/sbin/ip address replace 203.0.113.80/32 dev anycast0
ExecStart=/usr/sbin/ip link set anycast0 up
ExecStart=/usr/sbin/ip route replace blackhole 203.0.113.0/24

[Install]
WantedBy=multi-user.target

Ordena los servicios después de configurar la dirección

Añade la dependencia a ambos servicios, inicia la unidad de dirección y comprueba la ruta hacia el origen. Debe usar la red unicast, no anycast0.

Paris shell

for service in bird nginx; do
  sudo mkdir -p /etc/systemd/system/$service.service.d
  sudo tee /etc/systemd/system/$service.service.d/cdn-address.conf >/dev/null <<'EOF'
[Unit]
Requires=cdn-address.service
After=cdn-address.service
EOF
done

sudo systemctl daemon-reload
sudo systemctl enable --now cdn-address
ip address show dev anycast0
ip route get 192.0.2.10

Configura BIRD para anunciar el /24

Guarda esto como /etc/bird/bird.conf en París. El filtro de exportación permite solo tu /24. El protocolo estático empieza desactivado para que el servidor no anuncie nada hasta que funcione HTTPS. BIRD mantiene esta ruta en su propia tabla de enrutamiento; la ruta blackhole de Linux se configuró antes por separado.

/etc/bird/bird.conf

router id 198.51.100.10;

protocol device {
  scan time 10;
}

protocol static cdn_prefix {
  disabled yes;
  ipv4;
  route 203.0.113.0/24 blackhole;
}

filter export_cdn {
  if net = 203.0.113.0/24 then accept;
  reject;
}

protocol bgp transit {
  local as 64496;
  source address 198.51.100.10;
  neighbor 198.51.100.1 as 64497;
  graceful restart off;

  ipv4 {
    import none;
    export filter export_cdn;
  };
}

Consultar la sesión BGP

Añade la autenticación o la configuración multihop que requiera el proveedor antes de empezar. Deberías ver Established sin ningún prefijo de CDN exportado todavía. Si la sesión sigue caída, comprueba la dirección del peer, el ASN, el firewall y la autenticación con tu proveedor de tránsito.

Validate and load the configuration

sudo bird -p -c /etc/bird/bird.conf
sudo systemctl enable --now bird
sudo birdc configure
sudo birdc show protocols all transit
sudo birdc show route export transit

Emite certificados HTTPS

Usa DNS-01 para emitir el certificado de CDN antes de anunciar la IP. Este es un ejemplo de Certbot para una zona alojada en Cloudflare DNS. Usa el plugin DNS correspondiente de Certbot si tu zona está en otro proveedor. El proxy de Cloudflare permanece desactivado para el registro de CDN.

Crea un token de API DNS restringido a la zona necesaria con el permiso Zone:DNS:Edit. En cada nodo perimetral, guárdalo como dns_cloudflare_api_token = YOUR_TOKEN en /root/.secrets/cloudflare.ini, con permisos 700 para el directorio y 600 para el archivo. Emite los certificados de los dos nodos de uno en uno y mantén las credenciales fuera del control de versiones.

Run on each edge; replace the hostname and email

sudo apt-get install -y certbot python3-certbot-dns-cloudflare
sudo install -d -m 700 /root/.secrets
sudo touch /root/.secrets/cloudflare.ini
sudo chmod 600 /root/.secrets/cloudflare.ini
sudoedit /root/.secrets/cloudflare.ini

sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  --cert-name cdn.example.com -d cdn.example.com \
  --email ops@example.com --agree-tos --non-interactive

Recarga NGINX después de la renovación

Cuando la configuración NGINX siguiente supere nginx -t, instala este hook de despliegue y comprueba el temporizador de renovación en cada nodo perimetral. Los certificados independientes pueden servir el mismo nombre de host; no necesitan compartir una clave privada. A medida que crezca la flota, centraliza la emisión y la distribución segura para reducir la exposición de credenciales DNS y coordinar las renovaciones.

Enable renewal after configuring NGINX

sudo install -d /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx >/dev/null <<'EOF'
#!/bin/sh
set -eu
/usr/sbin/nginx -t
/usr/bin/systemctl reload nginx
EOF
sudo chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
sudo systemctl enable --now certbot.timer
sudo certbot renew --dry-run --run-deploy-hooks
systemctl list-timers certbot.timer

Configura HTTPS y la caché perimetral

Usa la IP independiente del origen en cdn_origin y el nombre de host de su certificado en proxy_ssl_name. En el origen, sirve /assets/logo.v1.svg con Cache-Control: public, max-age=60, s-maxage=300 y un ETag. Sirve también /cdn-probe.txt con el cuerpo origin-ok y Cache-Control: no-store.

Guarda esta configuración completa en /etc/nginx/conf.d/cdn.conf, incluido dentro del bloque http de NGINX. Solo guarda en caché /assets/. Las demás rutas van directamente al origen.

/etc/nginx/conf.d/cdn.conf

proxy_cache_path /var/cache/nginx/cdn
  levels=1:2 keys_zone=cdn:50m max_size=10g
  inactive=60m use_temp_path=off;

map "$http_authorization$http_cookie" $skip_private {
  default 1;
  ""      0;
}

upstream cdn_origin {
  server 192.0.2.10:443;
  keepalive 32;
}

server {
  listen 203.0.113.80:443 ssl;
  server_name cdn.example.com;

  ssl_certificate     /etc/letsencrypt/live/cdn.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/cdn.example.com/privkey.pem;
  ssl_protocols TLSv1.2 TLSv1.3;

  if ($host != cdn.example.com) { return 421; }

  proxy_http_version 1.1;
  proxy_set_header Connection "";
  proxy_set_header Host origin.example.com;
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_ssl_server_name on;
  proxy_ssl_name origin.example.com;
  proxy_ssl_verify on;
  proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
  proxy_ssl_verify_depth 3;
  proxy_connect_timeout 3s;
  proxy_read_timeout 15s;

  proxy_hide_header X-Edge-Id;
  proxy_hide_header X-Cache;
  add_header X-Edge-Id "paris-1" always;
  add_header X-Cache $upstream_cache_status always;

  location = /__edge/health {
    default_type text/plain;
    return 200 "edge-ok\n";
  }

  location ^~ /assets/ {
    proxy_pass https://cdn_origin;
    proxy_cache cdn;
    proxy_cache_key "$scheme|$host|$request_uri";
    proxy_cache_methods GET HEAD;
    proxy_cache_bypass $skip_private $http_cache_control $http_pragma;
    proxy_no_cache $skip_private $http_cache_control $http_pragma
                   $upstream_http_set_cookie;
    proxy_cache_lock on;
    proxy_cache_revalidate on;
  }

  location / {
    proxy_pass https://cdn_origin;
  }
}

Da al origen respuestas de prueba predecibles

Para un origen NGINX, añade estas ubicaciones a su servidor HTTPS existente de origin.example.com. Proporcionan un recurso que se puede guardar en caché y una sonda sin caché, sin modificar la aplicación. Usa el certificado válido propio del origen y confirma que su registro de acceso incluye ambas rutas.

Inside the origin’s HTTPS server block

location = /assets/logo.v1.svg {
  default_type image/svg+xml;
  add_header Cache-Control "public, max-age=60, s-maxage=300";
  add_header ETag '"cdn-demo-v1"';
  return 200 '<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80"><rect width="80" height="80" fill="blue"/></svg>';
}

location = /cdn-probe.txt {
  default_type text/plain;
  add_header Cache-Control "no-store";
  return 200 "origin-ok\n";
}

Qué almacenará esta caché

El recurso de prueba permanece vigente en una caché compartida durante 300 segundos por s-maxage. inactive=60m controla la expulsión de objetos sin uso, no su vigencia. La clave distingue los nombres de host y las cadenas de consulta. Las solicitudes con cookies o autorización evitan la caché; NGINX también respeta el tratamiento de respuestas private, no-store, Set-Cookie y Vary.

Cada PoP tiene su propia caché de disco. Usa URLs de recursos con versión para las publicaciones. Esta configuración no ofrece una API de purga global ni obliga a servir contenido obsoleto cuando falla el origen.

Activa el primer PoP

Ejecuta las dos comprobaciones HTTPS en París. --resolve conecta a su dirección local de CDN y conserva el nombre de host para TLS. Ambas solicitudes deben funcionar con certificados válidos y los cuerpos esperados antes de activar la ruta.

Check the edge and the origin path

sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx

curl --fail --show-error --max-time 3 \
  --resolve cdn.example.com:443:203.0.113.80 \
  https://cdn.example.com/__edge/health
# Expected body: edge-ok

curl --fail --show-error --max-time 5 \
  --resolve cdn.example.com:443:203.0.113.80 \
  https://cdn.example.com/cdn-probe.txt
# Expected body: origin-ok

Anuncia la ruta y configura el DNS

Cuando las comprobaciones sean correctas, activa cdn_prefix y pide al proveedor de tránsito que confirme que acepta y propaga el /24. Configura el registro A del nombre de host con la IP de CDN. Usa el modo de solo DNS si tu proveedor DNS también ofrece un proxy CDN. Prueba HTTPS desde una red externa antes de continuar.

Enable export, then create the DNS record

sudo birdc enable cdn_prefix
sudo birdc show route export transit

# DNS record, using your real hostname and IP:
# cdn.example.com.  300  IN  A  203.0.113.80

Añade el segundo PoP

Repite la configuración en Nueva York. Conserva el /24, la IP de CDN, el ASN de origen, el nombre de host, el origen y las reglas de caché. Cambia los valores siguientes, instala un certificado válido y supera las comprobaciones locales de HTTPS antes de activar cdn_prefix. Usa el ASN real del peer y los ajustes de esa ubicación si son diferentes.

Valores que cambian entre los dos PoPs
ConfiguraciónParísNueva York
ID de router BIRD198.51.100.10198.51.100.20
Dirección de origen BGP198.51.100.10198.51.100.20
Vecino BGP198.51.100.1198.51.100.17
NGINX X-Edge-Idparis-1new-york-1

Confirma que ambas ubicaciones atienden solicitudes

Mantén el DNS sin cambios. Comprueba el nombre de host público desde varias redes e inspecciona X-Edge-Id. Para comprobar un PoP concreto, ejecuta curl --resolve en ese propio servidor; usar la IP Anycast desde tu portátil no puede forzar París ni Nueva York.

Retira automáticamente los nodos perimetrales no saludables

Una sesión BGP activa no significa que HTTPS funcione. Instala el controlador de salud de ejemplo en cada nodo perimetral cuando ambos hayan superado las comprobaciones locales. Comprueba la IP de CDN de ese nodo con el nombre de host TLS correcto, retira cdn_prefix tras tres fallos consecutivos y exige 30 segundos de salud continua más una espera de 60 segundos tras la retirada antes de volver a anunciarlo.

La unidad systemd intenta retirar la ruta cuando termina el controlador, lo reinicia tras una caída y usa un watchdog si el bucle se bloquea. Cada ciclo vuelve a leer el estado del protocolo de BIRD. Estos archivos comprueban TLS local y la respuesta de NGINX; supervisa por separado el almacenamiento de caché, el acceso al origen y el enrutamiento público. Una caída del origen compartido no debería retirar automáticamente todos los nodos que todavía puedan servir contenido en caché.

Download and inspect the files before installing

curl --fail --show-error --remote-name \
  https://adios.dev/examples/anycast-cdn/edge-health.py
curl --fail --show-error --remote-name \
  https://adios.dev/examples/anycast-cdn/edge-health.service

# Review both files, then install on the dedicated example edge.
sudo install -m 755 edge-health.py /usr/local/sbin/edge-health.py
sudo install -m 644 edge-health.service /etc/systemd/system/edge-health.service
sudo tee /etc/default/edge-health >/dev/null <<'EOF'
CDN_HOST=cdn.example.com
CDN_IP=203.0.113.80
EOF
# Replace these documentation values before starting.
sudoedit /etc/default/edge-health
sudo systemctl daemon-reload
sudo systemctl enable --now edge-health
sudo journalctl -u edge-health -n 30 --no-pager

Prueba los aciertos de caché y la conmutación por error

En cada PoP, solicita dos veces el recurso de prueba. Una clave nueva debería producir MISS y después HIT. Comprueba en el registro de acceso del origen que la segunda solicitud no llega hasta él. Un HIT inicial significa que la clave ya está en caché.

Run locally on each edge

for attempt in 1 2; do
  curl --silent --show-error --fail --max-time 10 \
    --resolve cdn.example.com:443:203.0.113.80 \
    -D - -o /dev/null https://cdn.example.com/assets/logo.v1.svg
done

# This request should report X-Cache: BYPASS.
curl --silent --show-error --fail --max-time 10 \
  --resolve cdn.example.com:443:203.0.113.80 \
  -H 'Cookie: session=cdn-test' -D - -o /dev/null \
  https://cdn.example.com/assets/logo.v1.svg

Retira un PoP

Desde una red externa que actualmente llegue a París, sigue creando conexiones HTTPS nuevas. Detén el controlador de salud antes de desactivar manualmente la ruta para que no pueda reactivarla. Comprueba que las solicitudes correctas acaban identificando Nueva York. Registra los fallos y el tiempo transcurrido; las conexiones existentes pueden necesitar reconectarse.

Run on Paris while watching an external probe

sudo systemctl stop edge-health
sudo birdc disable cdn_prefix
sudo birdc show route export transit

# After local HTTPS checks pass again:
sudo systemctl start edge-health
# The controller waits for sustained health before advertising.

Prueba un fallo de servicio y un reinicio

Con el controlador activo y la ruta anunciada, detén NGINX en París. Confirma que el controlador retira cdn_prefix y que las solicitudes externas pasan a Nueva York. Vuelve a iniciar NGINX y comprueba que la espera de recuperación impide volver a anunciar inmediatamente. Repite en el otro nodo perimetral.

Reinicia un nodo perimetral mientras el otro atiende tráfico. Comprueba que la dirección dummy, la sesión BIRD, el certificado, la caché y el controlador se recuperan en orden. Mide el comportamiento con caché caliente y fría en el nodo superviviente. Registra los resultados observados con las versiones de software y las redes de las sondas; no asumas un tiempo fijo de convergencia BGP.

Run on one edge while probing from another network

sudo systemctl stop nginx
# Wait for the controller's failure threshold; check the journal and route.
sudo journalctl -u edge-health -n 30 --no-pager
sudo birdc show route export transit
sudo systemctl start nginx
# Watch recovery, then repeat the test with a planned reboot.

Añade grupos Anycast regionales con GeoDNS

Crea al menos dos nodos perimetrales por grupo regional con la misma configuración BIRD, TLS y de caché. Asigna una IP de servicio a Europa y otra a Norteamérica. Dentro de un grupo, cada nodo anuncia el mismo prefijo. Cada grupo IPv4 enrutado de forma independiente necesita su propio prefijo aceptado, normalmente un /24; dos IPs de un /24 compartido no proporcionan rutas regionales BGP independientes.

Cambia la dirección de la interfaz dummy, la ruta que cubre el prefijo, el filtro de prefijo/exportación de BIRD, la dirección de escucha de NGINX y CDN_IP del controlador para que correspondan al grupo. Mantén las direcciones de gestión y de origen fuera de esos prefijos de servicio. Todos los grupos sirven el mismo nombre de host de CDN, con certificados válidos y reglas de caché iguales. Configura el origen por grupo si tu aplicación necesita backends regionales.

Ejemplo de política GeoDNS con un grupo global de respaldo
Ubicación de las consultasRespuesta DNS para cdn.example.comNodos perimetrales que anuncian esa IP
EuropaEU_CDN_IPParís y Frankfurt, utilizando EU_PREFIX/24.
América del NorteUS_CDN_IPNueva York y Chicago, utilizando US_PREFIX/24.
Predeterminado / respaldoGLOBAL_CDN_IPEl grupo global, con su GLOBAL_PREFIX/24 independiente.

Crea los registros GeoDNS

En un servicio GeoDNS como Route 53, crea registros A de geolocalización con el mismo nombre, cdn.example.com, e identificadores de registro distintos. Configura Europe con EU_CDN_IP, North America con US_CDN_IP y Default con GLOBAL_CDN_IP. Esos valores son marcadores para tus direcciones reales. Empieza con un TTL de 60 segundos y mide el comportamiento del resolvedor.

Si trasladas el DNS autoritativo de Cloudflare a Route 53, cambia también la emisión de certificados al plugin DNS de Route 53 o delega expresamente la zona del desafío ACME. El plugin anterior de Cloudflare requiere controlar los registros autoritativos del desafío.

Asocia cada registro a la salud de su grupo. En Route 53, una coincidencia geográfica no saludable puede recurrir a un registro geográfico más amplio y después al predeterminado. Mantén el grupo global de respaldo saludable y con capacidad suficiente para absorber el tráfico regional. Si alojas juntos grupos globales y regionales, configura y supervisa sus prefijos por separado; el controlador de ejemplo gestiona un prefijo por instancia.

Comprueba la salud del grupo y prueba las dos vías de fallo

Combina las comprobaciones de nodos perimetrales individuales por sus rutas unicast con sondas externas de la IP regional de servicio. Una sonda a una IP Anycast puede seguir funcionando tras el fallo de un nodo porque alcanza otro. Retira el grupo del DNS cuando no pueda servir tráfico, en lugar de hacerlo cada vez que falle uno de sus miembros.

Retira primero un nodo perimetral: la IP regional debería seguir funcionando a través de otro nodo del grupo. Después deja todo el grupo fuera de servicio en una prueba controlada: las nuevas respuestas DNS deben seleccionar el respaldo. Prueba tanto las consultas nuevas como los clientes que conservan la respuesta anterior. Los cambios DNS no pueden trasladar una conexión existente ni sustituir inmediatamente todas las respuestas en caché.

GeoDNS estima la ubicación a partir del resolvedor recursivo o de una indicación EDNS Client Subnet. Prueba desde varias redes reales, incluidos los resolvedores públicos. No trates un registro predeterminado como una garantía ante fallos: Route 53 puede devolver registros no saludables cuando todas las opciones elegibles fallan las comprobaciones de salud.

Run from machines in each target region

dig +short cdn.example.com A
curl --silent --show-error --fail --max-time 10 \
  -D - -o /dev/null https://cdn.example.com/assets/logo.v1.svg

# Record: DNS answer, X-Edge-Id, X-Cache, errors, and timing.
# Repeat during one-edge withdrawal and during whole-pool failure.

Otras configuraciones de enrutamiento

También puedes combinar nodos anunciados globalmente con nodos cuyas rutas un proveedor de tránsito exporte solo a redes seleccionadas. Configúralo con las comunidades BGP documentadas del proveedor y verifica externamente el alcance. NO_EXPORT se refiere a los límites de AS, no a continentes. Es una política de enrutamiento independiente de la selección de grupos regionales mediante GeoDNS.

Si un proveedor de alojamiento no puede establecer una sesión BGP, un proveedor de tránsito puede anunciar tu prefijo y entregar el tráfico mediante túneles. Comprueba el enrutamiento de retorno y la MTU, y coloca una caché en cada ubicación receptora. Enviar todos los túneles a una única caché lejana mantiene esa caché y sus enlaces en la ruta de cada solicitud.

Mantén la CDN en funcionamiento

Supervisa cada PoP tanto por su ruta unicast de gestión como por la IP Anycast pública. De lo contrario, una ubicación averiada puede desaparecer de tus comprobaciones cuando el enrutamiento envíe todas las sondas a una ubicación saludable.

Problemas que debes vigilar al crecer la CDN
ProblemaQué observarásQué hacer
GeoDNS dirige a los clientes a un grupo no disponibleLas consultas nuevas o las respuestas en caché siguen llegando a una región averiada.Comprueba la salud del grupo, la política predeterminada, la caché del resolvedor y la capacidad de respaldo. Prueba el fallo de toda una región por separado de la retirada de un solo nodo perimetral.
Cambios en el alquiler, el ROA o los registros de enrutamientoAlgunas redes dejan de alcanzar el prefijo mientras que las sesiones de BGP permanecen en pie.Controla las fechas de renovación y la validez de RPKI. Vuelve a comprobar la autorización antes de cambiar el ASN o el proveedor de tránsito. Prevé un período de solapamiento al renumerar el espacio alquilado.
Cambios de tráfico después de un cambio de proveedorLos clientes llegan a un PoP lejano o sobrecargan una ubicación pequeña.Mide el ID del nodo perimetral y la latencia desde varias redes de acceso. Revisa la política y el alcance del proveedor de tránsito antes de ajustar las comunidades o el prepending.
Un PoP falla o su caché se reiniciaEl nodo perimetral superviviente o el origen recibe un pico repentino de tráfico.Prueba la capacidad de conmutación por error con una caché fría. Prevé suficiente ancho de banda y margen de disco; añade una capa de protección del origen cuando la duplicación de cargas de caché lo justifique.
Se guarda en caché contenido antiguo o privadoLos usuarios ven versiones obsoletas o la respuesta de otro usuario.Usa recursos con versión. Prueba el comportamiento de Cookie, Authorization, private, no-store y Set-Cookie después de los cambios. Si añades un sistema de purga, permite observar su entrega.
Un despliegue o certificado difiere entre PoPsSolo algunas redes ven fallos TLS, errores o comportamientos antiguos.Despliega primero en un solo PoP. Comprueba la caducidad del certificado, la versión de configuración y las respuestas HTTPS reales en cada nodo antes de ampliar el despliegue.
El controlador de salud falla o alterna inestablementeUn nodo perimetral averiado sigue anunciando la ruta, o los clientes cambian repetidamente de ubicación.Supervisa el controlador, exige períodos de espera para la recuperación y prueba su watchdog. Coordina el comportamiento graceful-restart con el proveedor de tránsito.
Falla un túnel o una ruta de retornoLas pequeñas solicitudes funcionan pero las grandes transferencias se estancan, o las respuestas nunca llegan.Comprueba la MTU, el descubrimiento de MTU de la ruta, el enrutamiento de retorno y los filtros de dirección de origen. Prueba descargas grandes después de cambiar un túnel o proveedor.
Un ataque satura el enlaceLos servidores saludables se vuelven inaccesibles antes de que ayuden los límites HTTP.Acuerda la mitigación con el proveedor de tránsito y conoce su proceso de activación. Restringe el acceso al origen y controla el tráfico de salida y el que evita la caché.
Varios servicios comparten el mismo /24Retirar la ruta por el fallo de un servicio también traslada los servicios saludables.Define la política de salud de cada servicio que use el prefijo. Usa prefijos enrutables independientes cuando los servicios necesiten retiradas independientes.

Tu primera CDN que funciona

Estás listo para añadir tráfico cuando ambos PoPs sirvan HTTPS válido, cada uno demuestre MISS y después HIT, las respuestas privadas permanezcan fuera de la caché y retirar cualquiera de las rutas traslade las nuevas solicitudes al nodo superviviente. Empieza con recursos estáticos públicos y mide la carga del origen antes de añadir más rutas que se puedan guardar en caché.

Todos los artículos