tcpdump - obracaj przechwytywane pliki za pomocą -G, -W i -C

14

Szukam możliwości przechwycenia obrotowego wyjścia tcpdump, które cyklicznie przechwytuje dane o wartości 30 minut do 48 plików.

Strona podręcznika sugeruje, że powinno to być możliwe, ale moje testy wydają się nie przynosić oczekiwanych rezultatów:

-W

      W połączeniu z tą -Copcją ograniczy liczbę utworzonych plików do określonej liczby i rozpocznie nadpisywanie plików od początku, tworząc w ten sposób „rotacyjny” bufor. Ponadto nada nazwę plikom wystarczającą liczbę zer, aby obsłużyć maksymalną liczbę plików, umożliwiając ich prawidłowe sortowanie.

      W połączeniu z -Gopcją ograniczy to liczbę tworzonych rotacyjnych plików zrzutu, wychodząc ze statusem 0 po osiągnięciu limitu. W przypadku równoczesnego użycia -Czachowanie spowoduje cykliczne pliki na przedział czasu.

Używam tego na klientach OS X 10.9.5 / 10.10.3. Oto polecenie testowe; po prostu kończy pracę po trzecim pliku:

tcpdump -i en0 -w /var/tmp/trace-%Y-%M-%d_%H.%M.%S.pcap -W 3 -G 3 -C -K -n
Andrzej
źródło
proszę

Odpowiedzi:

13

To dlatego, że napisałeś -W 3zamiast -W 48. W twoim poleceniu są jednak inne błędy.

Opcja -Goznacza:

-G rotate_seconds

      Jeśli jest określony, obraca plik zrzutu podany z -wopcją co rotate_seconds sekundy. Pliki zapisu będą miały podaną nazwę, -wktóra powinna zawierać format czasu zdefiniowany przez strftime (3). Jeśli nie zostanie określony format czasu, każdy nowy plik zastąpi poprzedni.

      Jeśli używane w połączeniu z -Copcją, nazwy plików przyjmą postać „ file <count>”.

Odkąd napisałeś -G 3, będziesz to obracać co 3 sekundy, o ile to zauważyłeś

... który przechwytuje dane o wartości 30 minut

Ponadto schemat nazewnictwa jest nieprawidłowy: z powyższego

Jeśli używane w połączeniu z -Copcją, nazwy plików przyjmą postać „ file <count>”.

Dlatego nie ma sensu określać formatu godziny dla nazwy.

Ponadto -Copcja nie ma argumentu, podczas gdy zgodnie ze stroną podręcznika powinna:

tcpdump [  -AdDefIKlLnNOpqRStuUvxX  ] [  -B  rozmiar_bufora  ] [  -c  liczba  ]
-C  rozmiar_pliku  ] [  -G  rotate_seconds  ] [  -F  plik  ] [  -I  interfejs  ] [  -m  moduł  ] [  -M  sekret  ] [  -r  plik  ] [  -s  snaplen  ] [  -T  typ  ] [  -w  plik  ] [  -W liczba  plików  ] [  -E  spi @ ipaddr algo: sekret, ... ] [  -y  typ łącza danych  ] [  -z  polecenie postrotate  ] [  -Z  użytkownik  ] [  wyrażenie  ]

Do strona człowiek stwierdza:

-C

      Przed zapisaniem surowego pakietu do pliku zapisu sprawdź, czy plik jest obecnie większy niż rozmiar_pliku, a jeśli tak, zamknij bieżący plik zapisu i otwórz nowy. Pliki zapisu po pierwszym pliku zapisu będą miały nazwę określoną -wflagą, a po nim cyfrę, zaczynając od 1 i kontynuując w górę. Jednostki wielkości_pliku to miliony bajtów (1 000 000 bajtów, a nie 1 048 576 bajtów).

Dlatego należy określić -C 100, aby wygenerować 100 MB plików.

Na koniec twoje polecenie powinno brzmieć:

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

Spowoduje to cykliczne obracanie plików (o nazwach trace1, trace2, ...) z okresem 48, co 1800 sekund (= 30 minut) lub co 100 MB, w zależności od tego, co nastąpi wcześniej.

MariusMatutiae
źródło
Ostateczna odpowiedź nie spełnia warunku If no time format is specified, each new file will overwrite the previous.(zaktualizowałem odpowiedź.)
okwap,
2
@okwap, kiedy edytowałeś odpowiedź (aby dodać -% Y-% m-% d_% H:% M:% S), przerwałeś cykliczną część używania -G, -C i -W razem. Oryginalna odpowiedź przy użyciu po prostu / var / tmp / trace dla -w nazwy pliku była poprawna i wygenerowała zamierzone dane wyjściowe cykliczne zgodnie z opisem (trace1, trace2, ...). Używając jednocześnie -G, -C i -W, nie można użyć formatu strftime w nazwie pliku i nadal uzyskać cykliczne dane wyjściowe. Podczas edycji tcpdump będzie kontynuował zapisywanie plików niecyklicznie, ponieważ nazwy plików nigdy się nie powtarzają.
Bill Menees
@BillMenees Dzięki za zwrócenie mojej uwagi, muszę cofnąć edycję okwap użytkownika.
MariusMatutiae
Podobnie jak Swinster w komentarzu poniżej, zauważam, że ta odpowiedź nie wywołuje oczekiwanego zachowania. Użycie -w -W -C i -G w połączeniu powoduje ciągłe zastępowanie tego samego pliku. To ma nie powodować szereg plików należy utworzyć równe -w <n> jak można by oczekiwać.
Niels2000,
6

Rozszerzanie po odpowiedzi flabdablet (zmiana -G 1800na -G 300- obrót co pięć minut - tylko w celach testowych),

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

da wam %m=month, %d=day of month, %H=hour of day, %M=minute of day, %S=second of day, %s=millisecond of day, w wyniku

/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

Bardzo przydatny do organizowania śladów dla tych nieznośnych sporadycznych problemów. Ponadto, jeśli nie jesteś rootem, możesz chcieć sudoi oczywiście zmienić go w:

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

Wydaje mi się, że wszystko czego potrzebujesz to

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

Specyfikator formatu strftime, którego -G oczekuje w pliku -w nazwa pliku, nie musi przedstawiać pełnej daty i godziny. Mając tam tylko% H i% M oraz czas obrotu dokładnie pół godziny, każde wywołanie tcpdump wygeneruje tylko dwie różne wartości% M w odstępie pół godziny, a wczorajsze pliki śledzenia zostaną nadpisane, gdy ta sama godzina i liczby minut znów się toczą.

flabdablet
źródło
1

Po kilku eksperymentach nie udało mi się uzyskać odpowiedzi @MariusMatutiae zgodnie z oczekiwaniami. Jeśli czas stał się czynnikiem ograniczającym i bez dodania formatu czasu do nazwy pliku, bieżący plik pcap jest po prostu nadpisywany.

Na przykład spróbuj:

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

Wszystko co kończysz to trace.pcap0pisanie w kółko.

Jak sugerowano w komentarzu, jeśli dodasz formatowanie czasu do nazwy pliku, to po prostu skończysz na każdej rosnącej liście plików.

Dlatego musiałem trzymać się prostych plików o ograniczonych rozmiarach:

tcpdump -i en0 -w /var/tmp/trace -W 48 -C 100
Swinster
źródło
0

Tak, to nie działa, jak mówi odpowiedź Marius Matutiae .

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

Wydaje mi się, że może przechwytywać jak najwięcej -C 100plików MB, jak to możliwe w ciągu 30 minut, ponieważ httpdebug.pcap03ma najwcześniejszy znacznik czasu i jest znacznie mniejszy niż 100 MB, więc wygląda na to, że został wycięty w 30 minucie. Gdy osiągnie 30 minut, wydaje się, że przeskakuje z powrotem httpdebug.pcap00i zwiększa liczbę, gdy osiąga 100 MB. Oznacza to, że jeśli masz dużo żądań w ciągu 30 minut, osiągasz bardzo wysokie liczby httpdebug.pcapXX. Jeśli nigdy nie osiągniesz tak wielu żądań w danym okresie, te wysokie liczby httpdebug.pcapXX nigdy nie zostaną zastąpione.

Myślę więc, że cykliczne pliki na przedział czasu oznaczają, że przedział czasu jest -G 1800i będzie się on cyklicznie zmieniał-G 1800 co każde -C 100.

Nie jestem pewien, czy -W 48to wpłynie, ale być może jeśli to zrobisz httpdebug.pcap47(liczenie zaczyna się od 0, przestanie przechwytywać pakiety.


Nieco niedawno pojawił się problem GitHub dotyczący mylących sformułowań. Nie zmienili implementacji, ale starali się, aby dokumentacja była nieco jaśniejsza.

Te proponowane zmiany zostały połączone w dniu 28 stycznia 2019 r .

Na dzień dzisiejszy, 17 marca 2019 r., Oto aktualna dokumentacja:

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

Nadal uważam, że to trochę mylące, ale sądzę, że różnica w stosunku do mojego powyższego wniosku polega na tym, że napisane w połączeniu -Wz -C -Gnie wpływa na nic poza nazwą pliku.

Zasadniczo -Wsłuży do ograniczania liczby plików. Więc nie używaj go, jeśli chcesz uchwycić w nieskończoność.

dosentmatter
źródło