Redes: Captura de Pacotes

Saudações.

Criei esse tutorial para ensinar as diferentes formas de capturar e analisar pacotes.

Capturar quadros (ethernet) e pacotes (IP) é a última fronteira para resolver qualquer problema em rede de computadores.

1 – Capturando com TCPDUMP

O TCPDUMP é a mais antiga das ferramentas para UNIX (Linux, MacOS, FreeBSD) e permite instalar filtros de analise e duplicação de pacotes em uma interface de rede.

1.1 – Instalando

Instalando:

Bash
# Instalar tcpdump
apt -y install tcpdump;

1.2 – Princípios do TCPDUMP

O filtro é opcional e a captura deve ser realizada sempre em uma interface de rede. No Linux é possível capturar de várias interfaces ao mesmo tempo (any).

Use CONTROL+C para interromper a captura.

Por padrão a captura coleta apenas os cabeçalhos, o limite é de 64 bytes para IPv4 e 96 bytes para IPv6. Você pode capturar um tamanho maior ou o pacote inteiro com o argumento -s (–snapshot-length).

A captura por padrão coloca a interface em modo promíscuo (aceita quadros e pacotes que não são destinados à interface mas que de alguma forma bateram na porta). Isso é desejável quando fazemos port-mirror no switch ou colocamos o Linux em bridge entre os nós de analise. Use “-p” para evitar o modo promíscuo.

1.3 – Captura básica

Exemplos de capturas sem filtro (pega tudo):

Bash
# Capturando pacotes na eth0:
tcpdump -i eth0;

# Capturando pacotes em todas as interfaces (somente Linux)
tcpdump -i any;

# Capturar a interface loopback (comunicacao entre softwares do mesmo servidor)
tcpdump -i lo;

# Não resolver DNS dos IPs (recomendado):
tcpdump -n -i eth0;

# Exibir dados do cabecalho ethernet (MAC):
tcpdump -ne -i eth0;

# Capturar apenas 100 pacotes e encerrar:
tcpdump -ne -c 100 -i eth0;

# Capturar apenas os primeiros 256 bytes de cada pacote
tcpdump -ne -s 256 -i eth0;

# Capturar pacotes inteiros (analise forense completa)
tcpdump -ne -s 0 -i eth0;

# Capturar dados com detalhes
tcpdump -nev -s 0 -i eth0;

# Capturar dados com detalhes e leitura humanizada
tcpdump -neva -s 0 -i eth0;

# Capturar com detalhes completos, humanizados e versao hexadecimal
tcpdump -nevas0 -x -i eth0;

# Sem modo promiscuo
tcpdump -nevas0 -p -i eth0;

1.4 – Captura com filtro

Usando filtros para capturar apenas protocolos ou propriedades dos quadros/pacotes:

Bash
# Capturar apenas TCP
tcpdump -pnevas0 -i eth0 "tcp";

# Capturar apenas UDP
tcpdump -pnevas0 -i eth0 "udp";

# Capturar apenas ICMP
tcpdump -pnevas0 -i eth0 "icmp";

# Filtro combinado, capturar udp e icmp
tcpdump -pnevas0 -i eth0 "udp or icmp";

# Capturar apenas pacotes TCP SYNC
tcpdump -pnevas0 -i eth0 'tcp[13] & 2 != 0 && tcp[13] & 16 = 0';

# Capturar data/hora microsegundo e dados de sessao BGP de alguns peerings:
tcpdump --time-stamp-precision=nano \
    -pnevas0 -i eth0 \
    '(host 10.10.20.5 or host 10.100.2.113) and tcp port 179';

1.5 – Salvando em arquivo

O TCPDUMP pode salvar sua captura em arquivos para que mais tarde você faça a analise. Isso é especialmente útil quando o problema é intermitente e você precisa ao final do dia comparar o horário do problema com os pacotes capturados naquele horário.

É extremamente recomendado limitar o tempo “timeout 3600 tcpdump …” ou limitar o número de pacotes “tcpdump -c 999123” para impedir o enchimento do disco.

Bash
# Salvar captura em arquivo, exemplo:
# opcional antes do comando: timeout 3600
tcpdump \
    -pnevas0 \
    -i eth0.95 \
    -c 999123 \
    'host 45.255.128.9 and udp' \
    -w /tmp/radius-captura-001.pcap;

# Analisar arquivo gravado
tcpdump -ttttnnva -r /tmp/radius-captura-001.pcap;

.

.

.

.

(artigo em edição constante, volte mais tarde para ver novos capítulos)

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com

O preço da liberdade é
a vigilância eterna.
Thomas Jefferson