Назад | Перейти на главную страницу

Как захватить содержимое первого пакета TCP-соединений с помощью tcpdump

Мне поручено отслеживать и отлаживать веб-службу SOAP на сетевом уровне. я могу использовать tcpdump для захвата всего трафика, поступающего от клиентов на порт 80, но я не могу ограничить захват каждого запроса только первым полученным пакетом уровня приложения (в данном случае наиболее значимым пакетом, который несет заголовок HTTP-запроса и начало Документ SOAP XML). Я хочу знать какой tcpdump switch (или комбинацию других команд Linux), чтобы использовать этот первый пакет для каждого TCP-соединения и отбрасывать остальные пакеты, полученные для того же соединения.

Если возможно, было бы неплохо иметь первый ответный пакет (и, вероятно, единственный, потому что в этом приложении XML-документы ответа небольшие), отправленный с сервера клиенту.

В настоящее время я бегаю tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' пример из tcpdump man-страницу, поэтому я не получаю пакеты подтверждения TCP.

И проблема с -c переключатель tcpdump завершается после захвата пакета, в то время как мне нужно, чтобы он продолжал работать и продолжал показывать ту же информацию для новых подключений. В идеале мне нужно что-то похожее на tailфайлы журнала доступа к apache, а также первые значимые фрагменты запроса и ответа.

Выгрузить захват в файл (-w вариант).

Вы можете проанализировать это с помощью wireshark впоследствии, который имеет мощный механизм фильтрации. У вас будет доступ ко всей необходимой информации: заголовки, полезная нагрузка SOAP и т. Д.

Вероятно, вам нужен не просто первый пакет - первые пакеты сеанса TCP - это трехстороннее рукопожатие, которое в первую очередь устанавливает сеанс. Тем не мение, tcpdump действительно имеет -c флаг, который позволяет захватывать определенное количество пакетов.

Таким образом, ваш запрос на самом деле уже, чем предполагает заголовок - вы специально ищете HTTP-запросы.

Для этого я использую ngrep, который сочетает в себе функции типов tcpdump и grep. например:

sudo ngrep -d eth0 '^(GET|POST) ' port 80

Это даст вам текстовый вывод. Если вы хотите, вы можете использовать параметр -w, чтобы записать совпавшие пакеты в файл в формате tcpdump.

Используйте -d, как указано выше, чтобы указать интерфейс, поскольку -i используется как в grep для нечувствительности к регистру.

Вышеупомянутое также будет включать исходящие запросы и прочее, что вам может не понадобиться. при необходимости добавьте параметры типа tcpdump.

Если вы отлаживаете запросы к определенному URL-адресу, вы можете использовать это, чтобы сделать регулярное выражение более конкретным. например

sudo ngrep '^(GET|POST) /my/soap/interface .*Host: myhost.example.com' 'dst port 80 and dst host myhost.example.com'

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