
🚀 Como configurar DNS dinâmico através da Cloudflare no Raspberry Pi
O seu servidor doméstico no Raspberry Pi funciona 24 horas por dia, 7 dias por semana, mas o seu ISP muda o IP externo todos os dias. Andar manualmente à procura do novo endereço é um trabalho para um arqueólogo. E os serviços DynDNS e No-IP bombardeiam-no com emails: «inicie sessão uma vez por mês ou desativamos a sua conta gratuita».
Acontece que a Cloudflare pode funcionar como DNS dinâmico, sem emails promocionais, sem limites de frequência de atualização e sem subdomínios de terceiros. Já tem um domínio na Cloudflare? Então só precisa de um token de API e de um script bash no Raspberry Pi. Em meia hora, configura um esquema que atualiza automaticamente o registo A sempre que o IP muda.
E se quiser não apenas «entrar na consola», mas implementar um site de desenvolvimento completo, até mesmo em WordPress, esta configuração torna-se a base: obtém acesso ao seu servidor a partir de qualquer lugar do mundo através de um subdomínio agradável como home.example.com.
💡 Visão geral rápida:
- Passo 1: Crie um registo A no painel de DNS da Cloudflare com o IP de teste
0.0.0.0 - Passo 2: Obtenha um token de API (não uma chave global, os tokens são mais seguros e revogáveis com um clique)
- Passo 3: Execute um script bash que consulta o IP atual e o envia para a API da Cloudflare
- Passo 4: Configure um cron job e esqueça para sempre as atualizações manuais
O que vai precisar
- Um domínio adicionado à Cloudflare e gerido através do DNS deles
- Raspberry Pi (qualquer modelo funciona, Pi 3, Pi 4, Pi Zero 2 W) com Raspbian ou Raspberry Pi OS
- IP local estático para o Raspberry Pi (configurado na interface gráfica do SO ou via router)
- Acesso ao terminal do Pi via SSH ou diretamente
Que serviços específicos aloja no Raspberry Pi e como faz o encaminhamento de portas no router é um tópico à parte, fora do âmbito deste tutorial. O esquema funciona de forma idêntica, quer seja para um servidor web com WordPress, acesso VNC ou uma câmara de vigilância.
1. Crie um registo A para o seu servidor doméstico
Escolha um subdomínio, será o seu ponto de entrada permanente. Eu uso home, mas pode escolher qualquer um: dev, lab, cam.
- Aceda ao painel da Cloudflare e selecione o seu domínio
- Navegue até ao separador DNS
- Clique em Adicionar registo, tipo A
- No campo Nome introduza o subdomínio (por exemplo,
home) - No campo **Endereço **IPv4 especifique
0.0.0.0, temporariamente, para testar o script mais tarde - Deixe o Estado do proxy desativado (nuvem cinzenta), cache e proxy não são necessários para DDNS

O registo está pronto. Vamos agora obter a chave de acesso à API.
2. Obter o token de API da Cloudflare
Anteriormente, todos os guias sugeriam a chave de API global, que dá acesso total a todos os domínios da conta. Isto é perigoso: se a chave for comprometida, tudo fica comprometido. Agora, a Cloudflare recomenda tokens de API com permissões granulares. Um token pode ser limitado a um domínio e ação específicos e, em caso de compromisso, revogado com um clique.
- No painel da Cloudflare, aceda a: O Meu Perfil → Tokens de API
- Clique em Criar Token
- Selecione o modelo Editar zona DNS (ou crie um personalizado)
- Na secção Recursos da Zona, especifique o domínio específico para o qual está a configurar o DDNS
- Clique em Continuar para o resumo → Criar Token
- Copie o token, ele é mostrado apenas uma vez
O token parece uma longa cadeia de caracteres que começa por cfut_. Guarde-o num local seguro, o script no Raspberry Pi vai precisar dele dentro de momentos.
3. Script de atualização automática no Raspberry Pi
Ligue-se ao Raspberry Pi via SSH ou abra o terminal. Vamos criar uma pasta para o script:
1 mkdir -p ~/cf && cd ~/cf
Agora, o script em si. Crie o ficheiro cloudflare-ddns.sh:
1 nano ~/cf/cloudflare-ddns.sh
Copie o seguinte código para dentro dele:
1 #!/bin/bash 2 3 ## Settings (replace with yours) 4 AUTH_EMAIL="[email protected]" 5 API_TOKEN="cfut_your_token" 6 ZONE_NAME="example.com" 7 RECORD_NAME="home.example.com" 8 9 ## Get current public IP 10 CURRENT_IP=$(curl -s https://api.ipify.org) 11 12 ## Get Zone ID 13 ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \ 14 -H "Authorization: Bearer $API_TOKEN" \ 15 -H "Content-Type: application/json" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) 16 17 ## Get Record ID and current record IP 18 RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \ 19 -H "Authorization: Bearer $API_TOKEN" \ 20 -H "Content-Type: application/json") 21 22 RECORD_ID=$(echo "$RECORD" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) 23 DNS_IP=$(echo "$RECORD" | grep -o '"content":"[^"]*"' | head -1 | cut -d'"' -f4) 24 25 ## Update record if IP changed 26 if [ "$CURRENT_IP" != "$DNS_IP" ]; then 27 UPDATE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \ 28 -H "Authorization: Bearer $API_TOKEN" \ 29 -H "Content-Type: application/json" \ 30 --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120}") 31 32 echo "$(date): IP changed from $DNS_IP to $CURRENT_IP — updated" >> ~/cf/cloudflare-ddns.log 33 else 34 echo "$(date): IP unchanged ($CURRENT_IP)" >> ~/cf/cloudflare-ddns.log 35 fi
Substitua as quatro variáveis no bloco «Settings» pelos seus valores reais. Email, o mesmo do login do Cloudflare. Token, o que copiou no passo 2. Zone name, o seu domínio sem http://. Record name, o subdomínio completo.
Guarde o ficheiro (Ctrl+O, Enter, Ctrl+X no nano) e torne-o executável:
1 chmod +x ~/cf/cloudflare-ddns.sh
Execute manualmente para verificar:
1 ~/cf/cloudflare-ddns.sh
Se tudo estiver configurado corretamente, vá ao painel de DNS do Cloudflare; o endereço IP do registo A deve mudar de 0.0.0.0 para o seu IP público real. O log é escrito em ~/cf/cloudflare-ddns.log; verifique aí se algo correu mal.
4. Automação via cron
A execução manual serve apenas para testes. A partir daqui, o cron assume o controlo.
1 crontab -e
Se o sistema lhe pedir para escolher um editor, escolha nano (normalmente a opção 2, é o mais simples). Adicione uma linha no final do ficheiro:
1 0 */6 * * * /bin/bash /home/pi/cf/cloudflare-ddns.sh
Esta entrada executa o script a cada 6 horas. Mesmo que o ISP mude o IP apenas de poucos em poucos meses, uma janela de seis horas é um compromisso razoável entre a atualização atempada e a carga na API.
Se quiser uma frequência maior, substitua por */30 * * * * (a cada 30 minutos). Mas lembre-se: o limite gratuito da API do Cloudflare é de 1200 pedidos por minuto, por isso, mesmo chamadas ao minuto não assustam para um único domínio.
Guarde (Ctrl+X, S, Enter). O cron deteta as alterações automaticamente, não é preciso reiniciar o serviço. Ajuda para descodificar os asteriscos em crontab.guru.
Vídeo-guia curto sobre este mesmo tópico, do NetworkChuck, com demonstração num Raspberry Pi real e explicação de cada passo:
O que fazer se o script não encontrou o Zone ID ou o Record ID
Por vezes, a API não devolve os identificadores automaticamente, especialmente se a conta tiver muitos domínios ou registos com nomes semelhantes. Nesse caso, obtenha-os manualmente:
- Vá ao painel do Cloudflare, selecione o domínio, separador DNS
- Abra as ferramentas de programador do navegador (
F12→ separador Network → subseparador XHR) - Clique no ícone da nuvem ao lado do seu registo A; aparecerá um pedido à API no painel de rede
- Clique com o botão direito sobre ele → Copy → Copy link address (Chrome) ou Copy URL (Firefox)
- No link copiado, encontre a parte depois de
zones/, esse é o Zone ID, e depois dedns_records/, o Record ID
Substitua-os nas variáveis ZONE_ID e RECORD_ID no script e tudo funcionará. Certifique-se de que a nuvem no painel de DNS está cinzenta (proxy desligado): o Cloudflare não deve fazer cache do IP para DDNS.
⁉️🤔 Perguntas frequentes
É obrigatório usar um token de API em vez da chave global?
A chave global ainda funciona, mas o token é a opção moderna e segura. Um token pode ser limitado a um domínio e a permissões de edição de DNS. A chave global dá acesso a toda a conta. Se o script ou o Pi forem comprometidos, basta revogar o token, enquanto que com a chave teria de a alterar em todo o lado.
Em que é que esta abordagem difere do DuckDNS ou do No-IP?
Os serviços de DDNS de terceiros fornecem um subdomínio de terceiro nível como
myhome.duckdns.org. A abordagem com o Cloudflare usa o seu próprio domínio (home.example.com), o que tem um aspeto mais profissional, não depende do serviço de outrem e não exige um login mensal para confirmação de atividade. Além disso, ganha acesso a todo o ecossistema Cloudflare: proteção DDoS, certificados SSL, regras de firewall.
Preciso de abrir portas no router?
Sim, para chegar ao Raspberry Pi a partir da internet. O DDNS apenas garante que o domínio aponta sempre para o IP atual. Mas para que o tráfego desse IP chegue ao Pi, precisa de configurar o reencaminhamento de portas no router para as portas necessárias (22 para SSH, 80/443 para web, e assim por diante).
O que fazer se o Raspberry Pi estiver atrás de NAT do ISP?
Alguns ISPs usam Carrier-Grade NAT (CGNAT); nesse caso, não tem um IP público próprio e o DDNS não ajudará. Solução: peça um IP público ao ISP (muitas vezes gratuito por pedido) ou use o Cloudflare Tunnel, que cria um canal encriptado do Pi para o Cloudflare sem necessidade de abertura de portas.
Quanto custa esta solução?
Zero. O DNS do Cloudflare é gratuito para registos A ilimitados. O Raspberry Pi já o comprou. O consumo de energia de um Pi 3/4 sob carga é de cerca de 3 a 5 W, o que anualmente ronda os 250 a 400 dólares.
Posso atualizar vários subdomínios?
Sim, duplique os blocos com
RECORD_NAMEeDNS_IPno script para cada subdomínio ou envolva a lógica num ciclo sobre um array de nomes.
DNS dinâmico na Cloudflare: o que configurar em 2026
O esquema com a API da Cloudflare e o cron já sobreviveu a várias gerações de Raspberry Pi e não perdeu relevância. Obtém o seu próprio subdomínio, não depende de fornecedores de DDNS de terceiros e não paga um cêntimo.
Se quiser ir mais longe, explore imagens Docker prontas a usar: oznu/cloudflare-ddns atualiza o IP a cada 5 minutos e é configurado através de variáveis de ambiente. Para quem prefere Python, existe aribasadme/rpi-cloudflare-ddns, feito especificamente para Raspberry Pi.
O principal que fez hoje: o Raspberry Pi está agora acessível a partir de qualquer parte do mundo num endereço permanente. E esta é a base para tudo: desde um servidor de desenvolvimento WordPress até ao seu próprio armazenamento na cloud.



