Как посмотреть, какие сетевые соединения открыты у процесса в Linux

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

Ответ

Для инспекции сетевых соединений процесса я чаще всего использую ss (более современная замена netstat) и lsof. Это помогает при диагностике утечек соединений, поиске неожиданных listener'ов или проверке доступности сервиса.

1. Использование ss (socket statistics) ss быстрее netstat и показывает больше деталей.

# Показать все TCP/UDP сокеты с именами процессов и портов
sudo ss -tulnp
# Фильтрация по конкретному PID (например, 12345)
sudo ss -tulnp | grep "pid=12345"
# Показать только установленные TCP-соединения для процесса
sudo ss -tnp state established | grep "pid=12345"

2. Использование lsof (list open files) Поскольку сетевые сокеты — это тоже файловые дескрипторы, lsof отлично подходит.

# Все сетевые соединения процесса
sudo lsof -i -a -p <PID>
# Конкретный тип соединений (например, TCP на порту 80)
sudo lsof -i TCP:80 -a -p <PID>
# Показать процессы, слушающие порты
sudo lsof -i -s TCP:LISTEN

3. Прямой просмотр через /proc Можно посмотреть дескрипторы сокетов напрямую.

# Список всех файловых дескрипторов, которые являются сокетами
ls -la /proc/<PID>/fd/ | grep socket:
# Куда ведёт конкретный дескриптор (например, 15)
readlink /proc/<PID>/fd/15

Практический пример: Допустим, Nginx не отвечает. Я нахожу его PID (pgrep nginx или systemctl status nginx), затем выполняю sudo ss -tulnp | grep nginx, чтобы убедиться, что он слушает ожидаемые порты (80, 443) и нет ли тысяч «висящих» соединений в состоянии CLOSE_WAIT.