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.
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.
| Elección de enrutamiento | Anycast global | Anycast regional + GeoDNS |
|---|---|---|
| Respuesta DNS | La misma IP de CDN para todos. | Una IP de CDN distinta para cada grupo regional seleccionado. |
| Anuncios BGP | Todos los nodos perimetrales anuncian el mismo prefijo. | Los nodos perimetrales de cada grupo anuncian el prefijo de ese grupo. |
| Falla un nodo perimetral | Retira 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 falla | Otra 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 elegirlo | Quieres 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 poolQué 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.
| Derivar | Qué hacer | Comprueba antes de comprometerse |
|---|---|---|
| Alquila un bloque con tu propio ASN | Alquila 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 proveedor | Pide 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 registro | Solicita 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 existente | Compra 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 communitiesPrepara 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.17Instala 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/cdnConserva 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.targetOrdena 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.10Configura 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 transitEmite 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-interactiveRecarga 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.timerConfigura 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-okAnuncia 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.80Añ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.
| Configuración | París | Nueva York |
|---|---|---|
| ID de router BIRD | 198.51.100.10 | 198.51.100.20 |
| Dirección de origen BGP | 198.51.100.10 | 198.51.100.20 |
| Vecino BGP | 198.51.100.1 | 198.51.100.17 |
| NGINX X-Edge-Id | paris-1 | new-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-pagerPrueba 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.svgRetira 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.
| Ubicación de las consultas | Respuesta DNS para cdn.example.com | Nodos perimetrales que anuncian esa IP |
|---|---|---|
| Europa | EU_CDN_IP | París y Frankfurt, utilizando EU_PREFIX/24. |
| América del Norte | US_CDN_IP | Nueva York y Chicago, utilizando US_PREFIX/24. |
| Predeterminado / respaldo | GLOBAL_CDN_IP | El 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.
| Problema | Qué observarás | Qué hacer |
|---|---|---|
| GeoDNS dirige a los clientes a un grupo no disponible | Las 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 enrutamiento | Algunas 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 proveedor | Los 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 reinicia | El 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 privado | Los 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 PoPs | Solo 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 inestablemente | Un 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 retorno | Las 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 enlace | Los 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 /24 | Retirar 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é.