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

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

84
задан 30.04.2020, 13:19

14 ответов

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

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

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

0
ответ дан 30.04.2020, 13:20
  • 1
    Что если процесс использует динамические порты во время выполнения, тогда вы не сможете использовать статические фильтры портов – bpoiss 30.04.2020, 13:21
  • 2
    Для простого подключения это возможно, но мне нужно отследить DNS, HTTP и т. Д., Которые все проносятся мимо, поэтому не существует простого способа просто использовать netstat и простые фильтры захвата сети на занятой машине. – Nirmal Dhara 30.04.2020, 13:21
  • 3
    Я думаю, что вы здесь лучший ответ ... К сожалению, инструмент сетевого анализа работает на самом низком уровне сетевого стека, пытаясь поймать все, он совершенно не знает о процессах, запущенных в ОС. Было бы крайне сложно выяснить, что послужило причиной определенного звонка. Анализатор пакетов может в конечном итоге выяснить (через номер порта) идентификатор процесса, но не может определить, какой процесс выполнил поиск DNS, поскольку он полностью независим (это, скорее всего, сетевой стек ядра, который инициировал вызов). Но с фильтрацией и остановкой других процессов вы сможете достичь своей цели. – Himanshu Aggarwal 30.04.2020, 13:21
  • 4
    Хорошо, общедоступные порты HTTP и DNS используются многими приложениями, но соответствующий частный порт уникален. Так почему бы вам не попробовать фильтрацию по частному порту? – Hasitha M Jayawardana 30.04.2020, 13:22
  • 5
    Потому что быстрые маленькие запросы не будут видны netstat; Я смогу ловить только долгоживущие связи. :( – klange 30.04.2020, 13:22

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

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

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

0
ответ дан 30.04.2020, 13:21
  • 1
    Не достаточно хорош. Вопрос состоит в том, чтобы захватывать весь сетевой трафик, а не только то, что оказывается активным в то время, когда вы проверяете. – Spikatrix 30.04.2020, 13:21

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

Если ваше ядро ​​позволяет это, захват сетевого трафика одного процесса очень легко выполняется с помощью запуска указанного процесса. в изолированном сетевом пространстве имен и с использованием 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
    

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

  • [Тысяча сто двадцать семь]
0
ответ дан 30.04.2020, 13:21
  • 1
    @randunel Я должен быть более точным в этом. Я хотел сказать, что доменные сокеты Unix в «абстрактном пространстве имен сокетов» (который не использует файловую систему) не может быть напрямую доступен между сетевыми пространствами имен. В качестве обходного пути вы можете использовать прокси, такой как socat . – nVentimiglia 30.04.2020, 13:22
  • 2
    @Lekensteyn, вы все еще можете использовать доменные сокеты Unix в сетевых пространствах имен afaik. Файловая система ими не изолирована. – Steffi 30.04.2020, 13:22
  • 3
    Какой IP-адрес вы используете с аргументом --to-source для iptables? Это IP-адрес интерфейса, который вы передаете опции -o, IP-адрес, который вы создаете, или ??? Я попробовал версию маскарада, которая не нуждается в --to-source, , как описано здесь , и это сработало! – rickfoosusa 30.04.2020, 13:22
  • 4
    Все это, кажется, требует root-доступа. – Andrey 30.04.2020, 13:23
  • 5
    Отличная идея, но остерегайтесь «ограничений». Поскольку это отдельное пространство имен, вы не можете связываться с локальными процессами в пространстве имен по умолчанию, используя адрес (а) обратной связи или доменные сокеты UNIX. Последнее влияет на связь по D-Bus. – ravelinx 30.04.2020, 13:23

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

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

0
ответ дан 30.04.2020, 13:22
  • 1
    Хороший проект, но ... "Tracedump в настоящее время работает только на 32-битных хостах Linux" убивает это для меня, к сожалению. – pascal 30.04.2020, 13:23

Я пришел к аналогичной проблеме, и мне удалось разобраться, основываясь на этом ответе 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
[ 114] Затем вы можете создать запустить рассматриваемый процесс из учетной записи пользователя, которая больше ничего не делает - и вуаля, вы только что изолировали и захватили трафик из одного процесса.

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

0
ответ дан 30.04.2020, 13:23

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

См. Здесь: nsntrace github repo

0
ответ дан 30.04.2020, 13:23
  • 1
    Спасибо! Я предоставил ссылку на репозиторий github, который содержит файл README.md, в котором есть примеры использования и примеры, а также инструкции по загрузке! – schott12521 30.04.2020, 13:24
  • 2
    Это круто, но я думаю, что было бы неплохо добавить некоторые подробности о том, как его получить и использовать :) – Vahid Ghadiri 30.04.2020, 13:24

Для запуска и мониторинга нового процесса:

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

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

strace -p $PID -f -e trace=network -s 10000
  • -f для «следовать за новым процессов "
  • -e определяет фильтр
  • -s устанавливает предел строк более 32
  • -p принимает идентификатор процесса для присоединения к [119 ]
0
ответ дан 30.04.2020, 13:24

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

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

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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

0
ответ дан 30.04.2020, 13:24
  • 1
    Большинство приложений не поддерживают указание исходного IP-адреса, но на самом деле это может быть возможно при использовании контейнера с CLONE_NEWNET, но не CLONE_NEWNS. – Himanshu Aggarwal 30.04.2020, 13:25
  • 2
    Кроме того, вы можете создать сетевое пространство имен и запустить в нем свое приложение www.evolware.org/?p=293. – squirrel 30.04.2020, 13:25
netstat -taucp | grep <pid or process name>

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

0
ответ дан 30.04.2020, 13:25
  • 1
    Это покажет соединения, которые существуют на данный момент, но не предоставит журнал самого трафика. – Irhala 30.04.2020, 13:25
  • 2
    Ну, я уверен. Это не захватит весь сетевой трафик процесса. – codeinprogress 30.04.2020, 13:26
  • 3
    Не уверен насчет комментария Киса Кука. Простой netstat мгновенно показывает информацию о соединениях, но с флагом -c вы получаете снимок этого состояния каждую секунду (см. «Man netstat»). Возможно, он не имеет всего трафика, но не является уникальным снимком соединений. – Chathura Jayanath 30.04.2020, 13:26
  • 4
    Это было полезно для определения того, какой номер порта был заблокирован внутренним брандмауэром. Он показал, что TCP SYNs (вместе с адресом назначения и номером порта) был отправлен командой, которую я выполнял. – user5649834 30.04.2020, 13:26

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

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

0
ответ дан 30.04.2020, 13:25

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

0
ответ дан 30.04.2020, 13:26

wireshark bug # 1184 - эта функция. Это еще не реализовано.
Скопировано с пользователя cmanynard на ask.wireshark.org

0
ответ дан 30.04.2020, 13:27

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

strace ping www.askubuntu.com

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

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

0
ответ дан 30.04.2020, 13:27
  • 1
    Добавление в -e trace = network & quot; сокращает часть выходных данных за счет потери данных, которые фактически записываются в сеть. Если вас волнует только "количество открытых розеток" или подобное, это делает вещи проще. – CoDe 30.04.2020, 13:28

Это грязный хак, но я бы предложил либо переадресацию, либо цель входа в систему с 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 и вашего конкретного приложения, работающего от имени определенного пользователя?

0
ответ дан 30.04.2020, 13:28
  • 1
    но это работает только для исходящих, как насчет входящих? – Marc Plano-Lesay 30.04.2020, 13:28