PowerDNS
Servidor DNS autoritativo com backend em banco de dados — arquitetura, API, DNSSEC integrado e integração real com sistemas de provisionamento de ISP.
Nesta página
1. Contexto e histórico
O PowerDNS foi criado em 1999 na Holanda, por Bert Hubert, com uma premissa radicalmente diferente do BIND: em vez de ler zonas de arquivos texto, o PowerDNS foi projetado desde o início para armazenar registros DNS em backends de banco de dados — MySQL, PostgreSQL, SQLite, LDAP, e até backends customizados via pipe ou Lua. Essa arquitetura o tornou a escolha natural para ISPs e empresas que precisam integrar DNS com sistemas de provisionamento, portais de autoatendimento e APIs.
O projeto é dividido em dois componentes independentes: o Authoritative Server (que responde por zonas próprias) e o Recursor (resolvedor recursivo para clientes). Ambos são mantidos pela PowerDNS.COM BV e pela comunidade open‑source (GPLv2).
2. Arquitetura interna
O PowerDNS Authoritative Server é composto por:
- Core (pdns_server) — recebe consultas DNS, gerencia cache e orquestra o fluxo.
- Backends — plugins que conectam o core a diferentes fontes de dados (gmysql, gpgsql, sqlite3, pipe, remote).
- Packet Cache — cache de respostas inteiras, baseado na consulta exata (incluindo flags). Extremamente rápido (in‑memory).
- Query Cache — cache de resultados de consultas ao backend. Reduz a carga no banco de dados.
- Webserver interno — serve a API REST (seção 6) e estatísticas.
2.1 Tipos de zona (Kind)
| Tipo | Descrição |
|---|---|
| Native | Zona gerenciada localmente, sem replicação built‑in (a replicação fica a cargo do banco de dados ou de AXFR externo). |
| Master | Envia notificações (NOTIFY) e permite AXFR para slaves. |
| Slave | Recebe zona via AXFR/IXFR de um master e armazena no backend. |
3. Instalação (Debian/Ubuntu)
apt update
apt install pdns-server pdns-backend-mysql mariadb-server
pdns_server --version
4. Backend gmysql e modelo de dados
4.1 Criação do banco e schema
mysql -u root -p -e "CREATE DATABASE pdns;"
mysql -u root -p pdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql
mysql -u root -p -e "
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'senha-forte-aqui';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;"
4.2 Tabelas principais do schema
| Tabela | Função |
|---|---|
domains | Lista de zonas (nome, tipo, master, serial). |
records | Registros DNS propriamente ditos (nome, tipo, conteúdo, TTL). |
supermasters | Lista de masters autorizados a criar zonas slave automaticamente. |
domainmetadata | Metadados da zona (ex.: chaves DNSSEC, NSEC3 params). |
cryptokeys | Chaves DNSSEC (KSK e ZSK) armazenadas no banco. |
tsigkeys | Chaves TSIG para autenticação de transferências de zona. |
4.3 Configuração do backend
# /etc/powerdns/pdns.conf
launch=gmysql
gmysql-host=127.0.0.1
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=senha-forte-aqui
gmysql-dnssec=yes
systemctl restart pdns
5. Gerenciamento de zonas — pdnsutil
pdnsutil create-zone exemplo-isp.com.br ns1.exemplo-isp.com.br
pdnsutil add-record exemplo-isp.com.br www A 203.0.113.20
pdnsutil add-record exemplo-isp.com.br radius A 10.0.0.5
pdnsutil add-record exemplo-isp.com.br @ MX "10 mail.exemplo-isp.com.br"
pdnsutil replace-rrset exemplo-isp.com.br www A "203.0.113.21"
pdnsutil edit-zone exemplo-isp.com.br
pdnsutil list-all-zones
pdnsutil check-zone exemplo-isp.com.br
6. API HTTP — automação real
A API REST do PowerDNS é o diferencial mais relevante para ISPs com portal de provisionamento. Com ela, é possível criar, editar e remover registros DNS programaticamente, sem tocar no banco de dados diretamente:
# /etc/powerdns/pdns.conf
api=yes
api-key=chave-de-api-forte-aqui
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
# Criar registro A via API
curl -X PATCH http://127.0.0.1:8081/api/v1/servers/localhost/zones/exemplo-isp.com.br. \
-H "X-API-Key: chave-de-api-forte-aqui" \
-H "Content-Type: application/json" \
-d '{
"rrsets": [{
"name": "novo-cliente.exemplo-isp.com.br.",
"type": "A",
"ttl": 3600,
"changetype": "REPLACE",
"records": [{"content": "203.0.113.99", "disabled": false}]
}]
}'
7. Master/Slave e replicação
# Master
pdnsutil set-kind exemplo-isp.com.br master
# Slave — pdns.conf
slave=yes
allow-notify-from=203.0.113.1
# Registrar zona slave
pdnsutil create-secondary-zone exemplo-isp.com.br 203.0.113.1
PowerDNS interopera com BIND via AXFR/IXFR padrão. A replicação do banco de dados (ex.: MySQL Group Replication) pode substituir a replicação DNS tradicional em ambientes que preferem consistência via banco.
8. DNSSEC integrado
Diferente do BIND, onde a assinatura gera um arquivo .signed separado, o PowerDNS gerencia todo o ciclo de vida do DNSSEC internamente, armazenando chaves no banco de dados:
pdnsutil secure-zone exemplo-isp.com.br
pdnsutil show-zone exemplo-isp.com.br
# Exibe o registro DS a ser enviado ao registrador
9. PowerDNS Recursor
O pdns-recursor é um binário separado, especializado em recursão DNS com validação DNSSEC. A separação física entre autoritativo e recursivo é uma decisão de arquitetura que aumenta a segurança e o isolamento de falhas — recomendado para ISPs que precisam de ambos os papéis.
10. Performance e dimensionamento
O PowerDNS com backend MySQL pode lidar com dezenas de milhares de consultas/segundo se bem configurado. Fatores críticos:
- Packet Cache — ativado por padrão (
cache-ttl), reduz drasticamente as consultas ao banco. - Query Cache —
query-cache-ttlarmazena resultados de consultas ao backend. - Índices no banco — garanta índices em
records(name, type)edomains(name). - Replicação de banco — use slaves MySQL para distribuir consultas de leitura.
- Anycast — múltiplos servidores PowerDNS compartilhando o mesmo IP via BGP.
11. Segurança e hardening
- Restringir transferência de zona —
allow-axfr-ipsapenas para IPs dos slaves. - Rate limiting — configurar
max-qper-qdomainpara evitar amplificação. - API protegida —
api-keyforte, webserver restrito a localhost ou IPs confiáveis. - TSIG — autenticar transferências de zona com chave criptográfica.
- DNSSEC — assinar zonas para prevenir cache poisoning.
12. Monitoramento
O PowerDNS expõe métricas via API (/api/v1/servers/localhost/statistics) e também pode ser consultado via pdns_control. Script de health check para Zabbix/PRTG:
#!/bin/bash
# check_pdns.sh
dig @localhost exemplo-isp.com.br SOA +short +time=2
if [ $? -eq 0 ]; then
echo "OK: PowerDNS respondendo"
exit 0
else
echo "CRITICAL: PowerDNS não responde"
exit 2
fi
13. Backup e recuperação
No PowerDNS, o backup é centrado no banco de dados:
- Banco
pdns(tabelasdomains,records,cryptokeys). - Arquivo
/etc/powerdns/pdns.conf(configuração). - Chaves DNSSEC também estão no banco — um dump completo do banco as preserva.
Use restic ou Borg com a regra 3‑2‑1‑1‑0. A restauração consiste em recriar o banco, reinstalar o PowerDNS e apontar para o banco restaurado.
14. Comparação com BIND e outros
| Característica | PowerDNS | BIND9 |
|---|---|---|
| Armazenamento | Banco de dados (MySQL, PostgreSQL, SQLite) | Arquivos de zona texto |
| API nativa | Sim (REST) | Não (depende de ferramentas externas) |
| DNSSEC | Integrado ao banco (chaves no schema) | Arquivos separados (.signed, .key) |
| Views (Split DNS) | Não (usa‑se instâncias separadas) | Sim, nativas |
| Recursão | Binário separado (pdns-recursor) | Mesmo daemon (opcional) |
| Ideal para | Automação, integração com sistemas | Ambientes tradicionais, todas as funcionalidades |
15. Troubleshooting
Verificar journalctl -u pdns — credencial errada ou schema não importado.
PowerDNS consulta o banco a cada requisição — verifique com pdnsutil list-zone se o registro foi de fato gravado.
Header X-API-Key ausente ou divergente do api-key em pdns.conf.
16. Glossário
17. Referências
- Documentação oficial PowerDNS (doc.powerdns.com) — Authoritative Server, backends, API.
- RFC 1034/1035 — Domain Names (base do protocolo DNS).
- RFC 4033/4034/4035 — DNSSEC.
- Páginas relacionadas: BIND9, DNSSEC, Unbound.
Conteúdo técnico independente. Nenhum trecho é cópia literal de fonte de terceiro.