TCPDUMP Crash Course

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