Показать сетевые соединения процесса


26

Есть ли способ показать связи процесса? Что-то такое:

show PID

в которой showесть команда для этого и PIDpid процесса. Вывод, который я хочу, состоит из всех соединений процесса (в режиме реального времени). Например, если процесс пытается подключиться к 173.194.112.151, вывод будет 173.194.112.151.

Более конкретный пример с Firefox:

show `pidof firefox`

и с Firefox я захожу сначала на google.com , затем на unix.stackexchange.com и, наконец, 192.30.252.129 . Вывод, когда я закрываю браузер, должен быть:

google.com
stackexchange.com
192.30.252.129

(Очевидно, что с браузером этот вывод не является реалистичным, потому что есть много других связанных соединений, но это только пример.)


Под какой Unix вариант? У большинства есть инструменты для этого, но разные.
Жиль "ТАК - перестань быть злым"

Итак, по сути, вы хотите журнал всех соединений?
Сергей Колодяжный

Я думаю, что tcpdump или Wireshark должны сделать эту работу.
Сергей Колодяжный

Некоторые возможные способы сделать это: askubuntu.com/questions/11709/…
Марк Плотник

@Gilles Ubuntu 14.04.3 LTS
ᴇʀs16

Ответы:


24

Вы ищете strace! Я нашел этот ответ на askubuntu , но он действителен для Unix:

Чтобы запустить и контролировать новый процесс:

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

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

strace -p $PID -f -e trace=network -s 10000

В противном случае, но это специфично для Linux, вы можете запустить процесс в изолированном сетевом пространстве имен и использовать wireshark для мониторинга трафика . Это, вероятно, будет более удобным, чем чтение straceжурнала:

  • создать тестовое сетевое пространство имен:

    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 YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (Вы также можете использовать правило MASQUERADE, если хотите)

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

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

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


2
straceна самом деле специфичен для ядра Linux, поэтому не подходит для всех Unix-подобных операционных систем. Насколько я понимаю, BSD-подобные системы имеют схожие утилиты (DTrace и truss). Во всяком случае, хороший ответ (так проголосовал). Добро пожаловать в Stack Exchange.
Энтони Дж. - справедливость для Моники

Ответ , кажется, точка в правильном направлении, однако у меня возникают проблемы интерпретации на straceвыходе при рассмотрении git fetch. Я ожидал увидеть какой-то URL-адрес, включенный в вывод, что также было запрошено OP. Может кто-нибудь помочь?
Андре

14

Пытаться

lsof -i -a -p `pidof firefox`

Он частично работает: он печатает некоторые текущие соединения процесса, но затем автоматически закрывается. Для некоторых программ выводится только это предупреждение:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴇʀsᴇʀ

Вы можете добавить опции, -r1чтобы повторять вывод каждую секунду и -wподавлять предупреждения.
alxrem

2
Это только показывает соединения в определенный момент времени, но не перечисляет все соединения, которые процесс устанавливает за время своего существования. Даже если вы поместите эту команду в цикл, она пропустит недолговечные соединения.
Жиль "ТАК - перестань быть злым"

Спрашивающий не просил просматривать связи в течение его жизни. Можно было бы интерпретировать (in real-time)как from the point in time of tracking and forward.
Луа

8

Вот еще один подход:

ss -nap | grep $(pidof firefox)

Образец вывода:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))

1
Это только показывает соединения в определенный момент времени, но не перечисляет все соединения, которые процесс устанавливает за время своего существования. Даже если вы поместите эту команду в цикл, она пропустит недолговечные соединения.
Жиль "ТАК - перестань быть злым"

5

Вы можете попробовать также с netstat -p. Со страницы руководства:

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

Для отображения только сетевых подключений используйте netstat -tup. Обратите внимание, что для просмотра PID процесса вам может потребоваться быть пользователем root.

Если у вас нет netstatсистемы, у вас может быть ssпочти точный синтаксис. Вы можете использовать тогда ss -tup(как root).


1
Это только показывает соединения в определенный момент времени, но не перечисляет все соединения, которые процесс устанавливает за время своего существования. Даже если вы поместите эту команду в цикл, она пропустит недолговечные соединения.
Жиль "ТАК - перестань быть злым"

1
netstat -p | grep firefox | grep tcp
Филипп Киркбрайд

@ Жиль Это означает, что это отличный ответ для тех, кто хочет увидеть связи в определенный момент времени. Как был мой случай недавно.
Хосе Антонио восстановил Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.