tcpdump - rota los archivos de captura usando -G, -W y -C

14

Estoy buscando poder capturar una salida de tcpdump giratoria que capture 30 minutos de datos, en 48 archivos, cíclicamente.

La página del manual implica que esto debería ser posible, pero mis pruebas no parecen producir el resultado que estoy buscando:

-W

      Utilizado junto con la -Copción, esto limitará el número de archivos creados al número especificado y comenzará a sobrescribir archivos desde el principio, creando así un búfer 'giratorio'. Además, nombrará los archivos con suficientes ceros iniciales para admitir la cantidad máxima de archivos, permitiéndoles ordenarlos correctamente.

      Utilizado junto con la -Gopción, esto limitará el número de archivos de volcado rotados que se crean, saliendo con el estado 0 al alcanzar el límite. Si también se usa con -C, el comportamiento dará como resultado archivos cíclicos por segmento de tiempo.

Estoy ejecutando esto en clientes OS X 10.9.5 / 10.10.3. Aquí está el comando de prueba; solo sale después del 3er archivo:

tcpdump -i en0 -w /var/tmp/trace-%Y-%M-%d_%H.%M.%S.pcap -W 3 -G 3 -C -K -n
Andrés
fuente
por favor, vea mi respuesta
MariusMatutiae

Respuestas:

13

Eso es porque escribiste en -W 3lugar de -W 48. Sin embargo, hay otros errores en su comando.

La opción -Gsignifica:

-G rotate_seconds

      Si se especifica, gira el archivo de volcado especificado con la -wopción cada segundos rotate_seconds . Savefiles tendrá el nombre especificado por el -wcual debe incluir un formato de hora definido por strftime (3). Si no se especifica ningún formato de hora, cada nuevo archivo sobrescribirá el anterior.

      Si se usa junto con la -Copción, los nombres de archivo tomarán la forma de ' archivo <cuenta>'.

Desde que escribiste -G 3, rotarás esto cada 3 segundos, mientras declaras

... que captura 30 minutos de datos

Además, el esquema de nombres es incorrecto: de lo anterior,

Si se usa junto con la -Copción, los nombres de archivo tomarán la forma de ' archivo <cuenta>'.

Por lo tanto, no tiene sentido especificar el formato de hora para el nombre.

Además, la -Copción no tiene argumento, mientras que, de acuerdo con la página del manual , debería:

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  type  ] [  -w  archivo  ] [  -W  filecount  ] [  -E  spi @ ipaddr algo: secreto, ... ] [  -y  datalinktype  ] [  -z  postrotate-command  ] [  -Z  usuario  ] [  expresión  ]

La página del manual dice:

-C

      Antes de escribir un paquete sin procesar en un archivo guardado, verifique si el archivo es actualmente más grande que file_size y, de ser así, cierre el archivo guardado actual y abra uno nuevo. Los archivos guardados después del primer archivo guardado tendrán el nombre especificado con la -wbandera, con un número después, comenzando en 1 y continuando hacia arriba. Las unidades de file_size son millones de bytes (1,000,000 bytes, no 1,048,576 bytes).

Por lo tanto, debe especificar -C 100para producir archivos de 100 MB.

Al final, su comando debería ser:

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

Esto rotará los archivos (de los nombres trace1, trace2, ...) cíclicamente, con el período 48, ya sea cada 1800 segundos (= 30 minutos) o cada 100 MB, lo que ocurra primero.

MariusMatutiae
fuente
En la respuesta final falta la condición If no time format is specified, each new file will overwrite the previous.(he actualizado la respuesta)
Okwap
2
@okwap, cuando editó la respuesta (para agregar -% Y-% m-% d_% H:% M:% S), rompió la parte cíclica del uso de -G, -C y -W juntos. La respuesta original usando solo / var / tmp / trace para el nombre de archivo -w fue correcta y generó las salidas cíclicas previstas como se describe (trace1, trace2, ...). Al usar -G, -C y -W juntos, no puede usar el formato strftime en el nombre de archivo y aún así obtener las salidas cíclicas. Con su edición, tcpdump continuará escribiendo archivos de manera no cíclica porque los nombres de archivo nunca se repiten.
Bill Menees
@BillMenees Gracias por llamar mi atención, he deshecho la edición de okwap.
MariusMatutiae
Al igual que Swinster en el comentario a continuación, noto que esta respuesta no produce el comportamiento esperado. El uso de -w -W -C y -G en conjunto hace que el mismo archivo se sobrescriba una y otra vez. No , no causar una serie de archivos que se crean de la misma a -W <n> como uno esperaría.
Niels2000
6

Ampliando la respuesta de flabdablet (cambiando -G 1800a -G 300- rotación cada cinco minutos - solo para fines de prueba),

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

le dará %m=month, %d=day of month, %H=hour of day, %M=minute of day, %S=second of day, %s=millisecond of day, lo que resulta en

/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

Muy útil para organizar rastros para esos molestos problemas intermitentes. Además, si no eres root, es posible que desees sudoy, por supuesto, que sea un nohup:

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

Me parece que todo lo que necesitas es

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

El especificador de formato de strftime que -G espera en el nombre de archivo -w no tiene que representar una fecha y hora completas. Con solo% H y% M, y un tiempo de rotación de exactamente media hora, cualquier invocación dada de tcpdump solo generará dos valores diferentes de% M separados por media hora, y los archivos de rastreo de ayer se sobrescribirán cuando sea la misma hora y los minutos vuelven a aparecer.

Flabdablet
fuente
1

Después de experimentar un poco, no pude obtener la respuesta de @MariusMatutiae para trabajar como se esperaba. Si la hora se convirtió en el factor limitante y sin la adición del formato de hora al nombre del archivo, entonces el archivo pcap actual simplemente se sobrescribe.

Por ejemplo, intente:

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

Todo lo que terminas es trace.pcap0escribir una y otra vez.

Como sugirió en el comentario, si agrega el formato de hora al nombre del archivo, simplemente termina con cada lista de archivos en crecimiento.

Por lo tanto, tuve que seguir con archivos de tamaño limitado:

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

Sí, no parece funcionar como dice la respuesta de MariusMatutiae .

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

Me parece que podría estar capturando tantos -C 100archivos MB como sea posible en un período de 30 minutos porque httpdebug.pcap03tiene la marca de tiempo más temprana y es mucho más pequeña que 100 MB, por lo que parece que se cortó en una marca de 30 minutos. Una vez que llega a los 30 minutos, parece saltar httpdebug.pcap00e incrementar el número a medida que alcanza los 100 MB. Esto significa que si tiene muchas solicitudes en un período de 30 minutos, obtendrá números muy altos de httpdebug.pcapXX. Si nunca llega a tantas solicitudes en un período, esos altos números httpdebug.pcapXX nunca se sobrescribirán.

Así que estoy pensando que los archivos cíclicos por segmento de tiempo significan que el segmento de tiempo es -G 1800y que ciclará cada uno -G 1800e incrementará cada uno -C 100.

No estoy seguro si lo -W 48afecta, pero tal vez si lo hace httpdebug.pcap47(el conteo comienza en 0`, dejará de capturar paquetes.


Hace poco, se abrió un problema de GitHub sobre la redacción confusa. No cambiaron la implementación, pero intentaron aclarar un poco la documentación.

Los cambios propuestos se fusionaron el 28 de enero de 2019 .

A partir de hoy, 17 de marzo de 2019, aquí está la documentación actual:

-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.

Todavía creo que es un poco confuso, pero supongo que la diferencia con respecto a mi conclusión anterior es que dice que -Wcuando se usa -C -Gno afecta nada más que el nombre del archivo.

En general, -Wse usa para limitar la cantidad de archivos. Así que no lo use si desea capturar indefinidamente.

dosis
fuente