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


92

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

Відповіді:


21

Дійсно, є спосіб, використовуючи фільтри Wireshark . Але ви не можете фільтрувати безпосередньо за назвою процесу чи PID (оскільки вони не є мережевими величинами).

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

Потім використовуйте Wireshark для фільтрування вхідного (або вихідного) порту за допомогою того, який ви тільки що отримали. Це повинно ізолювати вхідний та вихідний трафік вашого процесу.


6
Для простого підключення це можливо, але мені потрібно відстежувати DNS, HTTP тощо, які все проходять повз, тому не існує простого способу просто використовувати netstatі прості мережеві фільтри захоплення на зайнятій машині.
Кіс Кук

Гаразд, публічні порти HTTP і DNS використовуються великою кількістю додатків, але відповідний приватний порт унікальний. То чому б вам не спробувати фільтрацію через приватний порт?
OpenNingia

Оскільки швидкі невеликі запити не будуть розглядатися netstat; Мені вдасться лише спіймати довговічні зв’язки. :(
Kees Cook

Що робити, якщо процес використовує динамічні порти під час виконання, то ви не зможете використовувати статичні порти-фільтри
Unix Janitor

Я думаю, що ви тут найкраща відповідь ... На жаль, інструмент нюхання мережі працює на найнижчому рівні мережевого стеку, намагаючись вловити все, він абсолютно не знає процесів, що працюють в ОС. Було б надзвичайно важко з'ясувати, що спричинило певний дзвінок. Снайпер пакету може врешті визначити (через номер порту) ідентифікатор процесу, але не може з'ясувати, який процес здійснив пошук DNS, оскільки це повністю незалежно (це, швидше за все, чистий стек ядра, який ініціював виклик). Але фільтруючи та зупиняючи інші процеси, ви повинні мати можливість досягти своєї мети.
Гюйгенс

134

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

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

Щоб контролювати існуючий процес із відомим PID:

strace -p $PID -f -e trace=network -s 10000
  • -f призначено для "слідування за новими процесами"
  • -e визначає фільтр
  • -s встановлює обмеження рядків більше 32
  • -p приймає ідентифікатор процесу, до якого потрібно приєднатися

2
Це корисно, оскільки ним можна користуватися без доступу до коренів або спеціальних дозволів (так чи інакше, в деяких дистрибутивах Linux - для Ubuntu вам можуть знадобитися спеціальні дозволи).
Робін Грін

1
Це також корисно, оскільки воно може працювати проти вже запущеного процесу і доступне практично в будь-якому вікні Linux.
zakmck

53

Я знаю, що ця тема трохи стара, але я думаю, що це може допомогти деяким з вас:

Якщо ваше ядро ​​дозволяє це, захоплення мережевого трафіку одного процесу дуже легко здійснити, запустивши зазначений процес в ізольованому просторі мережевих імен та використовуючи дротик (або інші стандартні інструменти для мереж) у зазначеному просторі імен.

Установка може здатися трохи складною, але як тільки ви зрозумієте це та ознайомитеся з ним, це настільки полегшить вашу роботу.

Як це зробити:

  • створіть простір імен тестової мережі:

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

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

    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, якщо вам зручніше)

  • нарешті, ви можете запустити процес, який ви хочете проаналізувати, у новому просторі імен, і також провідний шлях:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Вам доведеться контролювати veth-інтерфейс.


4
Чудова ідея, але остерігайтеся "обмежень". Оскільки це окремий простір імен, ви не можете спілкуватися з локальними процесами у просторі імен за замовчуванням, використовуючи адреси (адреси) зворотного звороту або розетки домену UNIX. Останнє впливає на спілкування через D-Bus.
Лекенштейн

@Lekensteyn ви все ще можете використовувати рознімки домену unix у просторах мереж імен afaik. Файлова система ними не ізольована.
randunel

1
@randunel Я повинен був би бути більш точним щодо цього. Що я хотів сказати, це те, що сокети домену Unix в "просторі імен абстрактних сокетів" (який не використовує файлову систему) не можуть безпосередньо отримати доступ між просторами мереж імен. Як вирішення, ви можете використовувати проксі-сервер типуsocat .
Лекенштейн

Яку IP-адресу ви використовуєте для --to-sourceаргументу iptables? Це IP-адреса інтерфейсу, який ви передаєте -oопції, IP-адреса, яку ви складаєте, або ??? Я спробував маскарадну версію, яка не потрібна --to-source, як описано тут , і це спрацювало!
ntc2

3
Все це, здається, вимагає кореневого доступу.
simplegamer

15
netstat -taucp | grep <pid or process name>

Це покаже з'єднання, які здійснює додаток, включаючи використовуваний порт.


8
Це показало б з'єднання, які існують на той момент, але це не забезпечить журнал самого трафіку.
Кіс Кук

1
Не впевнений у коментарі Kees Cook. Простий netstat на мить показує інформацію про з'єднання, але з прапором -c ви отримуєте знімок цього стану щосекунди (див. "Man netstat"). Можливо, він не має всього трафіку, але не є унікальним знімком з'єднань.
tremendows

3
Ну, я впевнений. Це не буде охоплювати весь мережевий трафік процесу.
Reinier Post

Це було корисно для з'ясування, який номер порту блокується внутрішнім брандмауером. Він показав, що TCP SYN (разом з адресою призначення та номером порту) надсилаються командою, яку я виконував.
Ентоні Геоґеган

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 .


Більшість програм не підтримують вказівку свого вихідного IP-адреси, але це фактично можливо, використовуючи контейнер з CLONE_NEWNET, але не CLONE_NEWNS.
Кіс Кук

Крім того, ви можете створити мережевий простір імен та запустити свою програму всередині нього. Www.evolware.org/?p=293
Флінт

9

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

Я написав заявку на С, яка робить те, що описано у великій відповіді вище від felahdab!

Дивіться тут: nsntrace github repo


Це здорово, але я думаю, що було б непогано включити ще детальну інформацію про те, як його отримати та використовувати :)
Zanna

Дякую! Я надав посилання на github repo, в якому міститься файл 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-послідовність', '--log-tcp-options', '--log-ip-options', '--log-uid' для цієї цілі журналу . Хоча я підозрюю, що це лише допоможе вам опублікувати обробку pcap, що включає багато інших даних.

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


але це працює лише для вихідних, а як щодо вхідних?
Результати шляху

5

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

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


1
Гарний проект, але ... "Tracedump зараз працює лише на 32-бітних хостах Linux", на жаль, це вбиває його для мене.
gertvdijk

4

Спробуйте запустити процес, який вас цікавить, під напругою :

strace ping www.askubuntu.com

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

Іншим підходом було б використовувати в мережі обмежену віртуальну машину або тестову машину і розмістити свій процес на цьому ізольовано. Тоді ви можете просто використовувати Wireshark, щоб виловити все з цієї машини. Ви будете майже впевнені, що захований трафік буде релевантним.


Додавання в "-e слід = мережа" скорочує частину результатів за рахунок втрати даних, які фактично записані в мережу. Якщо ви дбаєте лише про "кількість розкритих розеток" чи подібні, це полегшує справи.
dannysauer

3

На основі відповіді через ioerror, я підозрюю, що ви можете використовувати iptables --uid-ownerмаркер для трафіку, а потім ви можете попросити проводку, щоб зафіксувати лише трафік із цим маркером. Можливо, ви зможете використовувати DSCP (маркер диференціальних послуг), id потоку або маркер qos.

Або дійсно ви могли використовувати це, щоб відправити ці пакети з іншого інтерфейсу, а потім захопити лише на цьому інтерфейсі.



-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

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


Недостатньо хороший. Питання полягає в тому, щоб зафіксувати весь мережевий трафік, а не лише те, що станеться активним у той час, коли вам трапляється перевірити.
Reinier Post
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.