Adios
BlogRede

Rede

Criar uma CDN Anycast

Crie uma CDN Anycast com BIRD e NGINX: obtenha um /24, coloque HTTPS em cache, teste o failover e adicione pools regionais Anycast com GeoDNS.

Equipe AdiosAtualizado 26 de setembro de 202625 min. de leitura

Para criar uma CDN Anycast, anuncie o mesmo prefixo IP de vários locais e execute um cache HTTPS em cada um. Usaremos BIRD para BGP e NGINX para cache e depois mostraremos como agrupar os nós de borda em pools regionais Anycast selecionados pelo GeoDNS.

Escolher entre Anycast global e Anycast regional com GeoDNS

O Anycast global usa um único IP de serviço em todos os nós de borda. O DNS retorna esse IP; o BGP escolhe o nó que recebe o tráfego conforme a política de rede e os caminhos disponíveis. Se o conteúdo estiver no cache, ele é servido ali. Caso contrário, a requisição segue para a origem e pode preencher o cache daquele nó.

O Anycast regional com GeoDNS acrescenta uma etapa de seleção. Cada pool regional tem um IP de serviço diferente, compartilhado pelos nós de borda daquele pool. O GeoDNS retorna um IP regional; o BGP escolhe um nó que o anuncia. Assim, você escolhe o pool regional antes que o roteamento da internet selecione o servidor.

Duas formas de rotear requisições para uma CDN Anycast
Opção de roteamentoAnycast GlobalAnycast regional + GeoDNS
Resposta DNSO mesmo IP de CDN para todos.Um IP de CDN diferente para cada pool regional selecionado.
Anúncios do BGPTodos os nós de borda anunciam o mesmo prefixo.Os nós de borda de cada pool anunciam o prefixo desse pool.
Um nó de borda falhaRetire sua rota; os demais nós que anunciam o prefixo continuam disponíveis.Retire sua rota; outro nó de borda no mesmo pool pode receber novas conexões.
Falha de uma região inteiraOutra região que anuncia o prefixo pode receber o tráfego após a convergência.O DNS deve selecionar um pool de fallback saudável. Respostas DNS em cache ainda podem apontar para o pool que falhou.
Quando escolherVocê quer um IP estável e um pool global.Você quer seleção explícita do pool regional, capacidade separada, ou origens regionais diferentes.

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

O que você precisa para a primeira configuração

Comece com a configuração global: dois servidores Debian 12 recém-configurados com systemd, BIRD 2, NGINX e BGP do cliente; um IPv4 /24 autorizado e um ASN de origem acordado; uma origem HTTPS em um IP separado; e um domínio cujo DNS você controla. Os exemplos pressupõem peers BGP diretos. Seu provedor upstream deve fornecer os valores reais de peering.

Inclua no orçamento o bloco de endereços e os acordos de ASN, os dois servidores de borda, o tráfego de saída e de origem, as verificações de saúde DNS e o monitoramento. Obtenha cotações atuais e confirme a elegibilidade para BGP antes de contratar. Os endereços abaixo são exemplos para documentação; substitua-os pelos seus. Os tempos de implantação e de falha precisam ser medidos na sua rede.

Obter um /24 e permissão para anunciá-lo

Para anunciar seu próprio IPv4 na internet pública, /24 é o tamanho mínimo prático de bloco: 256 endereços. Um prefixo mais longo representa um bloco menor: /25 contém 128 endereços e /26 contém 64. Esses blocos menores costumam ser filtrados. Confirme que os dois locais de hospedagem aceitam BGP do cliente e seu prefixo antes de comprar ou alugar o bloco.

Você pode alugar um bloco com seu próprio ASN, solicitar endereços a um provedor, fazer uma solicitação diretamente a um registro ou comprar um bloco existente de seu titular.

Formas de obter um IPv4 /24
RotaO que fazerVerificar antes de se comprometer
Alugar um bloco com seu próprio ASNAlugue um /24 e peça ao titular que autorize seu ASN a originá-lo. Providencie o ASN separadamente se ainda não tiver um.Confirme as atualizações de ROA e IRR, a permissão para anunciar a partir dos dois PoPs e os termos de renovação e encerramento do aluguel.
Solicitar um bloco atribuído pelo provedorPeça a um provedor como a Vultr um bloco de endereços que ele possa rotear para sua configuração BGP nos locais necessários.Confirme se um /24 completo está disponível, qual ASN o origina e se você pode anunciá-lo fora da rede desse provedor.
Solicitar diretamente a um registroSolicite uma alocação ao seu registro regional de internet. O RIPE NCC tem uma lista de espera de /24 para LIRs elegíveis que nunca receberam uma alocação IPv4.Essa alocação segue a política do registro. Pagar taxas de associação não garante um bloco nem uma data de entrega.
Comprar um bloco existenteCompre de um titular que venda seu bloco, diretamente ou por um intermediário ou marketplace, e conclua o processo de transferência do registro.Antes de pagar, verifique a autoridade do vendedor, a elegibilidade da transferência, as taxas, o histórico de roteamento e abuso e a aceitação pelos provedores upstream.

Tornar o bloco roteável

Acorde o ASN de origem com seus provedores upstream. Se precisar de um ASN próprio, solicite-o ao registro regional ou a um provedor patrocinador, conforme as regras de elegibilidade desse registro. O ASN identifica a rede que origina o prefixo; ele é independente do aluguel ou da transferência do bloco de endereços.

Peça ao titular do bloco que autorize esse ASN no RPKI: crie um ROA para o /24 com comprimento máximo /24. Adicione o objeto de rota IRR correspondente quando o provedor upstream exigir e forneça uma carta de autorização se solicitada. Um ROA autoriza o roteamento; ele não anuncia a rota por você.

Envie esta solicitação aos dois provedores de hospedagem. Não comece a configurar o servidor antes que confirmem a aceitação do prefixo e forneçam as configurações dos peers.

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

Preparar o primeiro servidor de borda

O primeiro nó de borda ficará em Paris e o segundo em Nova York. Cada local é um ponto de presença, ou PoP. Os dois recebem o mesmo IP da CDN; cada um mantém seu próprio endereço unicast para SSH e requisições à origem.

Substitua todos os endereços, ASNs e nomes example.com abaixo. Eles são valores para documentação, não endereços que você pode anunciar. O exemplo pressupõe peers BGP diretamente conectados; use as configurações multihop do seu provedor se necessário.

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

Instalar pacotes e associar o endereço da CDN

Execute isto em Paris. O /32 associa o endereço da CDN localmente; a rota blackhole que cobre o /24 descarta pacotes para os endereços não utilizados. A unidade systemd abaixo restaura os dois após uma reinicialização, antes de BIRD e NGINX iniciarem.

Permita HTTPS para o IP da CDN e BGP na porta TCP 179 a partir do peer do seu provedor. Mantenha o acesso de administração no endereço unicast. Esta configuração de proxy reverso não precisa de encaminhamento de pacotes no 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

Preservar o endereço após reinicializações

Salve esta unidade com seu IP real de serviço e seu prefixo. Ela adiciona uma interface dummy dedicada e preserva a configuração unicast existente no 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

Iniciar os serviços depois da configuração do endereço

Adicione a dependência aos dois serviços, inicie a unidade de endereço e verifique a rota até a origem. Ela deve usar a rede unicast, não 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

Configurar BIRD para anunciar o /24

Salve isto como /etc/bird/bird.conf em Paris. O filtro de exportação permite apenas seu /24. O protocolo estático começa desabilitado para que o servidor não anuncie nada até o HTTPS funcionar. O BIRD mantém essa rota em sua própria tabela; a rota blackhole do Linux foi configurada separadamente acima.

/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;
  };
}

Verificar a sessão do BGP

Adicione a autenticação ou as configurações multihop exigidas pelo provedor antes de iniciar. O estado esperado é Established, ainda sem exportação do prefixo da CDN. Se a sessão continuar inativa, verifique o endereço do peer, o ASN, o firewall e a autenticação com seu provedor upstream.

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

Emitir certificados HTTPS

Use DNS-01 para emitir o certificado da CDN antes de anunciar o IP. Este é um exemplo do Certbot para uma zona hospedada no Cloudflare DNS. Se sua zona estiver em outro serviço, use o plugin DNS correspondente do Certbot. O proxy da Cloudflare permanece desativado no registro da CDN.

Crie um token de API DNS restrito à zona necessária, com a permissão Zone:DNS:Edit. Em cada nó de borda, armazene-o como dns_cloudflare_api_token = YOUR_TOKEN em /root/.secrets/cloudflare.ini, com modo 700 no diretório e 600 no arquivo. Emita os certificados nos dois nós um de cada vez e mantenha as credenciais fora do controle de versão.

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

Recarregar NGINX após a renovação

Após a configuração NGINX abaixo passar em nginx -t, instale este hook de implantação e verifique o temporizador de renovação em cada nó de borda. Certificados independentes podem atender o mesmo nome de host; não precisam compartilhar uma chave privada. Conforme o conjunto de nós cresce, centralize a emissão e a distribuição segura para reduzir a exposição das credenciais DNS e coordenar as renovações.

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

Configurar HTTPS e o cache de borda

Use o IP separado da origem em cdn_origin e o nome de host do certificado dela em proxy_ssl_name. Na origem, sirva /assets/logo.v1.svg com Cache-Control: public, max-age=60, s-maxage=300 e um ETag. Sirva também /cdn-probe.txt com o corpo origin-ok e Cache-Control: no-store.

Salve esta configuração completa em /etc/nginx/conf.d/cdn.conf, incluído dentro do bloco http do NGINX. Ela coloca apenas /assets/ em cache. Os demais caminhos seguem diretamente para a origem.

/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;
  }
}

Fornecer respostas de teste previsíveis na origem

Para uma origem NGINX, adicione estes blocos location ao servidor HTTPS existente de origin.example.com. Eles fornecem um recurso que pode ser colocado em cache e uma sonda sem cache, sem alterar a aplicação. Use o certificado válido da própria origem e confirme que seu log de acesso registra os dois caminhos.

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";
}

O que este cache armazena

O recurso de teste permanece válido em um cache compartilhado por 300 segundos devido a s-maxage. inactive=60m controla a remoção de objetos não utilizados, não sua validade. A chave separa nomes de host e strings de consulta. Requisições com cookies ou autorização ignoram o cache; o NGINX também respeita private, no-store, Set-Cookie e o tratamento de respostas Vary.

Cada PoP tem seu próprio cache em disco. Use URLs de recursos versionadas para as versões publicadas. Esta configuração não oferece uma API global de limpeza de cache nem força o fornecimento de conteúdo obsoleto quando a origem falha.

Ativar o primeiro PoP

Execute as duas verificações HTTPS em Paris. --resolve conecta ao endereço local da CDN, preservando o nome de host para o TLS. As duas requisições devem funcionar com certificados válidos e os corpos esperados antes de você habilitar a rota.

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

Anunciar a rota e definir DNS

Após as verificações passarem, habilite cdn_prefix e peça ao provedor upstream que confirme a aceitação e a propagação do /24. Configure o registro A do nome de host para o IP da CDN. Use o modo somente DNS se seu provedor DNS também oferecer um proxy CDN. Teste o HTTPS a partir de uma rede 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

Adicionar o segundo PoP

Repita a configuração em Nova York. Mantenha iguais o /24, o IP da CDN, o ASN de origem, o nome de host, a origem e as regras de cache. Altere os valores abaixo, instale um certificado válido e passe nas verificações HTTPS locais antes de habilitar cdn_prefix. Use o ASN do peer e as configurações reais daquele local se forem diferentes.

Valores que mudam entre os dois PoPs
ConfiguraçãoParisNova York
ID do roteador BIRD198.51.100.10198.51.100.20
Endereço de origem do BGP198.51.100.10198.51.100.20
Vizinho BGP198.51.100.1198.51.100.17
NGINX X-Edge-Idparis-1new-york-1

Confirmar que os dois locais atendem às requisições

Mantenha o DNS inalterado. Teste o nome de host público a partir de várias redes e inspecione X-Edge-Id. Para verificar um PoP específico, execute curl --resolve no próprio servidor; usar o IP Anycast do seu laptop não força a seleção de Paris ou Nova York.

Retirar automaticamente os nós de borda não saudáveis

Uma sessão BGP ativa não significa que o HTTPS funciona. Instale o controlador de saúde do exemplo em cada nó de borda depois que ambos passarem nas verificações locais. Ele testa o IP da CDN daquele nó com o nome de host TLS correto, retira cdn_prefix após três falhas consecutivas e exige 30 segundos contínuos de funcionamento saudável, além de uma espera mínima de 60 segundos após a retirada, antes de anunciar novamente.

A unidade systemd tenta retirar a rota quando o controlador termina, reinicia-o após uma falha e usa um watchdog para detectar uma execução travada. A cada ciclo, ela lê novamente o estado do protocolo no BIRD. Estes arquivos verificam o TLS local e a resposta do NGINX; monitore separadamente o armazenamento do cache, o acesso à origem e o roteamento público. Uma falha da origem compartilhada não deve retirar automaticamente todos os nós que ainda conseguem servir conteúdo em 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-pager

Testar acertos de cache e failover

Em cada PoP, solicite o recurso de teste duas vezes. Uma chave ainda não usada deve produzir MISS e depois HIT. Confirme no log de acesso da origem que a segunda requisição não chegou até ela. Um HIT inicial significa que a chave já está em 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.svg

Retirar um PoP

A partir de uma rede externa que atualmente chega a Paris, continue abrindo novas conexões HTTPS. Pare o controlador de saúde antes de desabilitar a rota manualmente para que ele não a reative. Verifique se as requisições bem-sucedidas passam a identificar Nova York. Registre as falhas e o tempo decorrido; as conexões existentes podem precisar ser refeitas.

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.

Teste uma falha de serviço e uma reinicialização

Com o controlador em execução e a rota anunciada, pare o NGINX em Paris. Confirme que o controlador retira cdn_prefix e que as requisições externas passam a chegar a Nova York. Inicie o NGINX novamente e verifique se o atraso de recuperação impede um novo anúncio imediato. Repita no outro nó de borda.

Reinicie um nó de borda enquanto o outro atende ao tráfego. Verifique se o endereço dummy, a sessão BIRD, o certificado, o cache e o controlador se recuperam na ordem correta. Meça o comportamento do nó restante com cache aquecido e vazio. Registre os resultados observados junto das versões de software e das redes usadas nas sondas; não presuma um tempo fixo de convergência 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.

Adicionar pools regionais Anycast com GeoDNS

Crie pelo menos dois nós de borda por pool regional com a mesma configuração BIRD, TLS e cache. Atribua um IP de serviço à Europa e outro à América do Norte. Dentro de cada pool, todos os nós anunciam o mesmo prefixo. Cada pool IPv4 roteado de forma independente precisa de seu próprio prefixo aceito, normalmente um /24; dois IPs de um único /24 compartilhado não fornecem rotas regionais independentes no BGP.

Ajuste o endereço da interface dummy, a rota que cobre o prefixo, o prefixo e o filtro de exportação do BIRD, o endereço de escuta do NGINX e CDN_IP no controlador para corresponder ao pool. Mantenha os endereços de administração e de origem fora desses prefixos de serviço. Todos os pools atendem o mesmo nome de host da CDN, com certificados válidos e regras de cache correspondentes. Configure a origem de cada pool se a aplicação exigir backends regionais.

Exemplo de política GeoDNS com um pool global de fallback
Localização da consultaResposta DNS para cdn.example.comNós de borda que anunciam esse IP
EuropaEU_CDN_IPParis e Frankfurt, utilizando EU_PREFIX/24.
América do NorteUS_CDN_IPNova York e Chicago, usando US_PREFIX/24.
Padrão / fallbackGLOBAL_CDN_IPO pool global, usando seu próprio GLOBAL_PREFIX/24.

Criar os registros GeoDNS

Em um serviço GeoDNS como o Route 53, crie registros A de geolocalização com o mesmo nome, cdn.example.com, e identificadores distintos. Configure Europe como EU_CDN_IP, North America como US_CDN_IP e Default como GLOBAL_CDN_IP. Esses valores são marcadores para seus endereços reais. Comece com um TTL de 60 segundos e meça o comportamento dos resolvedores.

Se você migrar o DNS autoritativo da Cloudflare para o Route 53, atualize também a emissão de certificados para usar o plugin DNS do Route 53, ou delegue deliberadamente a zona de desafio ACME. O plugin Cloudflare usado antes exige controle dos registros autoritativos de desafio.

Associe cada registro ao estado de saúde do seu pool. No Route 53, quando a correspondência geográfica não está saudável, a resolução pode recorrer a um registro geográfico mais amplo e depois ao registro padrão. Mantenha o pool global de fallback saudável e com capacidade para absorver o tráfego regional. Se os pools globais e regionais estiverem nos mesmos locais, configure e monitore seus prefixos separadamente; o controlador do exemplo gerencia um prefixo por instância.

Verificar a saúde do pool e testar os dois caminhos de falha

Combine verificações de cada nó de borda por seus caminhos unicast com sondas externas do IP regional de serviço. Uma sonda para um IP Anycast pode continuar funcionando após a falha de um nó porque alcança outro. Remova um pool do DNS quando ele não puder atender o tráfego, não a cada falha de um de seus membros.

Primeiro retire um nó de borda: o IP regional deve continuar funcionando por outro nó do mesmo pool. Depois torne o pool inteiro indisponível em um teste controlado: novas respostas DNS devem selecionar o fallback. Teste consultas novas e clientes que ainda guardam a resposta antiga. Mudanças no DNS não transferem uma conexão existente nem substituem imediatamente todas as respostas em cache.

O GeoDNS estima a localização pelo resolvedor recursivo ou por uma indicação EDNS Client Subnet. Teste a partir de várias redes reais, incluindo resolvedores públicos. Não considere o registro padrão uma proteção garantida contra falhas: o Route 53 pode retornar registros não saudáveis quando todas as opções elegíveis falham nas verificações de saúde.

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.

Outras configurações de roteamento

Você também pode combinar nós anunciados globalmente com nós cujas rotas o provedor upstream exporta apenas para redes selecionadas. Configure isso com as communities BGP documentadas desse provedor e verifique o escopo externamente. NO_EXPORT se refere a limites entre AS, não a continentes. Essa política de roteamento é separada da seleção de pools regionais pelo GeoDNS.

Se o provedor de hospedagem não puder estabelecer peering BGP, um provedor de trânsito pode anunciar seu prefixo e entregar o tráfego por túneis. Verifique o roteamento de retorno e a MTU e coloque um cache em cada local que recebe o tráfego. Direcionar todos os túneis a um único cache distante mantém esse cache e seus links no caminho de todas as requisições.

Manter a CDN funcionando

Monitore cada PoP por seu caminho unicast de administração e pelo IP Anycast público. Caso contrário, um local com falha pode desaparecer das verificações quando o roteamento enviar todas as sondas para um local saudável.

Problemas a observar conforme a CDN cresce
ProblemaO que você vai notarO que fazer
O GeoDNS direciona clientes a um pool indisponívelConsultas novas ou respostas em cache continuam chegando a uma região com falha.Verifique a saúde do pool, a política padrão, o cache do resolvedor e a capacidade do fallback. Teste a falha de uma região inteira separadamente da retirada de um único nó de borda.
Mudanças no aluguel, no ROA ou nos registros de roteamentoAlgumas redes deixam de alcançar o prefixo enquanto as sessões BGP continuam ativas.Acompanhe as datas de renovação e a validade do RPKI. Verifique novamente a autorização antes de alterar o ASN ou o upstream. Planeje um período de sobreposição ao renumerar espaço alugado.
O tráfego muda após uma troca de provedorOs clientes chegam a um PoP distante ou sobrecarregam um local de menor capacidade.Meça o ID do nó de borda e a latência a partir de várias redes de acesso. Revise a política e o escopo do provedor upstream antes de ajustar communities ou aplicar prepending.
Um PoP falha ou seu cache reiniciaO nó de borda restante ou a origem recebe um pico repentino de tráfego.Teste a capacidade de failover com o cache vazio. Reserve margem de banda e de disco; adicione um origin shield quando os preenchimentos duplicados de cache justificarem isso.
O conteúdo antigo ou privado está em cacheOs usuários veem versões antigas ou a resposta de outro usuário.Use recursos versionados. Teste o comportamento de Cookie, Authorization, private, no-store e Set-Cookie após mudanças. Se adicionar limpeza de cache, torne sua execução observável.
Uma implantação ou certificado difere entre PoPsApenas algumas redes apresentam falhas TLS, erros ou comportamento antigo.Comece a implantação por um PoP. Verifique a validade do certificado, a versão da configuração e as respostas HTTPS reais em cada nó antes de expandir a implantação.
O controlador de saúde falha ou oscilaUm nó de borda com falha continua anunciando a rota, ou os clientes alternam repetidamente entre locais.Supervisione o controlador, imponha períodos de espera após a recuperação e teste seu watchdog. Coordene o comportamento de graceful restart com o provedor upstream.
Um túnel ou caminho de retorno falhaRequisições pequenas funcionam, mas transferências grandes travam ou as respostas nunca chegam.Verifique a MTU, a descoberta de MTU do caminho, o roteamento de retorno e os filtros de endereço de origem. Teste downloads grandes após mudanças de túnel ou provedor.
Um ataque satura o linkServidores saudáveis ficam inacessíveis antes que os limites HTTP possam ajudar.Combine a mitigação com o provedor upstream e conheça seu processo de ativação. Restrinja o acesso à origem e acompanhe o uso de tráfego de saída e o tráfego que ignora o cache.
Vários serviços compartilham o mesmo /24Retirar a rota devido à falha de um serviço também desloca os serviços saudáveis.Defina uma política de saúde para cada serviço atendido pelo prefixo. Use prefixos roteáveis separados quando os serviços precisarem ser retirados de forma independente.

Sua primeira CDN funcional

Você pode adicionar tráfego quando os dois PoPs atenderem HTTPS válido, cada um demonstrar MISS seguido de HIT, as respostas privadas permanecerem fora do cache e a retirada de qualquer rota levar as novas requisições ao local restante. Comece com recursos estáticos públicos e meça a carga na origem antes de adicionar outros caminhos que possam ser colocados em cache.

Todos os artigos