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

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

113
задан 26 December 2013 в 01:26

14 ответов

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

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

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

21
ответ дан 26 December 2013 в 01:26
netstat -taucp | grep <pid or process name>

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

17
ответ дан 26 December 2013 в 01:26

Это грязный хак, но я бы предложил либо переадресацию, либо цель лога с 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-последовательности', '--log-tcp-опций', '--log-ip-опций', '--log-uid' для этой цели лога. Хотя я подозреваю, что это поможет вам обработать только тот pcap, который содержит тонну других данных.

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

5
ответ дан 26 December 2013 в 01:26

Я пришел к аналогичному проблема, и я смог разобраться в ней на основе этого ответа от 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

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

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

11
ответ дан 26 December 2013 в 01:26

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

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

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

Для этого:

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

     ip n  etns добавить тест
     
  • создать пару виртуальных сетевых интерфейсов (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 вверх 192.168.163.254 сетевая маска 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 <ваш интернет-интерфейс, например  eth0> -j SNAT --to-source <ваш IP-адрес>
     

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

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

     ip netns exec test thebinarytotest
    ip netns exec тест wirehark
     

    Вам нужно будет контролировать интерфейс veth-a.

61
ответ дан 26 December 2013 в 01:26

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

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

http://freshmeat. net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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

14
ответ дан 26 December 2013 в 01:26

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

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

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

strace -p $PID -f -e trace=network -s 10000
  • -f означает, что "следить за новыми процессами"
  • -e определяет фильтр
  • -s устанавливает ограничение строк более чем на 32
  • -p берет идентификатор процесса для прикрепления к
162
ответ дан 26 December 2013 в 01:26

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

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

8
ответ дан 26 December 2013 в 01:26

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

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

3
ответ дан 26 December 2013 в 01:26

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

strace ping www.askubuntu.com

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

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

5
ответ дан 26 December 2013 в 01:26

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

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

6
ответ дан 26 December 2013 в 01:26

Wirehark bug # 1184 - это эта функция. Об этом сообщалось в 2006 году и не реализовано в 2019 году.

2
ответ дан 26 December 2013 в 01:26

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

-1
ответ дан 26 December 2013 в 01:26

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

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

-

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

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

-2
ответ дан 26 December 2013 в 01:26

Другие вопросы по тегам:

Похожие вопросы: