Dig Crash Course

DIG Crash Course

O DIG é uma ferramenta para interrogar servidores de DNS.

Com o DIG nós conseguiremos fazer lookup de DNS com objetivos simples como troubleshooting por exemplo.

A ideia aqui é fazer um crash course dessa ferramenta.

Um Crash Course é um tipo de “curso rápido” sobre um determinado assunto, indo direto ao ponto de forma mais objetiva possível.

Quando devo usar o DIG?

Sempre que você precisar verificar alguma coisa em nível de DNS, seguem alguns cenários que o DIG pode te ajudar :

Essas são algumas das situações mais básicas em que o DIG pode ser útil.

Para quem foi feito esse post?

Aqui o foco está nas pessoas atuando nas posições abaixo:

Momento Merchan :P

Me siga no twitter @gutocarvalho e acompanhe meus posts sobre Cloud Native e CI/CD.

Aproveite e siga a CD Foundation e Cloud Native Foundation no twitter.

Colaboradores

Pessoas que colaboraram com o texto.

Dig Crash Course

Aprendendo o básico para uso no dia a dia

fazendo uma pesquisa simples com todos os detalhes

$ dig gutocarvalho.net

fazendo uma pesquisa simples retornando só o IP

$ dig +short gutocarvalho.net

pesquisando o SOA do domínio

$ dig SOA gutocarvalho.net

pesquisando o NS do domínio

$ dig NS gutocarvalho.net

pesquisando o MX de correio

$ dig MX gutocarvalho.nmet

pesquisando o TTL do domínio

$ dig TTL gutocarvalho.net

pesquisando o PTR (reverso) de um IP

$ dig -x 8.8.8.8

pesquisando os registros TXT de um domínio

$ dig txt gutocarvalho.net

Explorando um pouco mais o DIG

pesquisando um registro em um NS específico

$ dig @1.1.1.1 lb.gutocarvalho

pesquisando as informações DNSSEC de um domínio

$ dig +dnssec gutocarvalho.net

pesquisando as chaves DNSSEC de um domínio

$ dig DNSKEY -qr gutocarvalho.net

pesquisando uma entrada de DNS com trace

$ dig +trace lb.gutocarvalho.net

verificando o tempo de resposta do SOA de um domínio

$ dig +nssearch gutocarvalho.net

Parâmetros interessantes do DIG

+short

$ dig gutocarvalho.net +short

185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153

O short só retorna os IPs para qual o registro aponta.

+tcp

$ dig +tcp gutocarvalho.net

Usado quando desejamos fazer a pesquisa via TCP, o padrão é UDP.

+time

$ dig +time=5 gutocarvalho.net

Define o timeout da pesquisa para 5 segundos.

+multiline

$ dig gutocarvalho.net A +dnssec +multiline

Vai pesquisar entradas A com DNSSEC associado em multi-linhas.

Filtrando saída do DIG com parâmetros especiais

Primeiro vamos fazer uma pesquisa comum para ter uma saída completa

$ dig gutocarvalho.net

; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40038
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

;; ANSWER SECTION:
gutocarvalho.net.	300	IN	A	185.199.108.153
gutocarvalho.net.	300	IN	A	185.199.109.153
gutocarvalho.net.	300	IN	A	185.199.110.153
gutocarvalho.net.	300	IN	A	185.199.111.153

;; Query time: 38 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 18:53:55 -03 2022
;; MSG SIZE  rcvd: 109

Agora vamos testando cada parâmetro

+noall

$ dig gutocarvalho.net +noall

; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noall
;; global options: +cmd

Observe que o noall omite toda a saída do comando, ele normalmente é usado com outros comandos de forma composta, um exemplo é o answer.

+answer +noall

$ dig gutocarvalho.net +noall +answer

; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noall +answer
;; global options: +cmd
gutocarvalho.net.	300	IN	A	185.199.111.153
gutocarvalho.net.	300	IN	A	185.199.108.153
gutocarvalho.net.	300	IN	A	185.199.109.153
gutocarvalho.net.	300	IN	A	185.199.110.153

O answer é útil junto com o noall, ele vai nos trazer apenas a resposta, sem comments, question, authority, stats e quaisquer outras informações que estiverem disponíveis na resposta.

+nocmd

 dig +nocmd a lb.gutocarvalho.net +noall +answer
lb.gutocarvalho.net.	42	IN	A	200.150.204.87

Quando aplicado retira a versao do bind e comando

; <<>> DiG 9.10.6 <<>> a lb.gutocarvalho.net +noall +answer

Para funcionar o parâmetro tem que vir logo após o comando dig

+nocomments

$ dig gutocarvalho.net +nocomments

; <<>> DiG 9.10.6 <<>> gutocarvalho.net +nocomments
;; global options: +cmd
;gutocarvalho.net.		IN	A
gutocarvalho.net.	297	IN	A	185.199.110.153
gutocarvalho.net.	297	IN	A	185.199.111.153
gutocarvalho.net.	297	IN	A	185.199.108.153
gutocarvalho.net.	297	IN	A	185.199.109.153
;; Query time: 29 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 18:58:57 -03 2022
;; MSG SIZE  rcvd: 109

O nocomments retira toda a parte inicial da resposta

; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40925
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

+noquestion

$ dig gutocarvalho.net +noquestion

; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noquestion
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10078
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; ANSWER SECTION:
gutocarvalho.net.	300	IN	A	185.199.108.153
gutocarvalho.net.	300	IN	A	185.199.109.153
gutocarvalho.net.	300	IN	A	185.199.110.153
gutocarvalho.net.	300	IN	A	185.199.111.153

;; Query time: 42 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:01:58 -03 2022
;; MSG SIZE  rcvd: 109

O noquestion retira essa parte da resposta

;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

+nostats

$ dig gutocarvalho.net +nostats

; <<>> DiG 9.10.6 <<>> gutocarvalho.net +nostats
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63625
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

;; ANSWER SECTION:
gutocarvalho.net.	300	IN	A	185.199.109.153
gutocarvalho.net.	300	IN	A	185.199.110.153
gutocarvalho.net.	300	IN	A	185.199.111.153
gutocarvalho.net.	300	IN	A	185.199.108.153

Esse parâmetro suprime as estatísticas da pesquisa.

;; Query time: 38 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:13:28 -03 2022
;; MSG SIZE  rcvd: 109

+noauthority

;; AUTHORITY SECTION:
gutocarvalho.net.	3144	IN	NS	monroe.ns.cloudflare.com.
gutocarvalho.net.	3144	IN	NS	houston.ns.cloudflare.com.

É útil para remover essa parte da resposta, caso retorne o authority na pesquisa.

+noadditional

;; ADDITIONAL SECTION:
lia.ns.cloudflare.com.	84354	IN	A	  173.245.58.185
lia.ns.cloudflare.com.	170762	IN	AAAA  2400:cb00:2049:1::adf5:3ab9
mark.ns.cloudflare.com.	170734	IN	A	  173.245.59.130
mark.ns.cloudflare.com.	170734	IN	AAAA  2400:cb00:2049:1::adf5:3b82

A seção aditional pode trazer informações como o IP dos DNS Server autoritativos da seção authority, esse parâmetro suprime esse trecho.

+norec

$ dig +norec @monroe.ns.cloudflare.com. gutocarvalho.net a

Essa opção desabilita a pesquisa recursiva, neste caso a CloudFlare e responsável por responder por meu domínio, sendo que o servidor monroe é um dos meus servidores DNS, ele já sabe a resposta.

Pesquisas parametrizadas comuns

pesquisa comum e rápida que retorna apenas o endereço IP

$ dig +short lb.gutocarvalho.net

pesquisando por registro A com resposta simples

$ dig +nocmd lb.gutocarvalho.net a +noall +answer

pesquisando por CNAME com resposta simples

$ dig +nocmd mail.google.com cname +noall +answer

pesquisando por registro TXT com resposta simples

$ dig +nocmd google.com txt +noall +answer

fazendo pesquisa em múltiplos domínios

$ dig ubuntu.com mx +noall +answer redhat.com ns +noall +answer

Pesquisa usando um arquivo (bulk)

Imagine que você tem o arquivo dominios.txt com o conteúdo abaixo

gutocarvalho.net
nativetrail.io
viahorizonte.life

vamos rodar agora uma pesquisa contra o arquivo

$ dig -f dominios.txt +short

saída

185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153
185.199.111.153
185.199.108.153
185.199.109.153
185.199.110.153
185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153

:)

Quer saber mais?

Para saber mais veja o help do comando

$ dig —help

Para ir além acesse a manpage

$ man dig

Configurando seu .digrc

O dig tem um arquivo de configuração, o famoso .digrc.

$ echo “+nostats +nocomments +nocmd +noquestion +recurse” > ~/.digrc

Agora você digita menos e tem o resultado desejado.

Um pouco de teoria de DNS para quem gosta :)

Entendendo o funcionamento do DIG

Imagine que mandamos essa query pelo dig

$ dig gutocarvalho.net

Essa query é estrutura da seguinte forma pelo DIG para o servidor de DNS autoritativo


           +-------------------------------------+
Header     | OPCODE=SQUERY                       |
           +-------------------------------------+
Question   | QNAME=GUTO.NET., QCLASS=IN, QTYPE=A |
           +-------------------------------------+
Answer     | <empty>                             |
           +-------------------------------------+
Authority  | <empty>                             |
           +-------------------------------------+
Additional | <empty>                             |
           +-------------------------------------+
           

A resposta do servidor que responde pelo domínio foi essa


; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48153
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

;; ANSWER SECTION:
gutocarvalho.net.	300	IN	A	185.199.110.153
gutocarvalho.net.	300	IN	A	185.199.111.153
gutocarvalho.net.	300	IN	A	185.199.108.153
gutocarvalho.net.	300	IN	A	185.199.109.153

;; Query time: 146 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sun Mar 13 10:37:26 -03 2022
;; MSG SIZE  rcvd: 109

Podemos estruturar dessa forma para entender melhor

           +--------------------------------------------+
Header     | OPCODE=SQUERY, RESPONSE, AA                |
           +--------------------------------------------+
Question   | QNAME=GUTO.NET., QCLASS=IN, QTYPE=A        |
           +--------------------------------------------+
Answer     | GUTO.NET. 300 IN A 185.199.108.153         | 
           |                   300 IN A 185.199.109.153 |
           |                   300 IN A 185.199.110.153 |
           |                   300 IN A 185.199.111.153 |
           +--------------------------------------------+
Authority  | <empty>                                    |
           +--------------------------------------------+
Additional | <empty>                                    |
           +--------------------------------------------+

Entendendo as repostas entregues pelo DIG

Uma resposta de consulta do DIG vem composta por informações separadas nas seções Header, Question, Answer, Authority e Additional.

+------------+
| Header     | Cabeçalho com informações diversas 
+------------+
| Question   | A questão enviada para o nameserver
+------------+
| Answer     | Registros que vão responder a query
+------------+
| Authority  | Registros da autoridade do domínio
+------------+
| Additional | Registros com informações adicionais
+------------+

Vamos entender cada uma delas.

- Header section, um cabeçalho fixo que contém ID, flgas e informações das outras seções (contadores)

- Question section, contém a query que foi passada (QNAME), o tipo (QTYPE) e a classe (QCLLASS). Na resposta receberemos novamente a query

- Answer section, pode conter a lista de reguistros, se houver resposta cada um irá trazer QNAME, QTYPE, QCLASS, TTL e informaçÕes de RDATA

- Authority section, pode conter a lista de registros que apontam para os servidores autoritativos

- Additional section, pode conter outros registros e mais informações sobre os servidores autoritativos

HEADER SECTION

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63625
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

Informações que encontramos do HEADER

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA| Z|AD|CD|   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QDCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ANCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    NSCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ARCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Entendendo as informações do HEADER

QR pode conter

- 0, QUERY 
- 1, RESPONSE

OPCODE pode conter os seguintes valores:

- 0	Query	[RFC1035]
- 2	Status	[RFC1035]
- 3	Unassigned	
- 4	Notify	[RFC1996]
- 5	Update	[RFC2136]
- 6	DNS Stateful Operations (DSO)	[RFC8490]
- 7-15	Unassigned

No Header vamos encontrar as seguintes FLAGs:

- AA: Authoritative Answer (set by the server)
- TC: message is TrunCated (set by the server)
- RD: Recursion Desired (set by the client and copied to the response)
- RA: Recursion Available (set by the server)
- AD: Authenticated Data, DNSSEC flag (set by the server)
- CD: Checking Disabled, DNSSEC flag (set by the client, copied to the response)

 No Header vamos encontrar o RCODE/Status (4 bits) que pode conter:

- 0	NoError	No Error	[RFC1035]
- 1	FormErr	Format Error	[RFC1035]
- 2	ServFail	Server Failure	[RFC1035]
- 3	NXDomain	Non-Existent Domain	[RFC1035]
- 4	NotImp	Not Implemented	[RFC1035]
- 5	Refused	Query Refused	[RFC1035]
- 6	YXDomain	Name Exists when it should not	[RFC2136][RFC6672]
- 7	YXRRSet	RR Set Exists when it should not	[RFC2136]
- 8	NXRRSet	RR Set that should exist does not	[RFC2136]
- 9	NotAuth	Server Not Authoritative for zone	[RFC2136]
- 9	NotAuth	Not Authorized	[RFC8945]
- 10	NotZone	Name not contained in zone	[RFC2136]
- 11	DSOTYPENI	DSO-TYPE Not Implemented	[RFC8490]
- 12-15	Unassigned		
- 16	BADVERS	Bad OPT Version	[RFC6891]
- 16	BADSIG	TSIG Signature Failure	[RFC8945]
- 17	BADKEY	Key not recognized	[RFC8945]
- 18	BADTIME	Signature out of time window	[RFC8945]
- 19	BADMODE	Bad TKEY Mode	[RFC2930]
- 20	BADNAME	Duplicate key name	[RFC2930]
- 21	BADALG	Algorithm not supported	[RFC2930]
- 22	BADTRUNC	Bad Truncation	[RFC8945]
- 23	BADCOOKIE	Bad/missing Server Cookie	[RFC7873]
- 24-3840	Unassigned		
- 3841-4095	Reserved for Private Use		[RFC6895]
- 4096-65534	Unassigned		
- 65535	Reserved, can be allocated by Standards Action		[RFC6895]

No Header também temos contadores, são eles:

- QDCOUNT, número de respostas da seção queries
- ANCOUNT, número de respostas da seção answers
- NSCOUNT, número de respostas da seção autoritativos
- ARCOUNT, número de respostas da seção adicional

Os contadores vão retornar o número de registros encontrados na pesquisa

Entendendo um pouco mais das Flags do HEADER

Você verá que na resposta teremos geralmente 4 flags setadas, sao elas:

- qr, rd, ra, ad.

Vamos entendê-las agora

- QR, é uma flag diferente que pode retornar 0 ou 1, 1 significa query

- RD significa "recursive desired", sinaliza que desejamos usar pesquisa recursiva, isso é definido pelo cliente.

- RA significa "recursive available", sinaliza que pesquisa recursiva está disponível, isso é definiado pelo servidor.

- AD significa "authenticated data", sinaliza que os dados de resposta e autoridade foram validados e autenticados pelas políticas de segurança daquele servidor de dns. É setado apenas quando todos os dados da resposta foram devidamente criptografados e verificados. Esse é um recurso do DNSSEC.

Existem ainda as seguintes flags opcionais

- AA, significa servidor autoritativo

- TC, significa mensagem truncada

E no caso de DNSSEC pode conter ainda

- CD, significa "checking disabled", utilizado pelo DNSSEC.

- DO, que significa que a resposta do DNSSEC está ok

Entendendo os status (RCODE) mais comuns

- NOERROR (0), a pesquisa voltou sem erros
- SERVFAIL (2), houve uma falha na resposta do servidor
- NXDOMAN (3), o domínio não foi encontrado ou não existe
- REFUSED (5), o pedido de query foi recusado

QUESTION SECTION

Aqui encontraremos dados de nossa query.

;; QUESTION SECTION:
;gutocarvalho.net.		IN	A

Uma query é estruturada da seguinte forma:

    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                                               |
    /                     QNAME                     /
    /                                               /
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QTYPE                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QCLASS                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Vamos entender QNAME, QTYPE e QCLASS.


- QNAME possuirá o domínio que você setou na query
- QTYPE possuirá o tipo de RR que você utilizou na pesquisa
- QCLASS possuirá o tipo de classe de DNS, geralmente IN (internet)

ANSWER SECTION

;; ANSWER SECTION:
gutocarvalho.net.	300	IN	A	185.199.108.153
gutocarvalho.net.	300	IN	A	185.199.109.153
gutocarvalho.net.	300	IN	A	185.199.110.153
gutocarvalho.net.	300	IN	A	185.199.111.153

Retorna os registros e informações destes, se houver.

AUTHORITY SECTION

;; AUTHORITY SECTION:
gutocarvalho.net.	3533	IN	NS	monroe.ns.cloudflare.com.
gutocarvalho.net.	3533	IN	NS	houston.ns.cloudflare.com.

Retorna dados de autoridade acerca do domínio.

ADITIONAL SECTION

;; ADDITIONAL SECTION:
monroe.ns.cloudflare.com. 107	IN	A	172.64.34.153
houston.ns.cloudflare.com. 900	IN	A	172.64.35.52

Retorna dados adicionais da query.

QUERY SECTION

;; Query time: 36 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:49:29 -03 2022
;; MSG SIZE  rcvd: 109

Retorna métricas da query, auto explicativo.

Glossário

termos comuns

tipos de registros comuns e seus significados

tipos de registro para DNSSEC

tipos de pesquisa de DNS

Quais outras ferramentas uso para troubleshooting de DNS?

ferramentas clássicas

ferramentas extras para testes do lado do cliente

ferramentas extras para testes em seu servidor de dns

Quais os comandos que eu mais uso no dia-a-dia?

$ dig +short lb.gutocarvalho.net $ dig -x 200.150.204.87 $ dig mx gutocarvalho.net $ dig ns gutocarvalho.net

Amarrando as pontas

Esse post é uma tentativa de dar um norte ou um caminho para fazer um bom troubleshooting de DNS.

Volte aqui sempre que precisar :)

Aquele abraço!

Mando aquele abraço para o professor MESTRE Ulysses Almeida (@ulyssesalmeida) que me ensinou a usar o DIG lá no início do século.

Mando aquele abraço pro @gomex e @badtux que via exemplo me fazem contribuir mais e mais e mais :)

Mando aquele abraço para todos que leram, comentaram, revisaram e contribuíram de alguma forma com esse post!

DNS RFC's

References


Este post é do tipo #Mindnodes, entenda aqui.

Se gostou manda um alô no twitter @gutocarvalho ou deixa um comentário bacana :)

[s]
Guto


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]