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

72

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

    
задан Kees Cook 06.11.2010 в 07:56
источник

14 ответов

17

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

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

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

    
ответ дан OpenNingia 06.11.2010 в 10:53
источник
99

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

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 10.11.2010 в 12:04
41

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

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

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

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

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

    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, если хотите)

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

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

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

ответ дан felahdab 19.07.2014 в 13:39
12
netstat -taucp | grep <pid or process name>

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

    
ответ дан Oli 06.11.2010 в 10:15
9

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

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

Ссылка

  

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

Ссылка

  

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

    
ответ дан Clausi 10.11.2010 в 13:33
8

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

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

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

    
ответ дан szymon 06.04.2014 в 16:49
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 в выбранный вами процесс. Интересно, будет ли это полезно для взлома чего-то с помощью wirehark и вашего конкретного приложения, работающего как конкретный пользователь?

    
ответ дан ioerror 12.12.2010 в 10:50
4

Вы можете попробовать tracedump - Ссылка

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

    
ответ дан pjf 01.04.2014 в 14:51
4

Попробуйте запустить процесс, который вас интересует в strace :

strace ping www.askubuntu.com

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

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

    
ответ дан user5883 10.11.2010 в 10:54
3

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

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

    
ответ дан poolie 12.12.2010 в 11:23
2

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

    
ответ дан JamesThomasMoon1979 15.01.2015 в 05:35
2

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

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

    
ответ дан Jonas Danielsson 15.07.2016 в 13:24
0

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

    
ответ дан chesty 06.11.2010 в 09:30
-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 10.11.2010 в 07:59