Validador de arquivos de zona DNS
Um arquivo de zona parece uma tabela e se comporta como um programa. O nome do proprietário de um registro pode ser herdado da linha anterior só porque a linha começa com um espaço; um nome sem ponto final recebe a origem atual atrás dele, então `www IN CNAME example.com` vira silenciosamente example.com.example.com.; uma diretiva $ORIGIN ou $TTL no meio do arquivo muda o sentido de tudo o que vem abaixo; e um registro espalhado por várias linhas dentro de parênteses é um único registro por mais que esteja indentado. Este validador analisa o arquivo do jeito que a seção 5 do RFC 1035 define — strings entre aspas, comentários, escapes com barra invertida, continuações entre parênteses, as unidades de TTL do BIND 8 e a regra de herança do proprietário — e então mostra a zona que o arquivo realmente descreve: cada registro com o proprietário completo, o TTL que um servidor de fato responderia e uma contagem por tipo. Além da análise, ele roda as verificações que um analisador não tem motivo para fazer. Aponta um nome escrito sem ponto final, ao qual a origem será anexada; um CNAME dividindo o nome com qualquer outro registro, o que o RFC 1034 proíbe e que a maioria dos servidores se recusa a carregar; uma cadeia de CNAME que volta para si mesma; um destino de MX, NS ou CNAME dentro da zona sem nenhum registro de endereço por trás; um TTL zero; um registro duplicado; um nome fora da origem, que o carregador descarta sem dizer nada; e um SOA cujo serial não tem forma de data ou cujo TTL de cache negativo manteria um erro de digitação vivo por dias. Cada achado nomeia a linha de onde veio, assim como cada erro de análise, junto com a própria linha. O que ele não consegue dizer é se a zona é verdadeira. Nunca consulta a rede, então não sabe se o endereço que você deu a um host é o endereço que esse host tem, se o servidor para o qual você delega está mesmo respondendo, ou se o TXT que você colou bate com o que o seu provedor espera. Ele também verifica um arquivo, não uma zona em execução: um registro servido a partir de um banco de dados, um curinga expandido no momento da consulta e um CNAME que vive em outra zona ficam todos fora do seu campo de visão. Para as respostas ao vivo use uma ferramenta de consulta DNS; use esta antes de carregar o arquivo, enquanto um ponto que falta ainda não custa nada.
Cada registro aparece com o nome do proprietário completo e com o TTL que o servidor realmente responderia.
Registros
14
Nomes
7
Tipos
8
Achados
5
$ORIGIN no fim do arquivo
example.com.
TTL padrão
3600 (de $TTL)
Servidor de nomes primário
ns1.example.com.
O MNAME: o mestre de onde um secundário transfere e o servidor que envia os NOTIFY.
Caixa postal responsável
hostmaster@example.com
O RNAME, escrito como nome de domínio; o primeiro rótulo é a parte local do endereço.
Serial
2026090301
Um secundário só transfere a zona quando este número sobe, comparado como serial de 32 bits.
Refresh
7200 (2h)
De quanto em quanto tempo um secundário reconfere o serial quando um NOTIFY não chega.
Retry
3600 (1h)
Quanto um secundário espera antes de tentar de novo depois de uma atualização falha.
Expire
1209600 (2w)
Passado esse tempo sem uma transferência bem-sucedida, o secundário para de responder pela zona.
TTL de cache negativo
300 (5m)
Desde o RFC 2308 este campo limita quanto tempo uma resposta NXDOMAIN fica em cache; já não é o TTL padrão da zona.
- ErroLinha 19Escrito sem ponto final, então a origem é anexadaexample.com → example.com.example.com.
- ErroLinha 20Escrito sem ponto final, então a origem é anexadashops.myprovider.net → shops.myprovider.net.example.com.
- AvisoLinha 19O destino está dentro desta zona mas não tem registro de endereçoCNAME → example.com.example.com.
- AvisoLinha 20O destino está dentro desta zona mas não tem registro de endereçoCNAME → shops.myprovider.net.example.com.
- AvisoLinha 21Um TTL zero proíbe qualquer cache deste registroold.example.com. A
| Proprietário | TTL | Classe | Tipo | Dados |
|---|---|---|---|---|
| example.com. | 3600 | IN | SOA | ns1.example.com. hostmaster.example.com. 2026090301 7200 3600 1209600 300 |
| example.com. | 3600 | IN | NS | ns1.example.com. |
| example.com. | 3600 | IN | NS | ns2.example.com. |
| example.com. | 3600 | IN | A | 192.0.2.10 |
| example.com. | 3600 | IN | AAAA | 2001:db8::10 |
| example.com. | 3600 | IN | MX | 10 mail.example.com. |
| example.com. | 3600 | IN | TXT | "v=spf1 mx -all" |
| example.com. | 3600 | IN | CAA | 0 issue "letsencrypt.org" |
| ns1.example.com. | 3600 | IN | A | 192.0.2.1 |
| ns2.example.com. | 3600 | IN | A | 192.0.2.2 |
| mail.example.com. | 3600 | IN | A | 192.0.2.3 |
| www.example.com. | 3600 | IN | CNAME | example.com.example.com. |
| shop.example.com. | 3600 | IN | CNAME | shops.myprovider.net.example.com. |
| old.example.com. | 0 | IN | A | 192.0.2.9 |
Tudo roda no seu navegador: o arquivo nunca é enviado e nada é consultado pela rede.
Como usar
- Cole o arquivo de zona na caixa. Ele fica no navegador: nada é enviado e nenhuma consulta é feita.
- Deixe o campo de origem vazio se o arquivo começa com $ORIGIN. Se não, escreva ali o nome da zona exatamente como a configuração do servidor o nomeia, porque o mesmo arquivo significa coisas diferentes sob origens diferentes.
- Se o arquivo não for analisado, leia o número da linha e a linha impressa abaixo: o erro é relatado onde o analisador desistiu, o que para uma aspa solta ou um parêntese aberto pode ser uma linha depois do engano.
- Confira o painel do SOA: a caixa postal responsável aparece como endereço de e-mail e cada temporizador vem em segundos com a forma legível ao lado.
- Percorra os achados de cima para baixo — primeiro erros, depois avisos e por fim notas — e use o número da linha de cada um para voltar ao registro problemático.
Perguntas frequentes
- Por que meu CNAME virou example.com.example.com.?
- Porque o destino não tinha ponto final. Num arquivo mestre todo nome é relativo à origem atual, a menos que termine em ponto, e o analisador não tem como saber se "example.com" era para ser um nome totalmente qualificado ou um host chamado example.com dentro da sua zona. A regra vale para todos os campos de nome, não só CNAME: destinos de MX, NS e SRV e o servidor primário do SOA recebem a origem do mesmo jeito. O hábito que evita isso é escrever com ponto todo nome que sai da sua zona e escrever os de dentro como rótulos soltos.
- O arquivo não tem $TTL. Isso é um erro?
- Não necessariamente. O RFC 1035 não tinha a diretiva $TTL; o RFC 2308 a acrescentou e passou a exigi-la, mas a maioria dos analisadores, dnspython incluído, ainda recorre ao campo minimum do SOA para qualquer registro sem TTL próprio — e se o SOA for o primeiro registro, o TTL dele também vem do seu minimum. Um registro sem TTL que apareça antes do SOA e antes de qualquer $TTL é um erro de verdade, já que não há de que herdar. Esta ferramenta relata esse recurso como nota e diz qual valor acabou sendo usado.
- Dois registros com o mesmo nome e tipo têm TTLs diferentes. Qual vence?
- Nenhum, na prática. Todos os registros de um mesmo nome e tipo formam um único RRset, e um RRset é servido com um só TTL; quando o arquivo dá vários, o carregador fica com o menor e não há aviso nenhum no log. Isso significa que um registro de 60 segundos ao lado de um de 86400 do mesmo nome e tipo deixa os dois em 60 segundos, o que costuma ser o contrário do que o autor queria. A ferramenta mostra o TTL efetivo na tabela e marca cada linha cujo TTL escrito foi sobreposto.
- Por que um registro com nome fora da zona some da tabela?
- Porque ele some da zona. Um carregador só guarda os registros cujo nome de proprietário esteja na origem da zona ou abaixo dela; o resto são dados fora de zona e são descartados em silêncio, e não rejeitados. É assim que um registro PTR colado numa zona direta, ou um registro que sobrou da origem anterior depois de uma linha $ORIGIN, desaparece sem que o arquivo chegue a falhar. A ferramenta lista cada nome descartado como achado para que o sumiço pelo menos fique visível.
- Um registro TXT pode passar de 255 caracteres?
- O registro pode; uma única string dentro dele não. Uma character-string no DNS carrega um comprimento de um octeto, então 255 é o teto duro, e uma string entre aspas maior que isso é erro de sintaxe, não truncamento. O jeito de escrever um valor longo de DKIM ou SPF é com vários pedaços entre aspas num mesmo registro — "primeira parte" "segunda parte" — que o servidor concatena sem nada no meio. Os resolvedores entregam os pedaços separadamente à aplicação, então um valor cortado num ponto arbitrário se remonta certo, mas só se os pedaços estiverem na ordem.
- Um arquivo de zona válido significa que o DNS vai funcionar?
- Não. A análise prova a sintaxe, e as verificações extras aqui provam alguma coerência interna, mas nada dentro de um arquivo pode dizer que a zona pai delega para os seus servidores de nomes, que esses servidores carregaram esta versão, que os endereços são alcançáveis ou que o serial que você subiu é mesmo maior que o que os seus secundários já têm. A comparação de seriais, em particular, é aritmética de espaço de sequência de 32 bits, então um serial que "caiu" porque alguém digitou uma data errada pode deixar os secundários presos na zona antiga até o número dar a volta.
Ferramentas relacionadas
Referência de Registros DNS
Cheat sheet pesquisável de tipos de registro DNS — A, AAAA, CNAME, MX, TXT, NS, SOA, PTR, SRV, CAA, DNSSEC, SVCB / HTTPS — com exemplos.
Divisor de Registro TXT (Chunks de 255 Bytes)
Divida um registro TXT SPF, DKIM ou DMARC longo nos chunks de 255 bytes que o DNS exige — com saída BIND, zone genérico, Cloudflare ou Route 53.
Construtor e parser de registros DKIM
Construa ou parseie um registro DNS TXT DKIM — cole a chave pública, escolha selector, tipo de chave, hash e flags, e obtenha o registro fragmentado.
Construtor de registros DNS CAA
Gere registros DNS CAA (Certificate Authority Authorization) para que apenas as CAs que você autoriza possam emitir certificados TLS para o seu domínio.
Inspetor de bibliotecas estáticas .a
Leia um arquivo .a no navegador: membros com tamanhos e datas, os símbolos que cada objeto define e precisa, e se o índice de símbolos ficou desatualizado.
Inspetor de arquivos TZif (zoneinfo)
Abra um arquivo zoneinfo compilado no navegador: cabeçalho, tipos de hora local, transições, segundos bissextos e o rodapé POSIX TZ.