Мониторинг HTTP-трафика с помощью tcpdump

42

Для мониторинга HTTP-трафика между сервером и веб-сервером я сейчас использую tcpdump. Это прекрасно работает, но я хотел бы избавиться от некоторых лишних данных в выводе (я знаю о tcpflowи wireshark, но они не доступны в моей среде).

Со tcpdumpстраницы руководства :

Печатать все HTTP-пакеты IPv4 в порт 80 и из него, т. Е. Печатать только пакеты, содержащие данные, а не, например, пакеты SYN и FIN и пакеты только для ACK.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Эта команда

sudo tcpdump -A 'src example.com и tcp порт 80 и (((ip [2: 2] - ((ip [0] & 0xf) << 2)) - ((tcp [12] & 0xf0) >> 2) )! = 0) '

обеспечивает следующий вывод:

19: 44: 03.529413 IP 192.0.32.10.http> 10.0.1.6.52369: Flags [P.], seq 918827135: 918827862, ack 351213824, win 4316, опции [nop, nop, TS val 4093273405 ecr 869959372], длина 727

E ..... @ ....... .... P..6.0 ......... D ...... __ .. e = 3 ...__ HTTP / 1.1 200 OK Сервер: Apache / 2.2.3 (Red Hat) Тип содержимого: текст / html; charset = UTF-8 Дата: сб, 14 ноября 2009 18:35:22 GMT Возраст: 7149
Длина контента: 438

<HTML> <HEAD> <TITLE> Пример веб-страницы </ TITLE> </ HEAD> <body>
<p> Вы достигли этой веб-страницы ... </ p> </ BODY> </ HTML>

Это почти идеально, за исключением выделенной части. Что это, конец - что более важно - как мне избавиться от этого? Может быть, это просто немного подправить выражение в конце команды?

otto.poellath
источник

Ответы:

39

tcpdump печатает полные пакеты. «Мусор», который вы видите, на самом деле является заголовками пакетов TCP.

Вы можете, конечно, помассировать вывод с помощью сценария perl, но почему бы не использовать вместо этого tshark, текстовую версию wireshark?

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

он принимает те же аргументы, что и tcpdump (та же библиотека), но, поскольку он является анализатором, он может выполнять глубокую проверку пакетов, чтобы вы могли еще больше улучшить свои фильтры, т.е.

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'

Александар Иванишевич
источник
1
Спасибо - после опробования всех предложений, tshark кажется лучшим инструментом для работы. В настоящее время я использую "tshark -d tcp.port == 8070, http -R 'http.request или http.response'". Теперь, если бы я только мог заставить tshark «следить за потоком tcp» так же, как это делает wireshark (об этом часто спрашивают, но я до сих пор не нашел ответа). «-V» отображает информацию о пакетах TCP и IP и т. Д., Которые меня не интересуют. Но я думаю, что могу удалить это с помощью скрипта.
otto.poellath
4
Вы можете также искать «GET» в фильтре захвата путем сопоставления значений ASCII для каждого символа: tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420. Некоторое время назад я добавил страницу на веб-сайт Wireshark, которая поможет вам создать фильтры захвата соответствия строк: wireshark.org/tools/string-cf.html
Gerald Combs,
18

взгляните на ngrep - он может быть вам полезен.

в качестве ссылки для других httpry [сервер, кажется, сейчас не работает, но я надеюсь, что он временный] и tshark также полезны для пассивного анализа протокола - первый только для http, второй - для гораздо большего.

PQD
источник
2
+1 за нгреп. Очень полезный инструмент.
Tylerl
ngrep и httpry выглядят определенно полезными, но ngrep не знает о HTTP и AFAIK, httpry работает только с заголовками HTTP и не может отображать данные полезной нагрузки.
otto.poellath
@sapporo - уверен - ngrep не зависит от протокола, но вы можете добавить фильтр pcap "порт 80" и получать .. в большинстве случаев только http-трафик.
PQD
Imo, ngrep в 100000 раз лучше, чем tcpdump
Дэниел У.
5

Попробуйте httpry или justniffer

Justniffer хорошо работает над пересылкой tcp-пакетов и фрагментацией ip

Mole24
источник
1
Благодарность! Justniffer - это то, что я искал (я думаю, что это единственный упомянутый инструмент, который очень прост и измеряет длительность запроса).
gkop
1

Я бы предложил использовать скрытую командную строку tcpdump, которая хранит все в файле pcap для последующей обработки. В зависимости от того, что именно вы смотрите на диагностику, tcpflow отлично подходит для последовательного объединения сообщений для анализа.

Некоторую другую полезную информацию, включая некоторые способы использования httpry, можно найти по адресу: http://taosecurity.blogspot.com/2008/06/logging-web-traffic-with-httpry.html.

ScottZ
источник
0

Разве используемый вами веб-сервер не создает журналы? Конечно, это был бы гораздо лучший способ отслеживать HTTP-трафик, существует множество инструментов для анализа данных, и любой компетентный веб-сервер должен создавать надежные журналы.

JamesHannah
источник
4
Ясно. Я думаю, что он уже думал об этом, хотя. Иногда полезно отслеживать фактические данные, отправляемые между точкой A и точкой B.
Tylerl
0

На рынке доступно несколько инструментов, разработанных специально для мониторинга HTTP-трафика. Fiddler2 ( http://www.fiddler2.org ) и HTTP Debugger Pro являются примерами таких инструментов.


источник
4
Спасибо за ваши предложения. К сожалению, оба инструмента работают только на Windows. Я не упоминал об этом, но я ищу что-то, что работает в Linux.
otto.poellath