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

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

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

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

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

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

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

Если ваше ядро позволяет это, захват сетевого трафика одного процесса очень легко выполнить, запустив указанный процесс в изолированном сетевом пространстве имен и используя 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.0ifconfig 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_forwardiptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>

    (Вы также можете использовать правило МАСКАРАДА, если хотите)

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

    ip netns exec test thebinarytotestip netns exec test wireshark

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

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

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

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

netstat -taucp | grep <pid or process name>

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

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

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

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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

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

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

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

Я написал приложение на языке Си, которое делает то, что описано в замечательном ответе фелахдаба выше!

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

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

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

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

strace ping www.askubuntu.com

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

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

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