Я хотел бы изучить сетевой трафик, обрабатываемый одним процессом, но простые сетевые захваты не будут работать, поскольку я имею дело с такой загруженной системой (одновременно происходит много другого трафика). Есть ли способ изолировать 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 и вашего конкретного приложения, запущенного от имени конкретного пользователя?