Truques para inspecionar tráfego HTTP com tcpdump e filtros BPF
1. Fundamentos do tcpdump e BPF para HTTP
O tcpdump é uma ferramenta de linha de comando que captura e analisa pacotes de rede em tempo real. Sua potência reside nos filtros BPF (Berkeley Packet Filter), uma linguagem de expressão que permite selecionar pacotes com precisão cirúrgica. Para tráfego HTTP, entender a sintaxe básica é essencial:
tcpdump -i eth0 -n -s 0 -A 'tcp port 80'
O parâmetro -i define a interface, -n evita resolução DNS, -s 0 captura pacotes completos e -A exibe o payload em ASCII. Em interfaces loopback (lo), o tráfego é visto como se estivesse saindo e entrando no mesmo host, exigindo filtros como host 127.0.0.1.
2. Capturando tráfego HTTP bruto na porta 80
O filtro mais básico para HTTP é tcp port 80. Para inspecionar o payload:
tcpdump -i eth0 -A -s 0 'tcp port 80'
Para isolar pacotes com flags específicas (SYN, ACK, FIN) que indicam início e fim de sessões HTTP:
tcpdump -i eth0 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-ack|tcp-fin) != 0)'
A opção -s 0 é crucial para evitar truncamento de pacotes grandes, como respostas HTTP com corpos extensos.
3. Filtrando requisições e respostas HTTP específicas
Filtros BPF permitem buscar strings no payload. Para capturar apenas requisições GET:
tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420)'
O 0x47455420 representa "GET " em hexadecimal. Para capturar respostas HTTP 200 OK:
tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x48545450 and tcp[((tcp[12] & 0xf0) >> 2)+9:3] = 0x323030)'
Combinando filtros com operadores lógicos:
tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x504f5354 or tcp[((tcp[12] & 0xf0) >> 2):3] = 0x505554)'
Isso captura requisições POST ou PUT.
4. Extraindo campos-chave do payload HTTP
Usando pipe com grep para extrair URLs e User-Agent:
tcpdump -i eth0 -A -s 0 'tcp port 80' | grep -E '(GET|POST|PUT) /|User-Agent:|Host:'
Para isolar cookies e cabeçalhos de autenticação:
tcpdump -i eth0 -A -s 0 'tcp port 80' | grep -E 'Cookie:|Authorization:|Content-Type:|Set-Cookie:'
Exibindo timestamps precisos e números de sequência TCP:
tcpdump -i eth0 -tttt -S -A -s 0 'tcp port 80'
O -tttt mostra data/hora completos, e -S exibe números de sequência absolutos.
5. Inspecionando tráfego HTTPS com limitações
Para tráfego HTTPS na porta 443, o tcpdump captura apenas pacotes criptografados. Para identificar handshakes TLS:
tcpdump -i eth0 -A -s 0 'tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2):1] = 0x16)'
O byte 0x16 indica um registro TLS Handshake. Para decodificar conteúdo, use ssldump com chaves privadas:
ssldump -r captura.pcap -k chave_privada.pem -d
Ou combine tcpdump com chaves do servidor:
tcpdump -i eth0 -w captura.pcap 'tcp port 443'
ssldump -r captura.pcap -k /etc/ssl/private/server.key
6. Simulando cenários de rede com tcpdump avançado
Capturando tráfego HTTP entre dois hosts específicos:
tcpdump -i eth0 -A -s 0 'tcp port 80 and host 192.168.1.100 and host 10.0.0.50'
Para tráfego HTTP com VLAN tags (ID 100):
tcpdump -i eth0 -A -s 0 'vlan 100 and tcp port 80'
Combinando tcpdump e iptables para log de pacotes descartados:
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP_DROP: "
tcpdump -i eth0 -A -s 0 'tcp port 80 and ip[6:2] & 0x3fff != 0'
7. Automatizando análise com scripts e saída estruturada
Salvando capturas em arquivos pcap para análise posterior:
tcpdump -i eth0 -w captura_http.pcap -s 0 'tcp port 80'
tcpdump -r captura_http.pcap -A -s 0 'tcp port 80'
Script shell para monitoramento contínuo com notificações:
#!/bin/bash
tcpdump -i eth0 -l -A -s 0 'tcp port 80' | while read line; do
if echo "$line" | grep -q "HTTP/1.1 500"; then
echo "Erro 500 detectado em $(date)" >> http_errors.log
notify-send "Alerta HTTP" "Erro 500 detectado"
fi
done
Convertendo saída para JSON com tshark:
tcpdump -i eth0 -w captura.pcap -s 0 'tcp port 80'
tshark -r captura.pcap -T json -e http.request.uri -e http.response.code
8. Boas práticas e resolução de problemas comuns
Em interfaces de alta carga, use filtros restritivos para evitar perda de pacotes:
tcpdump -i eth0 -c 1000 -s 0 'tcp port 80 and host 192.168.1.1'
Para tráfego HTTP chunked, o payload pode vir fragmentado. Use:
tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x7472616e)'
Isso busca "tran" (início de "Transfer-Encoding: chunked").
Para debug de erros BPF, teste filtros com tcpdump -d:
tcpdump -d 'tcp port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420'
Permissões: execute como root ou conceda cap_net_raw:
sudo setcap cap_net_raw+ep /usr/sbin/tcpdump
Referências
- Manual oficial do tcpdump — Documentação completa com todos os parâmetros e exemplos de filtros BPF.
- Guia de filtros BPF do Wireshark — Explicação detalhada da sintaxe BPF e exemplos práticos para HTTP.
- Tutorial de tcpdump para HTTP da DigitalOcean — Guia passo a passo com cenários reais de captura HTTP.
- Documentação do ssldump — Repositório oficial com instruções para decodificação de tráfego TLS/SSL.
- Referência de expressões BPF do Cloudflare — Artigo técnico sobre o funcionamento interno dos filtros BPF e otimizações.
- Guia de tcpdump para análise de HTTP da Red Hat — Soluções práticas para capturar e interpretar tráfego HTTP em produção.