Как я могу перехватить сетевые пакеты по PID? - PullRequest
19 голосов
/ 21 октября 2011

Кто-нибудь знает простой способ попросить Linux «отображать каждый интернет-пакет в / из Google Chrome» или «отображать каждый интернет-пакет в / из процесса telnet с PID 10275»?

Пример telnet неслишком полезно, так как я могу просто использовать wireshark или tcpdump, чтобы увидеть все TCP-разговоры, связанные с портом 23. Это и никто больше не использует telnet.Но прослушивание всех пакетов в / из сложных приложений, которые используют много портов, кажется полезным.

Я нашел несколько связанных ответов, исследующих различные способы подтверждения портов и PID (или имен программ) и тому подобное, но ничего о пакетах

Похоже, кто-то, возможно, был готов заплатить за этоОтвет некоторое время назад:

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

Ответы [ 4 ]

1 голос
/ 09 ноября 2018

В моем случае я хотел захватить трафик syslog, но только из rsyslog.Он имел только один прослушивающий порт в lsof -p $(pidof rsyslog) и всегда использовал его в качестве порта источника, поэтому я смог получить пакеты, используя:

tcpdump -i eth0 -A "host 10.0.0.100 and dst port 514 and src port $(lsof -i 4 -a -p `pidof rsyslogd` | grep -Po '(?<=\*:)[0-9]*') and udp"

* * * * * * * * * * * * * * * * * * * * * ** чтобы превратить *: номер порта в номер порта.

1 голос
/ 22 октября 2011

Я бы использовал lsof -i для получения номеров портов, связанных с нужным приложением.Код будет выглядеть следующим образом:

process=firefox
for _port in `lsof -i | grep $process | cut -d' ' -f18 | cut -d: -f2 | cut -d'-' -f1`
do
    port=$_port
    [[ "$_port" == +([a-zA-Z]) ]] && port=`cat /etc/services  | grep '^$_port' | cut -d' ' -f12 | cut -d'/' -f1 | uniq | head -n 1`

    echo "tcpdump -w ${port}.pcap port $port &"
    tcpdump -w ${port}.pcap port $port &
done

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

Кроме того, этот сценарий не отслеживает порты, которые открываются позже.Для этого я бы рассмотрел более сложный сценарий, который регулярно проверяет порты (используя что-то вроде watch)

И не забудьте впоследствии уничтожить все процессы tcpdump.

0 голосов
/ 08 марта 2019

Непосредственно tcpdump, но может дать вам информацию о сетевом трафике, отметьте https://bytefreaks.net/gnulinux/how-to-capture-all-network-traffic-of-a-single-process

strace -f -e trace=network -s 10000 <PROCESS WITH ARGUMENTS>;

Если процесс уже запущен и вы знаете его PID, вы можете использовать следующие 1

strace -f -e trace=network -s 10000 -p <PID>;

Другая альтернатива является более сложной, с использованием сетевых пространств имен, проверьте вышеуказанную ссылку или используйте инструмент nsntrace , но любой из них может работать только с новым процессом, вы не можете изменять существующие сетевые пространства имен процесса.(AFAIK)

0 голосов
/ 21 мая 2014

Tcpdump может сообщить вам PID / процесс, из которого поступает пакет.
Добавьте «-k NP» в ваши параметры.

Поддерживаемая версия: tcpdump версия 4.3.0 - Apple, версия 56

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...