Aqui está um one-liner que eu criei para exibir cabeçalhos HTTP de solicitação e resposta usando tcpdump
(o que deve funcionar para o seu caso também):
sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n/g'
Ele limita o pacote a 10Kb e só conhece os comandos GET, POST e HEAD, mas isso deve ser suficiente na maioria dos casos.
EDIT : modificou para se livrar dos buffers a cada passo para torná-lo mais ágil. Precisa de Perl e stdbuf agora, então use a versão original se você não tiver: EDIT : Alterou os destinos de porta de script de 80 para 4080, para realmente ouvir o tráfego que já passou pelo apache, em vez de o tráfego externo direto chegar à porta 80:
sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'
Algumas explicações:
- sudo stdbuf -oL -eL faz com que o tcpdump seja executado em buffer de linha
- o filtro mágico do tcpdump é explicado em detalhes aqui: link
- o grep está procurando por qualquer linha com GET, HTTP / ou POST; ou qualquer linha que se pareça com um cabeçalho (letras e números seguidos por dois pontos)
- BEGIN {$ | = 1} faz o perl rodar em buffer de linha
- s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g adiciona uma nova linha antes do início de cada nova solicitação ou resposta