Мне поручено отслеживать и отлаживать веб-службу 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, а затем начать сборку файлов.