archives

Mindnodes

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 :

  • para testar se a resolução de DNS está funcionando
  • para comparar a resolução de DNS entre NS diferentes
  • quando precisamos resolver um problema de DNS
  • para descobrir o IP de um registro de DNS
  • para descobrir o MX de um domínio
  • para descobrir o NS de um domínio
  • para descobrir o SOA de um domínio
  • para descobrir o PTR (reverso) de um endereço IP
  • para verificar se uma alteração de registro já fez efeito

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:

  • Sysadmin;
  • Cloud Native Engineer;
  • Cloud Engineer;
  • DevOps Engineer;
  • Plataform Engineer;
  • GitOps Engineer.

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.

  • Julia Lamenza (@jlamenza)
  • João (@P0ssuidao)
  • Rafael Gomex (@gomex)
  • Rafael Silva (@rafaotetra)

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

  • Zona, Uma zona contém as informações e registros de um domínio
  • TTL, significa Time to live, é o tempo de vida de um registro ou zona
  • DNSSEC, é um sistema de proteção que aumenta a segurança do DNS

tipos de registros comuns e seus significados

  • SOA, Start of Authority ou início de autoridade
  • NS, significa nameserver, esse registro aponta para um servidor de DNS
  • A, registro tipo endereço ipv4, é associado a um endereço IP
  • AAAA, registro tipo endereço ipv6, é associado a um endereço IP
  • PTR, registro tipo reverso, ele resolve um IP para um nome
  • CNAME, nome canônico, ele resolve um nome para outro nome.
  • MX, significa mail exchange, aponta para o servidor de correio
  • TXT, registros de texto, podem ter qualquer tipo de informação

tipos de registro para DNSSEC

  • DNSKEY: keeps the public key to verify RRSIGs
  • DS: keeps the digest of a DNSKEY RR
  • RRSIG: keeps the digital signature of an RRset
  • NSEC: used for authenticated denial existence, meaning to show an RRset is not part of a signed zone

tipos de pesquisa de DNS

  • Iterative approach: where the resolver/client repeatedly queries different servers until it finds the answer
  • Recursive approach: where the resolver/client sends the query only to a single server, but the server repeatedly queries different servers until it finds and returns the answer to the resolver

Quais outras ferramentas uso para troubleshooting de DNS?

ferramentas clássicas

  • nslookup
  • host
  • whois

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]

O TCPDUMP é uma ferramenta de captura e análise de pacotes usada para fazer troubleshooting de rede. Ele usa a LIBCAP para fazer isso.

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 tcpdump?

Sempre que você precisar verificar alguma coisa em nível de rede, seguem algumas perguntas que o TCPDUMP pode ajudar a responder:

  • A máquina X está chega no servidor Y ?
  • A máquina X está conseguindo resolver DNS ?
  • A máquina X está conseguindo resolver NTP ?
  • Os clientes estã chegando na Máquina X e porta Y ?

Essa são as perguntas mais básicas que o TCPDUMP pode responder para você.

Para quem foi feito esse post?

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

  • Sysadmin;
  • Cloud Native Engineer;
  • Cloud Engineer;
  • DevOps Engineer;
  • Plataform Engineer;
  • GitOps Engineer.

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.

  • Julia Lamenza (@jlamenza)
  • João (@P0ssuidao)
  • Rafael Gomex (@gomex)
  • Rafael Silva (@rafaotetra)

TCPDUMP Crash Course

instalando no mac

$ brew install tcpdump

detectando recursos disponíveis no sistema

Listando interfaces

$ tcpdump -D

Listando data-link types suportados no sistema

$ tcpdump -L

capturando pacotes de interfaces

Capturando tráfego de todas as interfaces

$ tcpdump -i any

Capturando tráfego de uma interface específica

$ tcpdump -i en0

Capturando tráfego de uma interface específica sem resolver nomes

$ tcpdump -n -i en0

Capturando tráfego de uma interface específica sem resolver nomes ou fazer checksums TCP

$ tcpdump -n -K -i en0

Capturando tráfego de uma interface específica sem resolver nomes e fazer lookups

$ tcpdump -nn -i en0

Capturando tráfego de uma interface específica mostrando o mac address

$ tcpdump -e -i en0

Capturando tráfego de uma interface específica sem ativar o modo promíscuo, ou seja você apenas verá pacotes PARA ou DE seu computador.

$ tcpdump -p -i en0

trabalhando com arquivos

Capturando tráfego de uma interface específica e jogando saída para um arquivo

$ tcpdump -i eth0 -w tcpdump.txt

Limitando a captura em 10.000 pacotes para não encher seu disco

$ tcpdump -i eth0 -c 10000 -w tcpdump.txt

Lendo pacotes de um arquivo (replay)

$ tcpdump -i eth0 -r tcpdump.txt

capturando pacotes de hosts e redes específicos

Capturando tráfego de um host específico

$ tcpdump host 192.168.222.1

Capturando tráfego de uma rede específica

$ tcpdump net 192.168.222.0/24

capturando pacotes de endereços mac específicos

Capturando pacotes com origem no endereço mac e8:2b:88:ef:55:11

$ tcpdump ether src e8:2b:88:ef:55:11

Capturando pacotes com destino ao endereço mac e8:2b:88:ef:55:11

$ tcpdump ether dst e8:2b:88:ef:55:11

Capturando pacotes enviados ou recebidos pelo mac e8:2b:88:ef:55:11

$ tcpdump ether host e8:2b:88:ef:55:11

capturando pacotes de origem e destino

Capturando tráfego de uma origem específica

$ tcpdump src 200.150.204.87

Capturando tráfego para um destino específico

$ tcpdump dst 200.150.204.87

capturando pacotes de serviços e portas

Capturando tráfego de um serviço específico

$ tcpdump http

Capturando tráfego de uma porta específica

$ tcpdump port 80

Capturando tráfego de um range de portas

$ tcpdump portrange 8001-8009

capturando pacotes de protocolos específicos

Capturando apenas pacotes IPv4

$ tcpdump ip

Capturando apenas pacotes IPv6

$ tcpdump ipv6

Capturando apenas pacotes TCP

$ tcpdump tcp

Capturando apenas pacotes UDP

$ tcpdump udp

Capturando apenas pacotes ICMP

$ tcpdump icmp

Capturando apenas pacotes ARP

$ tcpdump arp

capturando pacotes em quantidades específicas

Capturando os primeiros 100 pacotes TCP

$ tcpdump -c 100 tcp

capturando pacotes de tamanhos específicos

Capturando pacotes maiores do que 200 bytes

$ sudo tcpdump greater 200

Capturando pacotes menores do que 200 bytes

$ sudo tcpdump less 200

capturando pacotes usando expressões lógicas no filtro

Capturando pacotes com origem no IP 192.168.222.1 e destino na porta 8005 (AND)

$ tcpdump -n -i en0 src 192.168.222.1 and dst port 8005

Capturando pacotes da porta 8001 ou 8005 da interface eth0 (OR)

$ tcpdump -n -i en0 port 8001 or port 8005

Capturando pacotes da interface eth0 com exceção da porta 22 (NOT)

$ tcpdump -n -i en0 not port 22

Capturando pacotes de origem a rede 10.10.0.0/24 e destino rede 192.169.100.0/24 (AND)

$ tcpdump src net 10.10.0.0/24 and dst net 192.168.100.0/24

Capturando pacotes de duas redes específicas (AND)

$ tcpdump net 10.10.0.0/24 and net 192.168.100.0/24

Capturando pacotes tcp entre dois hosts específicos (AND)

$ tcpdump tcp and host 10.10.0.1 and host 192.168.100.54

Capturando pacotes maiores ou igual a 32 bytes (GREATER)

$ tcpdump tcp >= 32

Capturando pacotes menores ou igual a 32 bytes (LESS)

$ tcpdump tcp <= 32

quais as expressões lógicas disponíveis?

Negation    : ! or "not" (without the quotes)
Concatanate : && or "and"
Alternate   : || or "or"

quais os operadores disponíveis?

>  : greater
<  : lower
>= : greater or equal
<= : lower or equal
=  : equal
!= : different

veja alguns exemplos de composição lógica múltipla

Essa regra vai casar com tráfego na porta 80 com host 192.168.222.254 ou 192.168.222.200

$ tcpdump '((tcp) and (port 80) and ((dst host 192.168.222.254) or (dst host 192.168.222.200)))'

Essa regra vai casar com qualquer tráfego ICMP envolvendo os destinos 00:01:02:03:04:05.

$ tcpdump '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

Essa regra vai filtrar tráfego para a rede de destino 192.168 com exceção do host 192.168.222.200

$ tcpdump '((tcp) and ((dst net 192.168) and (not dst host 192.168.222.200)))'

capturando flags de pacotes TCP

Isolando apenas flags RST do protocolo TCP

$ tcpdump 'tcp[tcpflags] == tcp-rst'

Isolando apenas flags SYN e ACK do protocolo TCP

$ tcpdump 'tcp[tcpflags] == tcp-syn' and 'tcp[tcpflags] == tcp-ack'

Isolando apenas flags FIN do protocolo TCP

$ tcpdump 'tcp[tcpflags] == tcp-fin'

capturando informações do protocolo HTTP

Essa captura vai mostrar os requests e conteúdos dos pacotes HTTP

$tcpdump -A -i en0 http

Capturando o user agent

$ tcpdump -vvAls0 | grep 'User-Agent:'

Capturando requisições do tipo GET

$ tcpdump -vvAls0 | grep 'GET'

Capturando requisições do tipo POST

$ tcpdump -vvAls0 | grep 'POST'

Capturando HTTP HEADERS

$ tcpdump -vvAls0 | grep 'Host:'

Capturando HTTP COOKIES

$ tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'

capturando infos específicas de protocolos diversos

Buscando tráfego SSH independente da porta que estiver rodando

$ tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'

Buscando tráfego de DNS

$ tcpdump -vvAs0 port 53

Buscando tráfego NTP

$ tcpdump -vvAs0 port 123

capturando senhas clear-text

Aqui vamos pegar senhas clear-text em diversos protocolos

$ tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '

configurando timestamp da captura de pacotes

Capturando pacotes sem mostrar timestamp

$ tcpdump -i en0 -t

Capturando pacotes com timestamp com nano-resolution

$ tcpdump —time-stamp-precision nano

Capturando pacotes com timestamp em formato unix epoc (seconds since January 1, 1970)

$ tcpdump -tt

Capturando pacotes com timestamp usando horas, minutos, segundos e microsegundos

$ tcpdump -tttt

configurando nível de ruído na captura de pacotes

Mostrando menos detalhes (quite mode)

$ tcpdump -i en0 -q

Modo verboso inicial

$ tcpdump -i en0 -v

Modo um pouco mais verboso

$ tcpdump -i en0 -vv

Modo mais verboso possível no tcpdump

$ tcpdump -i en0 -vvv

configurando os formatos de saída da captura

Definindo a saída em formato ASCII

$ tcpdump -i en0 -A

Definindo a saída em formato HEX

$ tcpdump -i en0 -x

tcpdump colorido, tem como?

Dá para fazer, vamos instalar o CCZE para ajudar

$ brew install ccze

Agora vamos usar ele assim

$ tpcdump -i en0 | ccze -A

Pronto, saída colorida bem fácil de ler!

quer saber mais?

Para saber mais veja o help do comando

$ tcpdump —help

Para ir além acesse a manpage

$ man tcpdump

qual o meu comando do dia a dia?

Use essa combinação para ver uma saída bastante verbosa, sem resolução de nomes ou portas e mostrando timestamp o mais human-readble possível.

$ tcpdump -ttttnnvvS

Amarrando as pontas

Esse post é uma tentativa de dar um norte ou um caminho para fazer um bom troubleshooting de redes usando o tcpdump.

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 TCPDUMP 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 contribuiram de alguma forma com esse post!


Este post é do tipo #Mindnodes, entenda aqui.

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

Refs

[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]