Monitorowanie w czasie rzeczywistym żądań HTTP na interfejsie sieciowym?

79

W celu debugowania chcę monitorować żądania HTTP w interfejsie sieciowym.

Korzystając z naiwnego tcpdumpwiersza poleceń, otrzymuję zbyt wiele informacji niskiego poziomu, a informacje, których potrzebuję, nie są bardzo jasno przedstawione.

Zrzucanie ruchu tcpdumpdo pliku, a następnie używanie wiresharkma tę wadę, że nie jest on w locie.

Wyobrażam sobie użycie takiego narzędzia:

$ monitorhttp -ieth0 --only-get --just-urls
2011-01-23 20:00:01 GET http://foo.example.org/blah.js
2011-01-23 20:03:01 GET http://foo.example.org/bar.html
...

Używam Linuksa.

maxschlepzig
źródło
Na to samo pytanie udzielono odpowiedzi na superuser.com/questions/67428/possible-to-catch-urls-in-linux
AlexD

Odpowiedzi:

100

Spróbuj tcpflow:

tcpflow -p -c -i eth0 port 80 | grep -oE '(GET|POST|HEAD) .* HTTP/1.[01]|Host: .*'

Dane wyjściowe są takie:

GET /search?q=stack+exchange&btnI=I%27m+Feeling+Lucky HTTP/1.1
Host: www.google.com

Możesz oczywiście dodać dodatkowe metody HTTP do instrukcji grep i użyć seddo połączenia dwóch linii w pełny adres URL.

bahamat
źródło
Zaletą tcpflowjest to, że jest już dostępny w domyślnych repozytoriach w Ubuntu 10.04 (justsniffer, httpry nie są). Informacje o pakiecie informują, że fragmenty IP nie są poprawnie rejestrowane - nie wiem, czy to ma znaczenie w tym przypadku użycia - być może justsniffer poradzi sobie z nimi lepiej.
maxschlepzig
Ponieważ tylko chwytasz adres URL, nie wydaje się, żeby miało to znaczenie. Tcpflow wyświetli pakiety w kolejności ich otrzymania przez interfejs. Tak więc, jeśli próbujesz przechwycić zawartość pliku, możesz uzyskać pakiety, które przychodzą nieuporządkowane i powodują uszkodzenie pliku. Ale twój przypadek użycia wymieniony w pytaniu, myślę, że to zadziała dla ciebie. Możesz także rozszerzyć grep (lub usunąć -o), aby zobaczyć więcej danych pakietu do sortowania lub co nie później.
bahamat
@bahamat Czy „tcpflow” może współpracować z adresem URL https?
Maulik patel
Coraz częściej odpowiedź brzmi „nie”. W przeszłości SSL był na tyle słaby, że gdybyś miał dostęp do klucza używanego do przepływu, mógłbyś odszyfrować każdy ruch użyty z tym kluczem. Dzisiaj większość stron będzie korzystać z idealnej tajemnicy i negocjować efemeryczne klucze. Najlepszą opcją jest dziś tak zwany przezroczysty serwer proxy „gula w drucie”.
bahamat
1
nic nie dostałem, podczas przeglądania, używając wifi: sudo tcpflow -p -c -i wlo2 port 80 | grep -oE '(GET | POST | HEAD). * HTTP / 1. [01] | Host:. *'
ses
23

Aby to zrobić, możesz użyć httpry lub Justniffer .

httpry jest dostępny np. za pośrednictwem repozytorium pakietów Fedory.

Przykładowe połączenie:

# httpry -i em1

(gdzie em1oznacza nazwę interfejsu sieciowego)

Przykładowe dane wyjściowe:

2013-09-30 21:35:20    192.168.0.1     198.252.206.16    >    POST    unix.stackexchange.com    /posts/6281/editor-heartbeat/edit    HTTP/1.1
2013-09-30 21:35:20    198.252.206.16  192.168.0.1       < HTTP/1.1   200    OK
2013-09-30 21:35:49    192.168.0.1     198.252.206.16    >    POST    unix.stackexchange.com    /posts/validate-body                 HTTP/1.1
2013-09-30 21:35:49    198.252.206.16  192.168.0.1       < HTTP/1.1   200    OK
2013-09-30 21:33:33    192.168.0.1      92.197.129.26    >    GET     cdn4.spiegel.de    /images/image-551203-breitwandaufmacher-fgoe.jpg    HTTP/1.1

(wydajność jest nieco skrócona)

X4lldux
źródło
Jak mogę wyświetlić nagłówek lub treść żądania lub odpowiedzi?
Mohammed Noureldin
nie mam nic sudo httpry -i wlo2 (gdzie wlo2 jest przez nazwę urządzenia Wi-Fi)
ses
7

Szukałem czegoś podobnego, z dodatkowym wymogiem, że powinien on również działać na https .

narzędzia oparte na pcap, takie jak tcpflow httpry urlsnarfi inne kcf tcpdump, działają dobrze dla http, ale dla bezpiecznych żądań nie masz szczęścia.

Wymyśliłem urldump , który jest małym opakowaniem wokół mitmproxy .
iptablessłuży do przekierowywania ruchu do serwera proxy, więc działa transparentnie.

$ sudo urldump   
http://docs.mitmproxy.org/en/stable/certinstall.html
http://docs.mitmproxy.org/en/stable/_static/js/modernizr.min.js
https://media.readthedocs.org/css/sphinx_rtd_theme.css
https://media.readthedocs.org/css/readthedocs-doc-embed.css
https://media.readthedocs.org/javascript/readthedocs-doc-embed.js
...

Aby uzyskać więcej informacji, zobacz README .

lemonsqueeze
źródło
1

Myślę, że Wireshark jest w stanie robić, co chcesz

Plusem jest to, że jest bardzo wydajny, możesz go zainstalować za pomocą apt-get i ma GUI.

Jednak system filtrów jest skomplikowany - ale są wbudowane dobre samouczki, które zapewniają podgląd ruchu na żywo lub start / stop.

Wpisanie słowa „http” w filtrze prawdopodobnie zapewni ci to, czego szukasz (tj. Główny ruch generowany przez użytkowników).

Mahmoud Hossam
źródło
Chciałbym wiedzieć, dlaczego zostało to odrzucone. Wireshark może odczytywać interfejs w locie i filtrować tylko ruch HTTP.
Kevin M
@Kevin M. Cóż, nie głosowałem za twoją odpowiedzią. Ale żeby być uczciwym, twoja odpowiedź jest nieco niekompletna i nie na temat. 1) Brakuje szczegółowych informacji na temat tego, jak dokładnie należy użyć Wireshark, tj. Że należy użyć filtru, dokładnego wyrażenia filtru itp. 2) Nie pozwala na użycie wiersza poleceń, takiego jak naszkicowane w pytaniu - nawet jeśli nie mam nic przeciwko w podejściu GUI domyślny widok wyświetla żądania GET, w których nazwa domeny nie jest wyświetlana obok siebie - nie jest to wygodne w przypadku naszkicowanego przypadku użycia.
maxschlepzig
Mam na myśli: s / twoja odpowiedź / odpowiedź Fobii /
maxschlepzig
1

Inną dobrą opcją mogą być nethogs

Na fedorze jest dostępny wśród podstawowych pakietów, a na centos możesz to zrobić poprzez repozytorium epel.

adriano72
źródło
1

Istnieje również program wiersza poleceń, urlsnarfktóry jest częścią pakietu dsniff (który jest również spakowany np. Z Fedorą 19).

Przykład:

# urlsnarf -i em1
urlsnarf: listening on em1 [tcp port 80 or port 8080 or port 3128]
jhost - - [29/May/2014:10:25:09 +0200] "GET http://unix.stackexchange.com/questions HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/ HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/layout/css/style-V5-2-2.css HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/layout/jscfg/http/global-V5-2-2.js HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/layout/js/http/javascript-V5-2-2.js HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/layout/js/http/interface-V5-2-2.js HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/layout/js/http/netmind-V5-2-2.js HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "GET http://www.spiegel.de/favicon.ico HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "POST http://ocsp.thawte.com/ HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
jhost - - [29/May/2014:10:25:36 +0200] "POST http://ocsp.thawte.com/ HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0
[..]

(podczas przeglądania najpierw do SE, a następnie do spiegel.de)

Ograniczenia: dsnarf nie obsługuje IPv6 . Mogę odtworzyć ten raport o błędzie w wersji 0.17 na Fedorze 19. Wygląda również na uszkodzony w zaufanym bankomacie Ubuntu (działa dobrze w trybie świadomym).

maxschlepzig
źródło