Есть ли простой инструмент командной строки для перехвата пакетов одной команды в Linux?

11

Я был бы рад, если бы в Linux был один инструмент командной строки для перехвата пакетов одной команды. что-то вроде sniff dumpfile commandтого, чтобы вы могли просто запустить команду, которую вы хотите, чтобы сниффинг пакетов в терминале и получить дамп пакетов в другом месте.

Я хотел бы сбросить / сохранить / увидеть только сетевой трафик одной введенной команды, а не весь трафик TCP на моем едином сетевом интерфейсе. Так что, если бы я вошел в свой компьютер и в фоновом режиме работал IRC, и sniff somefile wget http://www.google.comя бы хотел увидеть весь сетевой трафик, который команда wget сделала для загрузки http://www.google.com . Я не хочу, чтобы у «somefile» трафик в сети IRC сбивал с толку.

Есть много команд linux / unix, которые принимают другую команду и делают что-то другое. С sudo(запускать с правами суперпользователя), niceизменить хороший уровень trickle(ограничить пропускную способность команды)

Рори
источник
1
Что именно вы хотите сделать? Хотите проверить, запущена ли определенная команда? Хотите перехватить сетевой трафик? Потому что использование фразы «пакетный анализ команды» не имеет никакого смысла для меня вообще ...
wzzrd
wzzrd, см. расширенный вопрос
Рори

Ответы:

10

Я не знаю ни одного, но теоретически не должно быть трудно получить нечто подобное. Strace может использоваться для перехвата системных вызовов.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

Это даст вам информацию о данных, передаваемых между ядром и процессом. Вывод strace не совсем то, что вы хотели бы. Однако strace использует системный вызов ptrace для перехвата системных вызовов. Возможно, можно написать программу для вывода данных более полезной.

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

Дэвид Пашли
источник
Было бы здорово, если бы он выводил что-то, что Wireshark мог прочитать.
Брэд Гилберт
Имейте в виду, что описанная выше полоса является точной для Solaris (и, возможно, других коммерческих Unices). В Linux strace - это трассировщик системных вызовов, похожий по работе и выводу на truss в Solaris или tusc в HP-UX.
Джеймс Ф
1
Я описал strace на Linux.
Дэвид Пашли
8

Tracedump

Tracedump - это сниффер IP-пакетов одного приложения, который захватывает все пакеты TCP и UDP одного процесса Linux.

Скачать и описание здесь: http://mutrics.iitis.pl/tracedump

PJF
источник
1
Это должен быть правильный ответ сейчас.
h0tw1r3
4

Попробуй Wireshark - команда будет tshark

  • tshark позволяет выбирать фильтры для трафика, захваченного из интерфейса
  • используйте другие утилиты, такие как debian lsof, чтобы определить тип связи, выполняемой вашим интересующим приложением.

Или ты действительно хочешь LSOF?


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

Например, wgetобычно IP-адрес назначения отличается от другого трафика, связанного с процессом. Даже если вы берете что-то подобное, skypeдиапазон портов назначения обычно фиксирован для экземпляра.


Это немного похоже на принцип неопределенности. Обычно вы можете знать, что происходит с набором коммуникационных путей (с помощью снифферной фильтрации по идентифицированной группе потоков) или где создаются разные коммуникационные каналы (с помощью lsof).

Я действительно хотел бы знать, могут ли оба быть сделаны для заявления. Я думаю, что это должно быть осуществимо. Но, еще не видел, чтобы какой-либо инструмент сделал это.

Nik
источник
Это потрясающе, но я бы лучше посмотрел, что он делает / отправляет / получает.
Рори
4

Научитесь использовать выражения фильтра.

Хотя это не будет делать то, что вы просите.

Это позволит вам удалить почти все «запутанные вещи, такие как IRC» из захвата.

Кроме того, очень полезно знать синтаксис фильтра для быстрого ознакомления в будущем.

Дэн Карли
источник
2

Специально для веб-браузера / веб-страницы что-то вроде плагина Firebug для Firefox может дать вам некоторую информацию, которую вы ищете: http://getfirebug.com/net.html

В более общих приложениях вам может понадобиться использовать netstat для определения порта (-ов), используемого приложением, а затем Wireshark / tshark / dtrace с фильтром для захвата только этого трафика. Не один ответ, который вы искали, хотя ...

Питер
источник
1

Одна идея, попробуйте VMWare

-установить vm
-конфигурировать этот vm для использования определенного интерфейса
-sniff на этом интерфейсе с хоста (это похоже на человека в середине атаки)

Если вы изолируете, какие сетевые приложения работают на этом виртуальном компьютере, у вас может быть свой ответ

Я полагаю, что более идеальным решением будет сделать то, что делает VMWare, с точки зрения того, как он определяет, как он выбирает интерфейс для общения. Я думаю, что его магия исходит от используемых им модулей ядра, в данном случае, вероятно, модуля ядра vmnet.

Насколько мне известно, приложения не знают, с каким интерфейсом они общаются, и я считаю, что это сделано специально; им не нужно беспокоиться о таких вещах.

Кроме того,
возможно, программа уже существует, я не знаю. Но если кто-то написал, вы могли бы назвать это Nettrace (например), и использование может быть как

интерфейс программы nettrace

затем прослушайте интерфейс, который он использует, и добавьте маршруты (возможно, автоматически) в ваш реальный интерфейс

оборот
источник
да, это было бы возможно. Однако было бы здорово, если бы был простой и быстрый инструмент для этого.
Рори
Может быть, настало время для этого простого инструмента? Интересно, будет ли это так сложно, возможно, мод vmnet может быть хорошей отправной точкой (хотя я не знаю, будут ли проблемы с лицензированием). Возможно (хак) просто использовать мод vmnet. Я знаю, что часто интересуюсь такими вопросами.
Ред.
1

Предполагая, что вы единственный человек на коробке, который пытался подключиться к Google в то время, я думаю, что-то вроде этого должно сработать:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Если вы не единственное соединение, пытающееся подключиться к Google на коробке, то, если вы можете определить IP / порт, с которого вы подключаетесь, вы также можете указать src port / src ip.

Идентификация порта src может быть проблемой, если вы не можете указать его на клиенте, который вы используете. Я не уверен, если вы можете с Wget.

Я сильно подозреваю, что вы можете указать оба порта src и dst, netcatпоэтому, если вас заинтересовал действительно Google, вы можете выполнить GET (вручную) через netcat.

Конечно, на странице руководства вы найдете подробности

Джейсон Тан
источник
1

Страница man tcpdump и многие веб-сайты содержат подробные примеры фильтров, и есть даже несколько онлайн-репозиториев выражений фильтра tcpdump. Он должен иметь возможность делать практически все, о чем вы можете мечтать, предполагая, что вы знаете что-то о сетевом трафике (источник, пункт назначения, порты, протоколы и т. Д.) За пределами того, какая программа его генерирует.

Если вы работаете на сервере или в автономном режиме, вы всегда можете заставить tcpdump написать файл дампа, а затем открыть его в Wireshark на вашей рабочей станции и получить расширенную фильтрацию и графический интерфейс.

Джейсон Антман
источник
Хм, какой переход на команду tcpdump ограничил бы его одним приложением, которое генерирует трафик?
Милан Бабушков
1

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

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Прочитайте файл дампа позже:

tshark -r dump
Не сейчас
источник
Вы захватываете порт 8080, но генерируете трафик на порту 80; это не будет делать то, что вы собираетесь.
Джеймс Ф
Джеймс: Мой прокси соединяется с 8080, вот как я запускал скрипт. Я должен был изменить это 80 для целей этого поста.
Не сейчас
0

Dtrace должен допустить это, хотя я пока не знаю, полностью ли он сделан в Linux.

Toto
источник