Как отследить сетевую активность команды?

13

Я хочу отслеживать сетевую активность команды, я безуспешно пробовал tcpdump и strace.

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

Я думаю, что мы можем сделать это с помощью tcpdump. Я пытался, но он отслеживает всю сетевую активность моей системы. Скажем, если я запускаю несколько команд, связанных с сетью, и хочу отслеживать только конкретные действия командных сетей, то в это время трудно найти точное решение.

Есть способ сделать это?

ОБНОВИТЬ:

Я не хочу отслеживать все, что происходит на моем сетевом интерфейсе. Я просто хочу отслеживать сетевую активность команды (например, #yum install -y vim). Например, сайт пытается достичь.

Буванеш Кумар
источник
1
Поместите приложение в сетевое пространство имен, затем используйте tcpdump / wireshark. Смотрите, например, здесь .
dirkt

Ответы:

17

netstat для простоты

Использование netstatи поиск PID или имени процесса:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

И вы можете использовать watchдля динамических обновлений:

watch 'netstat -np --inet | grep "thunderbird"'

С:

  • -n: Показать числовые адреса вместо того, чтобы пытаться определить символические имена хоста, порта или пользователя
  • -p: Показать PID и название программы, к которой принадлежит каждый сокет.
  • --inet: Показывать только необработанные сокеты, протоколы TCP и TCP.

приступить к многословию

Вы сказали, что пробовали straceинструмент, но пробовали ли вы вариант trace=network? Обратите внимание, что вывод может быть довольно подробным, поэтому вам может потребоваться некоторая опечатка. Вы можете начать с поиска "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Или, для уже запущенного процесса, используйте PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
источник
+1 для netstatкоторого ИМХО самое простое и изящное решение.
dr01
@ Гох, я сделал то же самое для ДНФ. но не повезло. Я попытался установить некоторые пакеты с помощью dnf, затем я вижу, что процесс dnf запущен (имя процесса: dnf согласно командам top и ps aux). К сожалению, я не получил никакого вывода от netstat -np --inet | grep "dnf".
Буванеш Кумар
+1 за стрейс. Это решило мою проблему. Я могу получить IP-адреса. Большое спасибо за ваш ответ :) @ Gohu. Я предполагаю, что он дает все IP-адреса, которые он достигает по сети (например, IP-адрес маршрутизатора и другие IP-адреса). Если вы знаете, возможно ли отслеживать только IP-адрес назначения?
Буванеш Кумар
Вы можете попытаться отфильтровать straceвывод еще немного, сохранив только connectсистемные вызовы и удалив dnsзапросы (порт 53) с помощью:| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 для опции трассировки сети на strace
phreed
5

Я создал бы новое сетевое пространство имен , связал бы его с реальной сетью, а затем контролировал бы мост tcpdump.

Саймон Рихтер
источник
1
Спасибо за ответ. Было бы здорово, если бы вы сказали мне, как :).
Буванеш Кумар
5

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

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

Он также имеет то преимущество, что его не используют в качестве оболочки приложения strace, и он может быть довольно мощным.

Из примеров Sysdig

сетей

Посмотрите основные процессы с точки зрения использования пропускной способности сети

sysdig -c topprocs_net 

Показать данные сети, которыми обмениваются с хостом 192.168.0.1

Как двоичный файл:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Как ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Посмотрите верхние порты локального сервера:

С точки зрения установленных связей:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

С точки зрения общего количества байтов:

sysdig -c fdbytes_by fd.sport 

Посмотрите IP-адреса лучших клиентов

С точки зрения установленных связей

sysdig -c fdcount_by fd.cip "evt.type=accept"   

В пересчете на общее количество байтов

sysdig -c fdbytes_by fd.cip 

Список всех входящих соединений, которые не обслуживаются Apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Руи Ф Рибейро
источник
1

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

С обоими вариантами вы можете увидеть весь сетевой трафик и сохранить его для последующего анализа всех установленных соединений.

Рикард Молинс
источник
1
Как я уже говорил ранее, если я запускаю несколько команд, связанных с сетью, как я могу узнать, какая команда получает какой сайт?
Буванеш Кумар
Это более общий ответ. Это я уже знаю, что мы можем отслеживать сетевую активность сетевого интерфейса :). Я ищу для отслеживания конкретной команды сети статики.
Буванеш Кумар
Если вы знаете, какие порты использует команда, вы можете отфильтровать снифф, чтобы ограничить его нужной вам командой. Однако это может быть невозможно в вашей ситуации.
Рикард Молинс