Как я могу захватить сетевой трафик одного процесса?

93

Я хотел бы изучить сетевой трафик, обрабатываемый одним процессом, но простой захват сети не будет работать, поскольку я имею дело с такой загруженной системой (много другого трафика происходит одновременно). Есть ли способ изолировать tcpdumpили wiresharkзахватить сетевой трафик одного конкретного процесса? (Использование netstatнедостаточно.)

Кис Кук
источник

Ответы:

21

Действительно есть способ, используя фильтры Wireshark . Но вы не можете фильтровать напрямую по имени процесса или PID (потому что они не являются сетевыми величинами).

Сначала вы должны выяснить протоколы и порты, используемые вашим процессом (команда netstat в предыдущем комментарии работает хорошо).

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

OpenNingia
источник
6
Для простого подключения это возможно, но мне нужно отследить DNS, HTTP и т. Д., Которые все проносятся мимо, поэтому не существует простого способа просто использовать netstatи простые фильтры захвата сети на занятой машине.
Кис Кук
Хорошо, общедоступные порты HTTP и DNS используются многими приложениями, но соответствующий частный порт уникален. Так почему бы вам не попробовать фильтрацию по частному порту?
OpenNingia
Потому что быстрые маленькие запросы не будут видны netstat; Я смогу ловить только долгоживущие связи. :(
Кис Кук
Что если процесс использует динамические порты во время выполнения, тогда вы не сможете использовать статические фильтры портов
The Unix Janitor
Я думаю, что вы здесь лучший ответ ... К сожалению, инструмент сетевого анализа работает на самом низком уровне сетевого стека, пытаясь поймать все, он совершенно не знает о процессах, запущенных в ОС. Было бы крайне сложно выяснить, что послужило причиной определенного звонка. Анализатор пакетов может в конечном итоге определить (по номеру порта) идентификатор процесса, но не может определить, какой процесс выполнил поиск DNS, поскольку он полностью независим (это, скорее всего, сетевой стек ядра, который инициировал вызов). Но с фильтрацией и остановкой других процессов вы сможете достичь своей цели.
Гюйгенс
136

Чтобы запустить и контролировать новый процесс:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Для мониторинга существующего процесса с известным PID:

strace -p $PID -f -e trace=network -s 10000
  • -f для "следить за новыми процессами"
  • -e определяет фильтр
  • -s устанавливает предел строк более 32
  • -p принимает идентификатор процесса для подключения к
Clausi
источник
2
Это полезно, потому что его можно использовать без корневого доступа или специальных разрешений (в любом случае, в некоторых дистрибутивах Linux - в Ubuntu вам могут потребоваться специальные разрешения).
Робин Грин
1
Это также полезно, потому что он может быть запущен против уже запущенного процесса и доступен практически на любой Linux-системе.
Закмк
53

Я знаю, что эта ветка немного старая, но я думаю, что это может помочь некоторым из вас:

Если ваше ядро ​​позволяет это сделать, захват сетевого трафика одного процесса очень легко выполнить, запустив указанный процесс в изолированном сетевом пространстве имен и используя wireshark (или другие стандартные сетевые инструменты) в указанном пространстве имен.

Настройка может показаться немного сложной, но как только вы поймете ее и познакомитесь с ней, она значительно облегчит вашу работу.

Чтобы сделать так:

  • создать тестовое сетевое пространство имен:

    ip netns add test
    
  • создайте пару виртуальных сетевых интерфейсов (veth-a и veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • изменить активное пространство имен интерфейса veth-a:

    ip link set veth-a netns test
    
  • настройте IP-адреса виртуальных интерфейсов:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • настройте маршрутизацию в тестовом пространстве имен:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • активируйте ip_forward и установите правило NAT для пересылки трафика, поступающего из созданного вами пространства имен (необходимо настроить сетевой интерфейс и IP-адрес SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Вы также можете использовать правило MASQUERADE, если хотите)

  • наконец, вы можете запустить процесс, который вы хотите проанализировать, в новом пространстве имен, а также wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Вам придется следить за интерфейсом veth-a.

felahdab
источник
4
Отличная идея, но остерегайтесь «ограничений». Поскольку это отдельное пространство имен, вы не можете связываться с локальными процессами в пространстве имен по умолчанию, используя адрес (а) обратной связи или доменные сокеты UNIX. Последнее влияет на связь по D-Bus.
Лекенстейн
@Lekensteyn, вы все еще можете использовать доменные сокеты Unix в сетевых пространствах имен afaik. Файловая система ими не изолирована.
рандунель
1
@randunel Я должен быть более точным в этом. Я хотел сказать, что доменные сокеты Unix в «абстрактном пространстве имен сокетов» (которое не использует файловую систему) не могут быть напрямую доступны между сетевыми пространствами имен. В качестве обходного пути вы можете использовать прокси, такой какsocat .
Лекенштейн
Какой IP-адрес вы используете в качестве --to-sourceаргумента iptables? Это IP-адрес интерфейса, который вы передаете -oопции, IP-адрес, который вы создаете, или ??? Я попробовал версию маскарада, которая не нуждается --to-source, как описано здесь , и это работало!
ntc2
3
Все это, кажется, требует root-доступа.
simplegamer
15
netstat -taucp | grep <pid or process name>

Это покажет соединения, которые устанавливает приложение, включая используемый порт.

Оли
источник
8
Это покажет соединения, которые существуют на данный момент, но не предоставит журнал самого трафика.
Кис Кук
1
Не уверен насчет комментария Киса Кука. Простой netstat мгновенно показывает информацию о соединениях, но с флагом -c вы получаете снимок этого состояния каждую секунду (см. «Man netstat»). Возможно, он не имеет всего трафика, но не является уникальным снимком соединений.
Tremendows
3
Ну, я уверен. Это не будет захватывать весь сетевой трафик процесса.
Reinier Post
Это было полезно для определения того, какой номер порта был заблокирован внутренним брандмауэром. Он показал, что TCP SYNs (вместе с адресом назначения и номером порта) был отправлен командой, которую я выполнял.
Энтони Геогеган
11

Просто идея: возможно ли привязать ваше приложение к другому IP-адресу? Если это так, вы можете использовать обычные подозреваемые ( tcpdump и т. Д.)

Инструменты для приложений, которые не способны связываться с другим IP-адресом:

http://freshmeat.net/projects/fixsrcip

fixsrcipпредставляет собой инструмент для привязки исходящих клиентских сокетов TCP и UDP ( IPv4 ) к определенным исходным IP-адресам на многодомных хостах

http://freshmeat.net/projects/force_bind

force_bindпозволяет принудительно связать конкретный IP и / или порт. Работает как с IPv4, так и с IPv6 .

Clausi
источник
Большинство приложений не поддерживают указание исходного IP-адреса, но на самом деле это может быть возможно при использовании контейнера с CLONE_NEWNET, но не CLONE_NEWNS.
Кис Кук
Кроме того, вы можете создать сетевое пространство имен и запустить в нем свое приложение. Www.evolware.org/?p=293
Flint
9

Я пришел к аналогичной проблеме, и мне удалось разобраться на основе этого ответа по ioerror , используя NFLOG, как описано здесь :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

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

Просто хотел отправить обратно на случай, если это кому-нибудь поможет.

Шимона
источник
6

Я написал приложение на C, которое делает то, что описано в прекрасном ответе выше felahdab!

Смотрите здесь: nsntrace github repo

Йонас Даниэльссон
источник
Это круто, но я думаю, что было бы неплохо добавить некоторые подробности о том, как его получить и использовать :)
Zanna
Спасибо! Я предоставил ссылку на репозиторий github, который содержит файл README.md, в котором есть примеры использования и примеры, а также инструкции по загрузке!
Йонас Даниэльссон
5

Это грязный хак, но я бы предложил либо переадресацию, либо цель регистрации с iptables для данного UID. например:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Также может быть полезно рассмотреть что-то вроде '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' для этой цели журнала. , Хотя я подозреваю, что это только поможет вам опубликовать процесс обработки pcap, который содержит массу других данных.

Цель NFLOG может быть полезна, если вы хотите пометить пакеты, а затем определенные помеченные пакеты будут отправлены через сокет netlink в процесс по вашему выбору. Интересно, будет ли это полезно для взлома чего-нибудь с wireshark и вашим конкретным приложением, работающим от имени конкретного пользователя?

IOError
источник
но это работает только для исходящих, как насчет поступления?
результаты
5

Вы можете попробовать tracedump - http://mutrics.iitis.pl/tracedump

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

PJF
источник
1
Хороший проект, но ... "Tracedump в настоящее время работает только на 32-битных хостах Linux", к сожалению, убивает его.
gertvdijk
4

Попробуйте запустить интересующий вас процесс под strace :

strace ping www.askubuntu.com

Это даст вам очень подробную информацию о том, что делает ваш процесс. Поскольку процесс может открывать любые порты в любом месте, используя предопределенный фильтр, вы можете что-то пропустить.

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

Уникс Дворник
источник
Добавление в -e trace = network сокращает часть выходных данных за счет потери данных, которые фактически записываются в сеть. Если вам важно только «количество открытых сокетов» или подобное, это облегчает задачу.
dannysauer
3

Опираясь на ответ ioerror, я подозреваю, что вы можете использовать iptables --uid-ownerдля установки маркера трафика, а затем попросить wireshark захватывать только трафик с этим маркером. Возможно, вы сможете использовать DSCP (маркер дифференциальных услуг), идентификатор потока или маркер qos.

Или действительно вы можете использовать это для отправки этих пакетов через другой интерфейс, а затем захватывать только на этом интерфейсе.

poolie
источник
-1

может быть, iptables и ulog могут работать? Не то, чтобы у меня был точный рецепт, но я думаю, что iptables может соответствовать процессам, после того, как вы их нашли, вы можете использовать ulog.


источник
3
К сожалению, iptables -m owner --pid-owner $PIDбыл удален в Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook
-1

Я думаю, что вы можете создать сценарий оболочки для циклического выполнения netstat и записи его в текстовый файл. Что-то вроде (очень грубые шаги):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

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

tinhed
источник
Не достаточно хорош. Вопрос в том, чтобы перехватить весь сетевой трафик, а не только то, что происходит в то время, когда он активен в момент проверки.
Reinier Post