Minha melhor aposta seria usar algo como:
tcpdump -ieth0 -s96 -w traffic.dump 'ip or icmp or tcp or udp'
Onde a parte "complicada" será escolher um valor correto para o parâmetro "-s" (snaplen) (snaplen é o tamanho máximo do pacote que o tcpdump irá capturar).
Nas páginas do manual do tcpdump:
Snarf snaplen bytes of data from each packet rather than the default of 68 (with NIT, the minimum is actually 96). 68 bytes is adequate for IP, ICMP, TCP and UDP but may truncate protocol information from name server and NFS packets (see below). Packets truncated because of a limited snapshot are indicated in the output with ''[|proto]'', where proto is the name of the protocol level at which the truncation has occurred. Note that taking larger snapshots both increases the amount of time it takes to process packets and, effectively, decreases the amount of packet buffering. This may cause packets to be lost. You should limit snaplen to the smallest number that will capture the protocol information you're interested in.
Neste exemplo, estou usando 96 para ter "quase" a certeza de que eu capturaria 100% dos valores de cabeçalho ethernet + ip + (icmp || udp || tcp).
Caso seu tráfego tenha opções de IP ou TCP (ou seja, timestamps) e você também queira capturar esta informação, então você terá que jogar com o parâmetro snaplen (isto é, aumentar / diminuir).
Caso o comprimento dos cabeçalhos do seu pacote seja menor que o snaplen, você também pode capturar parte da carga útil.
Finalmente, para ler o tráfego capturado, eu usaria algo como:
tcpdump -e -nn -vv -r traffic.dump
Onde a parte importante é usar a opção "-e" para que você possa imprimir os cabeçalhos da ethernet.
Esta página oferece um idéia sobre o tamanho dos cabeçalhos ethernet / tcp / udp sob diferentes circunstâncias e pode ajudá-lo a chegar a um valor "correto" para o parâmetro snaplen.