Я хотел бы изучить сетевой трафик, обрабатываемый одним процессом, но простой захват сети не будет работать, поскольку я имею дело с такой загруженной системой (много другого трафика происходит одновременно) Есть ли способ изолировать перехват tcpdump
или wireshark
для сетевого трафика одного конкретного процесса? (Использование netstat
недостаточно.)
Действительно, есть способ, используя фильтры Wireshark . Но вы не можете фильтровать напрямую по имени процесса или PID (потому что они не являются сетевыми величинами).
Сначала вы должны выяснить протоколы и порты, используемые вашим процессом (команда netstat в предыдущем комментарии работает хорошо).
Затем используйте Wireshark, чтобы отфильтровать входящий (или исходящий) порт по тому, который вы только что получили. Это должно изолировать входящий и исходящий трафик вашего процесса.
Я думаю, что вы можете создать сценарий оболочки для циклического выполнения netstat и записи его в текстовый файл. Что-то вроде (очень грубые шаги):
echo "press q to quit"
while [ <q is not pressed>]
do
`netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done
Я не программист, поэтому я не могу это уточнить. Но кто-то здесь может начать с того места, где я остановился, и создать рабочий сценарий для вас.
Я знаю, что этот поток немного староват, но я думаю, что это может помочь некоторым из вас:
Если ваше ядро позволяет это, захват сетевого трафика одного процесса очень легко выполняется с помощью запуска указанного процесса. в изолированном сетевом пространстве имен и с использованием 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.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, если хотите)
наконец, вы можете запустить процесс, который вы хотите проанализировать, в новом пространстве имен, а также wireshark:
ip netns exec test thebinarytotest
ip netns exec test wireshark
Вам придется следить за ветеринаром. интерфейс.
socat
.
– nVentimiglia
30.04.2020, 13:22
--to-source
для iptables
? Это IP-адрес интерфейса, который вы передаете опции -o
, IP-адрес, который вы создаете, или ??? Я попробовал версию маскарада, которая не нуждается в --to-source
, , как описано здесь , и это сработало!
– rickfoosusa
30.04.2020, 13:22
Вы можете попробовать tracedump - http://mutrics.iitis.pl/tracedump
Он делает именно то, что вы хотите, вы можете дать ему идентификатор процесса или программу запустить.
Я пришел к аналогичной проблеме, и мне удалось разобраться, основываясь на этом ответе 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
[ 114] Затем вы можете создать запустить рассматриваемый процесс из учетной записи пользователя, которая больше ничего не делает - и вуаля, вы только что изолировали и захватили трафик из одного процесса.
Просто хотел написать обратно, если это кому-нибудь поможет.
Я написал приложение на C, которое делает то, что описано в великом ответе выше felahdab!
См. Здесь: nsntrace github repo
Для запуска и мониторинга нового процесса:
strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
Для мониторинга существующего процесса с известным PID:
strace -p $PID -f -e trace=network -s 10000
-f
для «следовать за новым процессов "-e
определяет фильтр -s
устанавливает предел строк более 32 -p
принимает идентификатор процесса для присоединения к [119 ] Просто идея: возможно ли привязать ваше приложение к другому IP-адресу? Если это так, вы можете использовать обычные подозреваемые ( tcpdump и т. Д.)
Инструменты для приложений, которые не способны связываться с другим IP-адресом:
http://freshmeat.net/projects/fixsrcip
blockquote>
fixsrcip
- это инструмент для привязки исходящих клиентских сокетов TCP и UDP ( IPv4 ) к конкретному исходному IP адреса на многодомных хостахhttp://freshmeat.net/projects/force_bind
BLOCKQUOTE>
force_bind
позволяет принудительно связывать на конкретный IP и / или порт. Он работает как с IPv4, так и с IPv6 .
netstat -taucp | grep <pid or process name>
Это покажет соединения, которые устанавливает приложение, включая используемый порт.
Основываясь на ответе ioerror Я подозреваю, что вы можете использовать iptables --uid-owner
для установки маркера трафика, а затем вы можете попросить Wireshark захватывать только трафик с этим маркером. Возможно, вы сможете использовать DSCP (маркер дифференциальных услуг), идентификатор потока или маркер qos.
Или, действительно, вы можете использовать это для отправки этих пакетов через другой интерфейс, а затем захватывать только на этом интерфейсе.
Может быть, iptables и ulog могут работать? Не то чтобы у меня был точный рецепт, но я думаю, что iptables может совпадать с процессами, после того, как вы их нашли, вы можете использовать ulog.
iptables -m owner --pid-owner $PID
был удален в Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
– John_J
30.04.2020, 13:27
wireshark bug # 1184 - эта функция. Это еще не реализовано.
Скопировано с пользователя cmanynard на ask.wireshark.org
Попробуйте запустить интересующий вас процесс в разделе strace :
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 и вашего конкретного приложения, работающего от имени определенного пользователя?
netstat
и простые фильтры захвата сети на занятой машине. – Nirmal Dhara 30.04.2020, 13:21netstat
; Я смогу ловить только долгоживущие связи. :( – klange 30.04.2020, 13:22