Jaki jest najprostszy sposób na wąchanie danych o ruchu TCP w systemie Linux?

79

Chcę w prosty sposób pokazać wszystkie dane TCP (nie nagłówki TCP ani nic innego) przechodzące przez dowolny interfejs w moim Linux-ie.

Na przykład chcę magicznego polecenia, które jeśli zrobię:

magic_commmand_I_want port=1234

to jeśli na moim komputerze był serwer nasłuchujący na porcie 1234 i ktoś to zrobił:

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

Wtedy magiczne polecenie wydrukuje się po prostu:

hello

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

  • nie pokazuj adresów IP ani innych metadanych
  • pokazują tylko wysyłane „dane”, a nie poszczególne pakiety i ich nagłówki
  • wydrukuj dane takie, jakie są, nie w postaci szesnastkowej i nie ze znacznikami przesunięcia pakietu
  • powąchać cały ruch sieciowy (czy to na eth0 lub eth1 lub LO , etc ...)

Tak, prawdopodobnie możesz połączyć ze sobą szereg poleceń unixowych, aby to zrobić, ale nie jest to łatwe do zapamiętania następnym razem :)

Jeśli masz prosty przykład wiersza polecenia, który to robi, właśnie tego chciałbym.

Dustin Boswell
źródło
2
tcpdump to magiczne polecenie, które chcesz. Wireshark to przyjemny GUI na
dodatek
3
Wiem, że to stare pytanie, ale ciekawi mnie, dlaczego użycie nc po „stronie serwera” również nie było opcją? „nc -l 1234” tworzy serwer, który nasłuchuje na porcie 1234 i drukuje wszystko, co jest do niego wysyłane, i zamyka połączenie. Jeśli chcesz utrzymać połączenie przy życiu i nie rozłączać, możesz dodać opcję „-k”.
StFS
2
@StFS, ponieważ chce wąchać działający port, a nc narzeka.
zaatakowany

Odpowiedzi:

106

Aktualizacja:

Jak zauważył Michał w komentarzach: Od wersji tcpflow 1.3 opcja -e służy do określania nazwy skanera. Tak więc drukowany jest błąd „Nieprawidłowa nazwa skanera„ 8983 ”. Prawidłowe polecenie to

sudo tcpflow -i any -C -J port 1234

(również -Jzostał zmieniony na -gw najnowszej wersji)


Dzięki Yves za wskazanie mi „ tcpflow ”. Oto linia poleceń:

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

To robi wszystko, co chcę

  • wyświetla dane bajt po bajcie, gdy się pojawia
  • nie wyświetla żadnych innych metadanych
  • nasłuchuje na wszystkich interfejsach (więc przechwytuje dane pochodzące z urządzenia i z zewnątrz)

-C” Mówi mu, aby zrzucił konsolę zamiast pliku. „ -e” Włącza kolory, więc klient-> serwer i serwer-> klient są wizualnie różne.

Zainstalowałem tcpflow po prostu robiąc

sudo apt-get install tcpflow
Dustin Boswell
źródło
2
Łał. tcpflow jest niesamowity, dzięki! Zaoszczędziła mi TONĘ bólu, który miałem z wireshark. Wireshark, tcpdump itp. Mają o wiele za dużo informacji i nie robią tego, o co pyta oryginalne pytanie. tcpflow jest do tego idealny.
Russ
10
Od wersji tcpflow 1.3 -eopcja służy do określania nazwy skanera. Tak więc drukowany jest błąd „Nieprawidłowa nazwa skanera„ 8983 ”. Prawidłowe polecenie tosudo tcpflow -i any -C -J port 1234
Michał Kováč
6
Uwaga: -Jzmieniono na -gw najnowszych wersjach.
tvon
2
Ktoś musi wyjaśnić autorom tego narzędzia, co oznacza termin „kompatybilność wsteczna”!
Sridhar Sarnobat,
Dla mnie drukuje dwa razy „rzeczy”. Dlaczego ? lpaste.net/3984129577801744384
user1198559
29

socat to narzędzie, o które prosisz. Może działać jako proxy:

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

wówczas aplikacja musi podłączyć port 4444 zamiast bezpośrednio połączyć się z 1234

Opcja -v umożliwia socat wydrukowanie wszystkiego, co otrzymuje na standardowym błędzie (stderr).

Aktualizacja:

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

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

zastrzeżenia: ta opcja jest jednokierunkowa. druga instancja netcat wydrukuje 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
yves Baumes
źródło
Załóżmy, że nie mam kontroli nad klientem i serwerem (lub nie chcę go zatrzymywać), więc nie mogę zmienić, który port jest zaangażowany, ani przechwytywać ruchu. Co wtedy
20

Wypróbuj Wireshark . To doskonały analizator protokołów przeznaczony zarówno dla systemu Linux, jak i Windows.

Kevin Boyd
źródło
3
Z mojego doświadczenia wynika, że ​​interfejs naprawdę jest do bani w systemie Linux.
Joe Phillips,
cholera, dotarłeś tam przede mną, +1 na wireshark
Czy możesz podać przykładowy wiersz poleceń?
Spójrz na ten link wiki.wireshark.org/Tools Daje listę narzędzi wiersza poleceń dla wireshark. Uważaj na Dumpcap.
Kevin Boyd
13

tcpflow jest tym, czego chcesz. Wyciąg ze strony podręcznika:

OPIS
tcpflow to program, który przechwytuje dane przesyłane jako część połączeń TCP (przepływy) i przechowuje dane w sposób wygodny dla analizy protokołu lub debugowania. Program taki jak tcpdump (4) pokazuje podsumowanie pakietów widzianych w kablu, ale zwykle nie przechowuje danych, które są faktycznie przesyłane. Natomiast tcpflow rekonstruuje rzeczywiste strumienie danych i zapisuje każdy przepływ w osobnym pliku do późniejszej analizy. tcpflow rozpoznaje numery sekwencyjne TCP i poprawnie rekonstruuje strumienie danych niezależnie od retransmisji lub dostarczenia poza kolejnością.

tcpflow przechowuje wszystkie przechwycone dane w plikach o nazwach formularza

192.168.101.102.02345-010.011.012.013.45103

gdzie zawartością powyższego pliku byłyby dane przesyłane z hosta 192.168.101.102 port 2345, do hosta 10.11.12.13 port 45103.

Skonfiguruj połączenie między aplikacją a serwerem. Gdy połączenie jest uruchomione, tcpflow nadal może przechwytywać z niego dane Na przykład:

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

Nadal możesz przekierować to na standardowe wyjście z opcją -Cs. Przeczytaj stronę podręcznika, aby zagrać z ekspresją, aby dostroić paquety, które chcesz przechwycić przez tcpflow.

yves Baumes
źródło
2

ngrepjest do tego bardzo miły. Do wyszukania w pakietach potrzebny jest ciąg BPF i ciąg opcjonalny, a następnie zrzut zawartości pakietu do ekranu w całkiem przydatnym formacie. Opcjonalnie zrzuca również plik pcap_dump, który można później dokładniej zbadać w Wireshark.

Hobbs
źródło
0

Spójrz na Chaosreader . Chociaż robi to nieco więcej, niż prosisz i nieco inaczej, prawdopodobnie możesz zmodyfikować jego kod, aby zrobić to, co chcesz.

Andrew Y
źródło
-1

Może na przykład możesz napisać opakowanie dla tcpdump, które usunie wszystkie zbędne informacje

dimba
źródło