Réseau
Construire un CDN Anycast
Construisez un CDN Anycast avec BIRD et NGINX : obtenez un /24, mettez HTTPS en cache, testez le basculement et ajoutez des pools Anycast régionaux avec GeoDNS.
Pour construire un CDN Anycast, annoncez le même préfixe IP depuis plusieurs sites et exécutez un cache HTTPS sur chacun. Nous utiliserons BIRD pour BGP et NGINX pour le cache, puis montrerons comment regrouper les nœuds en pools Anycast régionaux sélectionnés par GeoDNS.
Choisir Anycast global ou Anycast régional avec GeoDNS
Anycast global utilise une seule adresse IP de service sur tous vos nœuds. Le DNS renvoie cette adresse ; BGP sélectionne le nœud destinataire selon la politique réseau et les chemins disponibles. Si le contenu est en cache, il est servi sur place. Sinon, la requête atteint votre origine et peut alimenter le cache de ce nœud.
Anycast régional avec GeoDNS ajoute une étape de sélection. Chaque pool régional possède une adresse IP de service différente, partagée par ses nœuds. GeoDNS renvoie une adresse régionale ; BGP sélectionne un nœud qui l’annonce. Vous choisissez ainsi le pool régional avant que le routage Internet ne choisisse le serveur.
| Choix du routage | Anycast global | Anycast régional + GeoDNS |
|---|---|---|
| Réponse DNS | La même adresse IP de CDN pour tout le monde. | Une adresse IP de CDN différente pour chaque pool régional sélectionné. |
| Annonces BGP | Tous les nœuds annoncent le même préfixe. | Les nœuds de chaque pool annoncent le préfixe de ce pool. |
| Un nœud tombe en panne | Retirez sa route ; les autres nœuds qui l’annoncent restent disponibles. | Retirez sa route ; un autre nœud du même pool peut recevoir les nouvelles connexions. |
| Une région entière tombe en panne | Après convergence, une autre région qui annonce le préfixe peut recevoir le trafic. | Le DNS doit sélectionner un pool de secours opérationnel. Les réponses DNS en cache peuvent encore pointer vers le pool en panne. |
| Choisissez-le quand | Vous voulez une IP stable et un pool global. | Vous souhaitez sélectionner explicitement un pool régional, séparer les capacités ou utiliser des origines différentes selon les régions. |
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 poolCe qu’il faut pour la première mise en place
Commencez par la configuration globale : deux serveurs Debian 12 neufs avec systemd, BIRD 2, NGINX et BGP client ; un IPv4 /24 autorisé et un ASN d’origine convenu ; une origine HTTPS sur une adresse IP distincte ; et un domaine dont vous contrôlez le DNS. Les exemples supposent des pairs BGP directs. Votre opérateur amont doit fournir les paramètres de peering réels.
Prévoyez le budget pour l’espace d’adressage et l’ASN, les deux serveurs périphériques, le trafic sortant, le trafic vers l’origine, les contrôles de santé DNS et la supervision. Demandez des devis à jour et confirmez l’éligibilité au BGP avant de commander. Les adresses ci-dessous sont des exemples de documentation : remplacez-les par les vôtres. Mesurez les délais de déploiement et de basculement sur votre réseau.
Obtenez un /24 et la permission de l'annoncer
Pour vos propres annonces IPv4 sur l’Internet public, /24 est la taille minimale de bloc utilisable en pratique : 256 adresses. Une longueur de préfixe plus élevée correspond à un bloc plus petit : /25 contient 128 adresses et /26 en contient 64. Ces blocs plus petits sont généralement filtrés. Avant d’acheter ou de louer le préfixe, confirmez que les deux sites d’hébergement prennent en charge le BGP client et l’accepteront.
Vous pouvez louer un bloc avec votre propre ASN, demander un espace d’adressage à un fournisseur, faire une demande directement auprès d’un registre ou acheter un bloc existant à son détenteur.
| Route | Que faire | Vérifier avant de s’engager |
|---|---|---|
| Louer un bloc avec votre propre ASN | Louez un /24 et demandez au détenteur d’autoriser votre ASN à l’annoncer comme origine. Obtenez l’ASN séparément si vous n’en possédez pas déjà un. | Confirmez les mises à jour ROA et IRR, l’autorisation d’annoncer depuis les deux PoP ainsi que les conditions de renouvellement et de résiliation de la location. |
| Demander un bloc attribué par le fournisseur | Demandez à un fournisseur comme Vultr un espace d’adressage qu’il peut router pour votre configuration BGP dans les zones dont vous avez besoin. | Confirmez la disponibilité d’un /24 complet, l’ASN qui l’annonce et la possibilité de l’annoncer en dehors du réseau de ce fournisseur. |
| Faire une demande directement auprès d’un registre | Demandez une allocation à votre registre Internet régional. RIPE NCC dispose d’une liste d’attente /24 pour les LIR éligibles qui n’ont jamais reçu d’allocation IPv4. | Il s’agit d’une allocation soumise à la politique du registre. Payer les cotisations ne garantit ni l’obtention d’un bloc ni une date de livraison. |
| Acheter un bloc existant | Achetez le bloc auprès de son détenteur, directement ou via un courtier ou une place de marché, puis suivez la procédure de transfert du registre. | Vérifiez que le vendeur dispose des droits requis, l’éligibilité au transfert, les frais, l’historique de routage et d’abus et l’acceptation par l’opérateur amont avant de payer. |
Rendre le bloc routable
Convenez de l’ASN d’origine avec vos opérateurs amont. Si vous avez besoin de votre propre ASN, faites une demande auprès de votre registre régional ou d’un fournisseur parrain, conformément aux critères d’éligibilité du registre. L’ASN identifie le réseau à l’origine de votre préfixe ; il est distinct de la location ou du transfert des adresses.
Demandez au détenteur de la ressource d’autoriser cet ASN dans RPKI : créez un ROA pour le /24 avec une longueur maximale /24. Ajoutez l’objet route IRR correspondant si votre opérateur amont l’exige et fournissez une lettre d’autorisation sur demande. Un ROA autorise le routage ; il n’annonce pas la route à votre place.
Envoyez cette demande aux deux hébergeurs. Ne commencez pas la configuration du serveur avant qu’ils aient confirmé l’acceptation du préfixe et fourni les paramètres du pair.
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 communitiesPréparer le premier serveur périphérique
Nous placerons le premier nœud à Paris et le second à New York. Chaque site est un point de présence, ou PoP. Les deux reçoivent la même adresse IP de CDN ; chacun conserve sa propre adresse unicast pour SSH et les requêtes vers l’origine.
Remplacez toutes les adresses, les ASN et les noms example.com ci-dessous. Ce sont des valeurs de documentation, pas des adresses que vous pouvez annoncer. L’exemple suppose des pairs BGP directement connectés ; utilisez les paramètres multihop de votre fournisseur si nécessaire.
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.17Installer les paquets et associer l’adresse du CDN
Exécutez ceci à Paris. Le /32 associe localement l’adresse du CDN ; la route blackhole couvrante supprime les paquets destinés aux adresses inutilisées du /24. L’unité systemd ci-dessous rétablit les deux après un redémarrage, avant le démarrage de BIRD et NGINX.
Autorisez HTTPS vers l’adresse IP du CDN et BGP sur le port TCP 179 depuis le pair de votre fournisseur. Gardez l’accès d’administration sur l’adresse unicast. Cette configuration de proxy inverse ne nécessite pas de transfert de paquets 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/cdnConserver l’adresse après les redémarrages
Enregistrez cette unité avec votre adresse IP de service et votre préfixe réels. Elle ajoute une interface dummy dédiée et conserve la configuration unicast existante du serveur.
/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.targetDémarrer les services après la configuration de l’adresse
Ajoutez la dépendance aux deux services, démarrez l’unité d’adresse et vérifiez la route vers le serveur d’origine. Elle doit utiliser le réseau unicast, et non 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.10Configurer BIRD pour annoncer le /24
Enregistrez ceci dans /etc/bird/bird.conf à Paris. Le filtre d’export n’autorise que votre /24. Le protocole statique est désactivé au départ afin que le serveur n’annonce rien avant que HTTPS fonctionne. BIRD conserve cette route dans sa propre table de routage ; la route blackhole Linux a été configurée séparément plus haut.
/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;
};
}Vérifiez la session BGP
Ajoutez l’authentification ou les paramètres multihop exigés par le fournisseur avant le démarrage. La session doit passer à Established sans exporter encore le préfixe du CDN. Si elle reste inactive, vérifiez avec votre opérateur amont l’adresse du pair, l’ASN, le pare-feu et l’authentification.
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Émettre les certificats HTTPS
Utilisez DNS-01 pour émettre le certificat du CDN avant d’annoncer l’adresse IP. Voici un exemple Certbot pour une zone hébergée sur Cloudflare DNS. Si votre zone est ailleurs, utilisez le plugin DNS Certbot correspondant. Le proxy Cloudflare reste désactivé pour l’enregistrement du CDN.
Créez un jeton d’API DNS limité à la zone requise avec l’autorisation Zone:DNS:Edit. Sur chaque nœud, stockez-le sous la forme dns_cloudflare_api_token = YOUR_TOKEN dans /root/.secrets/cloudflare.ini, avec les permissions 700 pour le répertoire et 600 pour le fichier. Émettez les certificats sur les deux nœuds l’un après l’autre et gardez les identifiants hors du contrôle de version.
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-interactiveRecharger NGINX après le renouvellement
Une fois la configuration NGINX ci-dessous validée par nginx -t, installez ce hook de déploiement et vérifiez le timer de renouvellement sur chaque nœud. Des certificats indépendants peuvent servir le même nom d’hôte sans partager de clé privée. À mesure que le parc s’agrandit, centralisez l’émission et sécurisez la distribution pour limiter l’exposition des identifiants DNS et coordonner les renouvellements.
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.timerConfigurer HTTPS et le cache périphérique
Utilisez l’adresse IP distincte de l’origine dans cdn_origin et le nom d’hôte de son certificat dans proxy_ssl_name. Sur l’origine, servez /assets/logo.v1.svg avec Cache-Control: public, max-age=60, s-maxage=300 et un ETag. Servez aussi /cdn-probe.txt avec le corps origin-ok et Cache-Control: no-store.
Enregistrez cette configuration complète dans /etc/nginx/conf.d/cdn.conf, inclus dans le bloc http de NGINX. Elle ne met en cache que /assets/. Les autres chemins vont directement à l’origine.
/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;
}
}Donner à l’origine des réponses de test prévisibles
Pour une origine NGINX, ajoutez ces blocs location dans son serveur HTTPS existant pour origin.example.com. Ils fournissent une ressource pouvant être mise en cache et une sonde non mise en cache, sans changer votre application. Utilisez le certificat valide de l’origine et vérifiez que son journal d’accès enregistre les deux chemins.
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";
}Ce que ce cache stockera
La ressource de test reste fraîche dans un cache partagé pendant 300 secondes grâce à s-maxage. inactive=60m contrôle l’éviction des objets inutilisés, pas leur fraîcheur. La clé distingue les noms d’hôte et les chaînes de requête. Les requêtes avec des cookies ou une autorisation contournent le cache ; NGINX respecte aussi private, no-store, Set-Cookie et le traitement des réponses Vary.
Chaque PoP possède son propre cache disque. Utilisez des URL de ressources versionnées pour chaque version déployée. Cette configuration ne fournit aucune API de purge globale et n’impose pas de servir du contenu périmé lorsque l’origine tombe en panne.
Activer le premier PoP
Exécutez les deux contrôles HTTPS à Paris. --resolve se connecte à l’adresse locale du CDN tout en conservant le nom d’hôte pour TLS. Les deux requêtes doivent réussir avec des certificats valides et les corps de réponse attendus avant d’activer la route.
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-okAnnoncer la route et configurer le DNS
Une fois les contrôles réussis, activez cdn_prefix et demandez à votre opérateur amont de confirmer que le /24 est accepté et propagé. Faites pointer l’enregistrement A de votre nom d’hôte vers l’adresse IP du CDN. Utilisez le mode DNS seul si votre fournisseur DNS propose aussi un proxy CDN. Testez HTTPS depuis un réseau externe avant de continuer.
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.80Ajouter le deuxième PoP
Répétez la configuration à New York. Gardez les mêmes /24, adresse IP du CDN, ASN d’origine, nom d’hôte, origine et règles de cache. Modifiez les valeurs ci-dessous, installez un certificat valide et réussissez les contrôles HTTPS locaux avant d’activer cdn_prefix. Utilisez l’ASN du pair et les paramètres réels de ce site s’ils diffèrent.
| Paramètre | Paris | New York |
|---|---|---|
| Identifiant de routeur BIRD | 198.51.100.10 | 198.51.100.20 |
| Adresse source BGP | 198.51.100.10 | 198.51.100.20 |
| Voisin BGP | 198.51.100.1 | 198.51.100.17 |
| NGINX X-Edge-Id | paris-1 | new-york-1 |
Confirmer que les deux sites répondent aux requêtes
Laissez le DNS inchangé. Testez le nom d’hôte public depuis plusieurs réseaux et examinez X-Edge-Id. Pour contrôler un PoP précis, exécutez curl --resolve directement sur ce serveur ; utiliser l’adresse Anycast depuis votre ordinateur ne permet pas de forcer Paris ou New York.
Retirer automatiquement les nœuds défaillants
Une session BGP active ne signifie pas que HTTPS fonctionne. Installez le contrôleur de santé de l’exemple sur chaque nœud une fois les contrôles locaux réussis sur les deux. Il teste l’adresse IP du CDN de ce nœud avec le bon nom d’hôte TLS, retire cdn_prefix après trois échecs consécutifs et exige 30 secondes de fonctionnement continu ainsi qu’un délai de maintien du retrait de 60 secondes avant de l’annoncer à nouveau.
L’unité systemd tente de retirer l’annonce lorsque le contrôleur s’arrête, le relance après un crash et utilise un watchdog si la boucle se bloque. Chaque passage relit l’état du protocole BIRD. Ces fichiers vérifient le TLS local et la réactivité de NGINX ; surveillez séparément le stockage du cache, l’accessibilité de l’origine et le routage public. Une panne de l’origine partagée ne doit pas retirer automatiquement tous les nœuds qui peuvent encore servir du contenu en cache.
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-pagerTester les réponses du cache et le basculement
Sur chaque PoP, demandez deux fois la ressource de test. Une nouvelle clé doit produire MISS puis HIT. Vérifiez dans le journal d’accès de l’origine que la deuxième requête ne l’atteint pas. Un HIT initial signifie que la clé est déjà en cache.
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.svgRetirer un PoP
Depuis un réseau externe qui atteint actuellement Paris, ouvrez régulièrement de nouvelles connexions HTTPS. Arrêtez le contrôleur de santé avant de désactiver manuellement la route, afin qu’il ne puisse pas la réactiver. Vérifiez que les requêtes réussies finissent par identifier New York. Notez les échecs et le temps écoulé ; les connexions existantes peuvent devoir se reconnecter.
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.Tester une panne de service et un redémarrage
Pendant que le contrôleur fonctionne et que la route est annoncée, arrêtez NGINX à Paris. Confirmez que le contrôleur retire cdn_prefix et que les requêtes externes se déplacent vers New York. Relancez NGINX et vérifiez que le délai de rétablissement empêche une nouvelle annonce immédiate. Répétez l’opération sur l’autre nœud.
Redémarrez un nœud pendant que l’autre sert le trafic. Vérifiez que l’adresse dummy, la session BIRD, le certificat, le cache et le contrôleur se rétablissent dans l’ordre. Mesurez le comportement du nœud restant avec un cache chaud puis un cache froid. Consignez les résultats observés avec les versions logicielles et les réseaux utilisés pour les sondes ; ne supposez pas un délai fixe de convergence 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.Ajouter des pools Anycast régionaux avec GeoDNS
Construisez au moins deux nœuds par pool régional avec la même configuration BIRD, TLS et de cache. Attribuez une adresse IP de service à l’Europe et une autre à l’Amérique du Nord. Au sein d’un pool, chaque nœud annonce le même préfixe. Chaque pool IPv4 routé indépendamment nécessite son propre préfixe accepté, généralement un /24 ; deux adresses IP issues d’un même /24 partagé ne donnent pas à BGP des routes régionales indépendantes.
Adaptez l’adresse de l’interface dummy, la route couvrant le préfixe, le filtre de préfixe/export BIRD, l’adresse d’écoute NGINX et CDN_IP du contrôleur au pool concerné. Gardez les adresses d’administration et d’origine hors de ces préfixes de service. Tous les pools servent le même nom d’hôte CDN, avec des certificats valides et des règles de cache identiques. Définissez l’origine par pool si votre application exige des backends régionaux.
| Localisation de la requête | Réponse DNS pour cdn.example.com | Nœuds annonçant cette IP |
|---|---|---|
| Europe | EU_CDN_IP | Paris et Francfort, avec EU_PREFIX/24. |
| Amérique du Nord | US_CDN_IP | New York et Chicago, avec US_PREFIX/24. |
| Par défaut / secours | GLOBAL_CDN_IP | Le pool global, avec son préfixe distinct GLOBAL_PREFIX/24. |
Créer les enregistrements GeoDNS
Dans un service GeoDNS comme Route 53, créez des enregistrements A de géolocalisation portant le même nom, cdn.example.com, avec des identifiants d’enregistrement distincts. Associez Europe à EU_CDN_IP, North America à US_CDN_IP et Default à GLOBAL_CDN_IP. Ces valeurs sont des exemples à remplacer par vos adresses réelles. Commencez avec un TTL de 60 secondes et mesurez le comportement des résolveurs.
Si vous déplacez votre DNS faisant autorité de Cloudflare vers Route 53, adaptez aussi l’émission des certificats au plugin DNS Route 53, ou déléguez explicitement la zone de challenge ACME. Le plugin Cloudflare précédent exige le contrôle des enregistrements de challenge faisant autorité.
Associez chaque enregistrement à l’état de santé de son pool. Dans Route 53, si la correspondance géographique est défaillante, la résolution peut se rabattre sur un enregistrement géographique plus large, puis sur l’enregistrement par défaut. Gardez le pool global de secours opérationnel et assez dimensionné pour absorber le trafic régional. Si les pools globaux et régionaux partagent les mêmes sites, configurez et surveillez leurs préfixes séparément ; le contrôleur de l’exemple gère un préfixe par instance.
Vérifier l’état du pool, puis tester les deux scénarios de panne
Combinez les contrôles des nœuds individuels par leurs chemins unicast avec des sondes externes de l’adresse IP de service régionale. Une sonde vers une adresse Anycast peut continuer à réussir après la panne d’un nœud parce qu’elle atteint un autre nœud. Retirez un pool du DNS lorsque le pool ne peut plus servir le trafic, et non dès qu’un de ses membres tombe en panne.
Retirez d’abord un seul nœud : l’adresse IP régionale doit rester accessible par un autre nœud du pool. Rendez ensuite tout le pool indisponible dans un test contrôlé : les nouvelles réponses DNS doivent sélectionner le pool de secours. Testez à la fois les nouvelles résolutions et les clients qui conservent l’ancienne réponse. Une modification DNS ne peut ni déplacer une connexion existante ni remplacer immédiatement toutes les réponses en cache.
GeoDNS estime la localisation à partir du résolveur récursif ou d’une indication EDNS Client Subnet. Testez depuis plusieurs réseaux réels, y compris avec des résolveurs publics. Ne considérez pas l’enregistrement par défaut comme une garantie de secours : Route 53 peut renvoyer des enregistrements défaillants lorsque tous les choix admissibles échouent aux contrôles de santé.
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.Autres configurations de routage
Vous pouvez aussi combiner des nœuds annoncés mondialement avec des nœuds dont l’opérateur amont n’exporte les routes que vers certains réseaux. Configurez cela avec les communautés BGP documentées par ce fournisseur et vérifiez leur portée depuis l’extérieur. NO_EXPORT concerne les limites des AS, pas les continents. Cette politique de routage est distincte de la sélection de pools régionaux par GeoDNS.
Si un hébergeur ne peut pas établir de peering BGP, un fournisseur de transit peut annoncer votre préfixe et acheminer le trafic par des tunnels. Vérifiez le routage de retour et le MTU, et placez un cache sur chaque site de réception. Ramener tous les tunnels vers un cache unique éloigné laisse ce cache et ses liaisons sur le chemin de chaque requête.
Maintenir le CDN opérationnel
Surveillez chaque PoP par son accès d’administration unicast et par l’adresse IP Anycast publique. Sinon, un site en panne peut disparaître de vos contrôles lorsque le routage envoie chaque sonde vers un site opérationnel.
| Problème | Ce que vous remarquerez | Que faire |
|---|---|---|
| GeoDNS dirige les clients vers un pool indisponible | Les nouvelles résolutions ou les réponses en cache continuent d’atteindre une région en panne. | Vérifiez l’état du pool, la politique par défaut, le cache des résolveurs et la capacité de secours. Testez la panne d’une région entière séparément du retrait d’un seul nœud. |
| Changements de bail, de ROA ou d'enregistrement de routage | Certains réseaux ne peuvent plus atteindre le préfixe alors que les sessions BGP restent actives. | Suivez les dates de renouvellement et la validité RPKI. Revérifiez les autorisations avant de changer d’ASN ou d’opérateur amont. Prévoyez une période de chevauchement lorsque vous renumérotez un espace d’adressage loué. |
| Le trafic se déplace après un changement de fournisseur | Les clients arrivent sur un PoP éloigné ou surchargent un site plus petit. | Mesurez l’identifiant du nœud et la latence depuis plusieurs réseaux d’accès. Examinez la politique et sa portée auprès de l’opérateur amont avant de modifier les communautés BGP ou le prepending. |
| Un PoP tombe en panne ou son cache redémarre | Le nœud restant ou l’origine reçoit une hausse soudaine du trafic. | Testez la capacité de secours avec un cache froid. Prévoyez une marge de bande passante et d’espace disque ; ajoutez un cache de protection de l’origine si les remplissages en double le justifient. |
| Le contenu ancien ou privé est mis en cache | Les utilisateurs voient des versions périmées ou la réponse d’un autre utilisateur. | Utilisez des ressources versionnées. Après les changements, testez le comportement de Cookie, Authorization, private, no-store et Set-Cookie. Si vous ajoutez une purge, rendez sa livraison observable. |
| Un déploiement ou un certificat diffère d'un PoP à l'autre | Certains réseaux seulement constatent des échecs TLS, des erreurs ou un ancien comportement. | Commencez le déploiement par un seul PoP. Vérifiez l’expiration du certificat, la version de configuration et les réponses HTTPS réelles sur chaque nœud avant d’étendre le déploiement. |
| Le contrôleur de santé tombe en panne ou oscille | Un nœud défaillant continue d’annoncer le préfixe, ou les clients changent constamment de point de présence. | Supervisez le contrôleur, imposez des délais de stabilisation avant le rétablissement et testez son watchdog. Coordonnez le comportement de graceful restart avec l’opérateur amont. |
| Un tunnel ou le chemin de retour tombe en panne | Les petites requêtes fonctionnent, mais les transferts volumineux se bloquent, ou les réponses n’arrivent jamais. | Vérifiez le MTU, la découverte du MTU du chemin, le routage de retour et les filtres d’adresse source. Testez des téléchargements volumineux après un changement de tunnel ou de fournisseur. |
| Une attaque sature le lien | Des serveurs opérationnels deviennent inaccessibles avant que les limites HTTP puissent être utiles. | Prévoyez une protection auprès de l’opérateur amont et connaissez sa procédure d’activation. Restreignez l’accès au serveur d’origine et surveillez le trafic sortant ainsi que celui qui contourne le cache. |
| Plusieurs services partagent le même /24 | Le retrait dû à un service défaillant déplace aussi les services opérationnels. | Définissez une politique de santé pour chaque service porté par le préfixe. Utilisez des préfixes routables distincts si les services doivent pouvoir être retirés indépendamment. |
Votre premier CDN fonctionnel
Vous pouvez ajouter du trafic lorsque les deux PoP servent un HTTPS valide, que chacun produit MISS puis HIT, que les réponses privées ne sont pas mises en cache et que le retrait de l’une ou l’autre route déplace les nouvelles requêtes vers le site restant. Commencez par les ressources statiques publiques et mesurez la charge sur l’origine avant d’ajouter d’autres chemins pouvant être mis en cache.