Как узнать, как процесс взаимодействует с сетью в Linux?

«Как узнать, как процесс взаимодействует с сетью в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для диагностики сетевой активности процессов я использую комбинацию инструментов, в зависимости от задачи: быстрая инвентаризация соединений или глубокий анализ трафика.

1. Быстрый обзор всех сетевых соединений:

ss -tunap

Флаги: -t (TCP), -u (UDP), -n (показывать адреса, а не имена), -a (все), -p (процессы). Это моя замена устаревшему netstat. Вывод показывает PID, процесс, локальный и удалённый адреса с портами.

2. Поиск по конкретному процессу или порту:

# Какие соединения у процесса с PID 1234?
lsof -i -a -p 1234

# Какой процесс слушает порт 8080?
lsof -i :8080

3. Мониторинг сетевой активности в реальном времени:

# Группировка трафика по процессам (удобно для поиска "пожирателей" полосы)
nethogs

# Более продвинутый мониторинг с `bpf`-инструментами из BCC:
bpftrace -e 'tracepoint:syscalls:sys_enter_connect { printf("%s -> %sn", comm, str(args->uservaddr)); }'

4. Глубокий анализ (отладка): Для отладки сложных проблем (например, с TLS или задержками) я использую:

  • strace -e trace=network -p <PID> — чтобы увидеть все сетевые системные вызовы (socket, connect, sendto).
  • tcpdump -i any -n host <IP> -w capture.pcap — для захвата сырого трафика с последующим анализом в Wireshark.

В продакшн-средах с контейнерами (Docker/K8s) я сначала нахожу PID процесса в неймспейсе хоста с помощью nsenter или docker inspect, а затем применяю эти же инструменты.