Я хотел бы изучить сетевой трафик, обрабатываемый одним процессом, но простой захват сети не будет работать, поскольку я имею дело с такой загруженной системой (много другого трафика происходит одновременно) Есть ли способ изолировать перехват tcpdump
или wireshark
для сетевого трафика одного конкретного процесса? (Использование netstat
недостаточно.)
Действительно, есть способ, используя Wireshark фильтры. Но вы не можете напрямую фильтровать по имени процесса или PID (потому что это не сетевые количества).
Сначала вы должны выяснить, какие протоколы и порты использует ваш процесс. (команда netstat в предыдущем комментарии работает хорошо).
Затем используйте Wireshark для фильтрации входящего (или исходящего) порта с помощью только что извлеченного. Это должно изолировать входящий и исходящий трафик вашего процесса.
netstat -taucp | grep <pid or process name>
Это покажет соединения, которые делает приложение, включая используемый порт.
Это грязный хак, но я бы предложил либо переадресацию, либо цель лога с 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-опций', '--log-ip-опций', '--log-uid' для этой цели лога. Хотя я подозреваю, что это поможет вам обработать только тот pcap, который содержит тонну других данных.
Цель NFLOG может быть полезна, если вы хотите пометить пакеты, а затем определенные помеченные пакеты будут посылаться через сокет сетевой ссылки процессу по вашему выбору. Интересно, будет ли это полезно для взлома чего-нибудь с wireshark и вашим конкретным приложением, запущенным от имени конкретного пользователя?
Я пришел к аналогичному проблема, и я смог разобраться в ней на основе этого ответа от 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
Затем вы можете запустить данный процесс из учетной записи пользователя это больше ничего не делает - и вуаля, вы только что изолировали и захватили трафик от одного процесса.
Просто хотел опубликовать ответ на случай, если это кому-то поможет.
Я знаю, что эта ветка устарела, но думаю, что это может помочь некоторым из вас:
Если ваше ядро позволяет это, захват сети трафик одного процесса очень легко сделать, запустив указанный процесс в изолированном сетевом пространстве имен и используя wirehark (или другие стандартные сетевые инструменты) в указанном пространстве имен.
Настройка может показаться немного сложной, но как только вы понять его и ознакомиться с ним, это значительно упростит вашу работу.
Для этого:
создайте тестовое сетевое пространство имен:
ip n etns добавить тест
создать пару виртуальных сетевых интерфейсов (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 вверх 192.168.163.254 сетевая маска 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 <ваш интернет-интерфейс, например eth0> -j SNAT --to-source <ваш IP-адрес>
(Вы также можете использовать правило MASQUERADE, если хотите)
наконец, вы можете запустить процесс, который хотите проанализировать, в новом пространстве имен, а также wirehark:
ip netns exec test thebinarytotest
ip netns exec тест wirehark
Вам нужно будет контролировать интерфейс veth-a.
Просто идея: возможно ли привязать ваше приложение к другому IP-адресу? Если да, то вы можете использовать обычные подозреваемые (tcpdump и т.д.)
Утилиты для приложений, которые не могут быть привязаны к другому IP-адресу:
http://freshmeat. net/projects/fixsrcip
fixsrcip
- инструмент для привязки исходящих TCP и UDP клиентских сокетов (IPv4) к определенным IP адресам источника на многодоменных хостах
http://freshmeat.net/projects/force_bind
force_bind
позволяет принудительно привязать их к определенному IP и/или порту. Она работает как с IPv4, так и с IPv6.
Для запуска и мониторинга нового процесса:
strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
Для мониторинга существующего процесса с известным PID:
strace -p $PID -f -e trace=network -s 10000
-f
означает, что "следить за новыми процессами"-e
определяет фильтр-s
устанавливает ограничение строк более чем на 32-p
берет идентификатор процесса для прикрепления кЯ написал приложение на C, которое делает то, что описано выше в отличном ответе от felahdab!
Смотрите здесь: nsntrace github repo
Основываясь на ответе ioerror я подозреваю, что вы можете использовать iptables --uid-owner
для установки маркера на трафик, а затем вы можете попросить wireshark перехватывать только трафик с помощью этого маркера. Вы можете использовать DSCP (маркер дифференциальных сервисов), flow id или qos маркер.
Или действительно вы можете использовать это для отправки этих пакетов через другой интерфейс, а затем перехватывать только на этом интерфейсе.
Попробуйте запустить интересующий вас процесс в разделе strace:
strace ping www.askubuntu.com
Это даст вам очень детальную информацию о том, что делает ваш процесс. Поскольку процесс может открыть любые порты, которые он хочет где угодно, используя предопределенный фильтр, вы можете что-нибудь пропустить.
Другим подходом будет использование вырезанной виртуальной машины или тестовой машины в вашей сети, и поместить ваш процесс на нее изолированно. Затем вы можете просто использовать Wireshark, чтобы перехватить все с этой машины. Вы будете уверены, что перехваченный вами трафик будет иметь отношение к делу.
Вы можете попробовать tracedump - http://mutrics.iitis.pl/tracedump
Он делает именно то, что вы хотите, вы можете указать ему идентификатор процесса или программу для запуска.
Wirehark bug # 1184 - это эта функция. Об этом сообщалось в 2006 году и не реализовано в 2019 году.
может ли работать iptables и ulog? Не то чтобы у меня есть точный рецепт, но я думаю, что iptables может соответствовать процессам, после соответствия вы можете использовать ulog.
Я думаю, что вы можете создать скрипт оболочки для зацикливания через выполнение netstat и записи его в текстовый файл. Что-то вроде (очень грубые шаги):
echo "press q to quit"
while [ <q is not pressed>]
do
`netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done
-
echo "press q to quit"
while [ <q is not pressed>]
do
`netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done
-я не программист, так что я не могу это доработать. Но кто-то здесь может начать с того места, на котором я остановился, и создать для вас рабочий скрипт.