2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Jaki jest najprostszy sposób na sniffowanie danych o ruchu TCP w Linuksie?

Chcę w prosty sposób pokazać wszystkie dane TCP (nie nagłówki TCP lub cokolwiek innego) przechodzące przez dowolny interfejs na moim pudełku z Linuksem.

Na przykład, chcę magiczną komendę, że jeśli zrobię:

magic_commmand_I_want port=1234

to jeśli na mojej maszynie był serwer nasłuchujący na porcie 1234, a ktoś zrobił:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Wtedy magiczna komenda po prostu wypisałaby:

hello

Próbowałem “tcpdump”, “ethereal”, “tethereal”, “tshark” i innych, ale nie jest oczywiste, jak je uzyskać, aby:

  • nie pokazywać adresów IP ani innych metadanych
  • pokazywać tylko przesyłane “dane”, a nie poszczególne pakiety i ich nagłówki
  • drukować dane jako takie, nie w heksach i nie ze znacznikami packet-offset
  • sniffować wszystko ruch sieciowy (czy to na eth0, czy eth1, czy lo, itd. …)

Tak, prawdopodobnie mógłbyś użyć do tego celu zestawu komend unixowych, ale nie jest to łatwe do zapamiętania na następny raz :)

Jeśli masz prosty przykład dokładnej linii poleceń, która to robi, to jest to, czego bym chciał.

Odpowiedzi (7)

109
109
109
2009-08-14 17:05:54 +0000

Uaktualnienie:

Jak zauważył Michał w komentarzach: Od wersji 1.3 tcpflow opcja -e jest używana do określania nazwy skanera. Dlatego wypisywany jest błąd “Invalid scanner name ‘8983’”. Prawidłowa komenda to

sudo tcpflow -i any -C -J port 1234

(również -J zostało zmienione na -g w najnowszym wydaniu)


Dzięki yves za wskazanie mi tcpflow “. Oto wiersz poleceń:

tcpflow -i any -C -e port 1234 # as root, or with sudo

To robi wszystko, co chcę

  • wyświetla dane bajt po bajcie, tak jak przychodzą
  • nie wyświetla żadnych innych metadanych
  • nasłuchuje na wszystkich interfejsach (więc przechwytuje dane przychodzące z maszyny i spoza niej)

-C“ mówi, że zrzuca dane do konsoli zamiast do pliku. -e” włącza kolory, aby klient-serwer i serwer-klient były wizualnie rozróżnialne.

Zainstalowałem tcpflow po prostu robiąc

sudo apt-get install tcpflow
```.
30
30
30
2009-08-13 22:48:27 +0000

socat jest narzędziem, o które pytasz. Może on działać jako proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

wtedy Twoja aplikacja musi połączyć się z portem 4444 zamiast bezpośrednio łączyć się z 1234

Opcja -v powoduje, że socat wypisuje wszystko co otrzyma na standardowy błąd (stderr).

Aktualizacja:

Jeśli socat nie jest dostępny na twoim komputerze, możesz go emulować za pomocą netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

Zastrzeżenia: ta opcja jest jednokierunkowa. druga instancja netcat wypisze każdą odpowiedź z twojego serwera na standardowe wyjście. Nadal możesz to zrobić:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Spróbuj Wireshark . Jest to doskonały analizator protokołów przeznaczony zarówno dla Linuksa jak i Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow jest tym, czego chcesz. Fragment strony man:

OPIS tcpflow jest programem, który przechwytuje dane przesyłane w ramach połączeń TCP (przepływy), i przechowuje te dane w sposób wygodny do analizy protokołu lub debugowania. Program taki jak tcpdump(4) pokazuje podsumowanie pakietów widzianych na kablu, ale zazwyczaj nie przechowuje danych, które są faktycznie przesyłane. W przeciwieństwie do tego, tcpflow rekonstruuje rzeczywiste strumienie danych i przechowuje każdy z nich w osobnym pliku do późniejszej analizy. tcpflow rozumie numery sekwencji TCP i poprawnie zrekonstruuje strumienie danych bez względu na retransmisje lub dostarczenie poza kolejnością.

tcpflow przechowuje wszystkie przechwycone dane w plikach, które mają nazwy w postaci

192.168.101.102.02345-010.011.012.013.45103

gdzie zawartość powyższego pliku to dane przesyłane z hosta 192.168.101.102 port 2345, do hosta 10.11.12.13 port 45103.

Skonfiguruj połączenie z Twojej aplikacji do Twojego serwera. Kiedy połączenie jest aktywne, tcpflow jest w stanie przechwytywać dane z niego Przykładowo:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Wszystkie dane będą przechowywane w pliku o nazwie 127.000.000.001.48842-127.000.000.001.05555.

Możesz jeszcze przekierować to na standardowe wyjście za pomocą opcji -Cs . Przeczytaj stronę manuala, aby pobawić się wyrażeniami w celu dostrojenia pakietów, które chcesz, aby tcpflow przechwycił.

2
2
2
2009-08-13 23:15:48 +0000

ngrep bardzo dobrze nadaje się do tego celu. Pobiera on ciąg BPF i opcjonalny ciąg do wyszukania w pakietach, a następnie wyrzuca zawartość pakietów na ekran w całkiem użytecznym formacie. Opcjonalnie zrzuca również zawartość do pliku pcap, który można później dokładniej zbadać w Wiresharku.

0
0
0
2009-08-13 23:08:00 +0000

Spójrz na Chaosreader . Chociaż robi on trochę więcej niż prosisz i nieco inaczej, prawdopodobnie mógłbyś zmodyfikować jego kod, aby zrobić to, co chcesz.

-1
-1
-1
2009-08-13 22:47:31 +0000

Może uda Ci się napisać wrapper dla tcpdump, na przykład, który usunie wszystkie zbędne informacje