tcpdump - gire os arquivos de captura usando -G, -W e -C

14

Estou procurando ser capaz de capturar uma saída rotativa tcpdump que captura 30 minutos de dados em 48 arquivos, ciclicamente.

A página de manual implica que isso deve ser possível, mas meus testes não parecem produzir o resultado que estou procurando:

-W

      Utilizado em conjunto com a -Copção, isso limitará o número de arquivos criados para o número especificado e começará a sobrescrever arquivos desde o início, criando assim um buffer 'rotativo'. Além disso, nomeará os arquivos com 0s iniciais suficientes para suportar o número máximo de arquivos, permitindo que eles sejam classificados corretamente.

      Utilizado em conjunto com a -Gopção, isso limitará o número de arquivos de despejo girados criados, saindo com o status 0 ao atingir o limite. Se usado -Ctambém, o comportamento resultará em arquivos cíclicos por fatia de tempo.

Estou executando isso nos clientes OS X 10.9.5 / 10.10.3. Aqui está o comando test; apenas sai após o terceiro arquivo:

tcpdump -i en0 -w /var/tmp/trace-%Y-%M-%d_%H.%M.%S.pcap -W 3 -G 3 -C -K -n
Andrew
fonte
pls ver a minha resposta
MariusMatutiae

Respostas:

13

Isso porque você escreveu em -W 3vez de -W 48. Existem, no entanto, outros erros no seu comando.

A opção -Gsignifica:

-G rotate_seconds

      Se especificado, gira o arquivo de despejo especificado com a -wopção a cada rotate_seconds segundos. Savefiles terá o nome especificado pelo -wqual deve incluir um formato de hora, conforme definido por strftime (3). Se nenhum formato de hora for especificado, cada novo arquivo substituirá o anterior.

      Se usado em conjunto com a -Copção, os nomes de arquivos terão a forma de ' arquivo <contagem>'.

Desde que você escreveu -G 3, você estará girando isso a cada 3 segundos, enquanto afirma

... que captura 30 minutos em dados

Além disso, o esquema de nomeação está errado: do acima exposto,

Se usado em conjunto com a -Copção, os nomes de arquivos terão a forma de ' arquivo <contagem>'.

Portanto, não faz sentido especificar o formato da hora para o nome.

Além disso, a -Copção não tem argumento, enquanto, de acordo com a página do manual , deve:

tcpdump [  -AdDefIKlLnNOpqRStuUvxX  ] [  -B  buffer_size  ] [  -c  count  ]
-C  file_size  ] [  -G  rotate_seconds  ] [  -F  file  ] [  -I  interface  ] [  -m  module  ] [  -M  secret  ] [  -r  file  ] [  -s  snaplen  ] [  -T  tipo  ] [  -w  arquivo  ] [  -W  filecount  ] [  -E  spi @ ipaddr algo: secreto, ... ] [  -y  datalinktype  ] [  -z  postrotate-command  ] [  -Z  user  ] [  expressão  ]

A página do manual declara:

-C

      Antes de gravar um pacote bruto em um arquivo de salvamento , verifique se o arquivo atualmente é maior que file_size e, se houver, feche o arquivo de salvamento atual e abra um novo. Savefiles após o primeiro savefile terá o nome especificado com o -wsinalizador, com um número após ele, começando em 1 e continuando para cima. As unidades de file_size são milhões de bytes (1.000.000 bytes, não 1.048.576 bytes).

Então você deve especificar -C 100para produzir arquivos de 100 MB.

No final, seu comando deve ser:

tcpdump -i en0 -w /var/tmp/trace -W 48 -G 1800 -C 100 -K -n

Isso girará os arquivos (dos nomes trace1, trace2, ...) ciclicamente, com período 48, a cada 1800 segundos (= 30 minutos) ou a cada 100 MB, o que ocorrer primeiro.

MariusMatutiae
fonte
O na resposta final está faltando a condição If no time format is specified, each new file will overwrite the previous.(Eu atualizei a resposta.)
OKWAP
2
@okwap, quando você editou a resposta (para adicionar -% Y-% m-% d_% H:% M:% S), quebrou a parte cíclica do uso de -G, -C e -W juntos. A resposta original usando apenas / var / tmp / trace para o nome do arquivo -w estava correta e gerou as saídas cíclicas pretendidas conforme descrito (trace1, trace2, ...). Ao usar -G, -C e -W juntos, você não pode usar o formato strftime no nome do arquivo e ainda obter as saídas cíclicas. Com sua edição, o tcpdump continuará gravando os arquivos de forma não ciclica, porque os nomes dos arquivos nunca se repetem.
Bill Menees
@BillMenees Obrigado por trazer isso para a minha atenção, eu tenho desfeito edição do OKWAP.
MariusMatutiae
Assim como Swinster no comentário abaixo, notei que esta resposta não produz o comportamento esperado. O uso de -w -W -C e -G em conjunto faz com que o mesmo arquivo seja substituído novamente e novamente. Ele não causar uma série de arquivos a serem criados iguais para -W <n> como seria de esperar.
Niels2000
6

Expandindo a resposta do flabdablet (alterando -G 1800para -G 300- rotação a cada cinco minutos - apenas para fins de teste),

tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300

vai lhe dar %m=month, %d=day of month, %H=hour of day, %M=minute of day, %S=second of day, %s=millisecond of day, resultando em

/var/temp/trace-03-02-08-30-56-1520002568
/var/temp/trace-03-02-08-35-56-1520002568
/var/temp/trace-03-02-08-40-56-1520002568

Muito útil para organizar traços para esses problemas intermitentes incômodos. Além disso, se você não é root, pode querer sudoe, claro, torná-lo um nohup:

sudo bash -c "nohup tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300 &"
jarofnstdkys
fonte
3

Parece-me que tudo que você precisa é

tcpdump -i en0 -G 1800 -w /var/tmp/trace-%H-%M.pcap

O especificador de formato strftime que -G espera no nome do arquivo -w não precisa representar uma data e hora completas. Com apenas% H e% M, e um tempo de rotação de exatamente meia hora, qualquer chamada de tcpdump gerará apenas dois valores% M diferentes com meia hora de diferença, e os arquivos de rastreamento de ontem serão substituídos na mesma hora e números minuciosos rolam novamente.

flabdablet
fonte
1

Após algumas experiências, não consegui que a resposta do @MariusMatutiae funcionasse conforme o esperado. Se a hora se tornar o fator limitante e sem a adição do formato da hora ao nome do arquivo, o arquivo pcap atual será simplesmente substituído.

Por exemplo, tente:

tcpdump -i en0 -w /var/tmp/trace -W 10 -G 5 -C 1

Tudo o que você acaba trace.pcap0escrevendo é repetidamente.

Como sugerido no comentário, se você adicionar a formatação de hora ao nome do arquivo, você simplesmente terminará com toda lista crescente de arquivos.

Portanto, eu tive que ficar com arquivos limitados de tamanho simples:

tcpdump -i en0 -w /var/tmp/trace -W 48 -C 100
Swinster
fonte
0

Sim, parece não funcionar como a resposta de MariusMututiae diz.

tcpdump ...{other options}... -w httpdebug.pcap -W 48 -G 1800 -C 100
$ ls -l
-rw-r--r--. 1 tcpdump tcpdump  100007441 Mar 17 17:57 httpdebug.pcap00
-rw-r--r--. 1 tcpdump tcpdump   46895104 Mar 17 18:02 httpdebug.pcap01
-rw-r--r--. 1 tcpdump tcpdump   93091143 Mar 17 17:47 httpdebug.pcap02
-rw-r--r--. 1 tcpdump tcpdump    5372072 Mar 17 16:17 httpdebug.pcap03

Parece-me que pode estar capturando o máximo de -C 100arquivos MB possível em um período de 30 minutos, porque httpdebug.pcap03possui o timestamp mais antigo e é muito menor que 100 MB, então parece que foi cortado em uma marca de 30 minutos. Depois de atingir 30 minutos, parece voltar httpdebug.pcap00e aumentar o número à medida que atinge 100 MB. Isso significa que, se você tiver muitas solicitações em um período de 30 minutos, poderá obter números httpdebug.pcapXX muito altos. Se você nunca mais atender a tantas solicitações em um período, esses altos números httpdebug.pcapXX nunca serão substituídos.

Então, eu estou pensando que arquivos cíclicos por timeslice significam que o timeslice é -G 1800e irá alternar a cada -G 1800e incrementar a cada -C 100.

Não tenho certeza se -W 48isso afeta, mas talvez se você chegar a httpdebug.pcap47(contagem começa em 0`, ele irá parar de capturar pacotes.


Recentemente, houve um problema no GitHub aberto sobre a redação confusa. Eles não mudaram a implementação, mas tentaram tornar a documentação um pouco mais clara.

As alterações propostas foram mescladas em 28 de janeiro de 2019 .

A partir de hoje, 17 de março de 2019, aqui está a documentação atual:

-C:

.BI \-C " file_size"
Before writing a raw packet to a savefile, check whether the file is
currently larger than \fIfile_size\fP and, if so, close the current
savefile and open a new one.  Savefiles after the first savefile will
have the name specified with the
.B \-w
flag, with a number after it, starting at 1 and continuing upward.
The units of \fIfile_size\fP are millions of bytes (1,000,000 bytes,
not 1,048,576 bytes).

-G:

.BI \-G " rotate_seconds"
If specified, rotates the dump file specified with the
.B \-w
option every \fIrotate_seconds\fP seconds.
Savefiles will have the name specified by
.B \-w
which should include a time format as defined by
.BR strftime (3).
If no time format is specified, each new file will overwrite the previous.
Whenever a generated filename is not unique, tcpdump will overwrite the
preexisting data; providing a time specification that is coarser than the
capture period is therefore not advised.
.IP
If used in conjunction with the
.B \-C
option, filenames will take the form of `\fIfile\fP<count>'.

-W:

.B \-W
Used in conjunction with the
.B \-C
option, this will limit the number
of files created to the specified number, and begin overwriting files
from the beginning, thus creating a 'rotating' buffer.
In addition, it will name
the files with enough leading 0s to support the maximum number of
files, allowing them to sort correctly.
.IP
Used in conjunction with the
.B \-G
option, this will limit the number of rotated dump files that get
created, exiting with status 0 when reaching the limit.
.IP
If used in conjunction with both
.B \-C
and
.B \-G,
the
.B \-W
option will currently be ignored, and will only affect the file name.

Eu ainda acho um pouco confuso, mas acho que a diferença da minha conclusão acima é que -Wquando usado com -C -Gnão afeta nada além do nome do arquivo.

Em geral, -Wé usado para limitar o número de arquivos. Portanto, não use se você deseja capturar indefinidamente.

dosentmatter
fonte