Ответ
Для инвентаризации открытых портов и диагностики сетевых проблем я использую несколько инструментов, в зависимости от задачи.
1. ss (Socket Statistics) — основной современный инструмент:
ss — прямая замена устаревшему netstat, работает быстрее и показывает больше информации из ядра.
# Показать все слушающие TCP-порты с процессами
ss -tlnp
# Показать все слушающие UDP-порты
ss -ulnp
# Показать все установленные соединения
ss -tnp
# Показать соединения к конкретному порту (например, 443)
ss -tnp sport = :443
# Расшифровка флагов:
# -t / -u : TCP / UDP
# -l : только слушающие сокеты (LISTEN)
# -n : не резолвить имена (показывать IP и порты)
# -p : показать процесс, владеющий сокетом
2. netstat — устаревший, но знакомый всем инструмент:
netstat -tulnp
3. lsof — для глубокого анализа процессов:
Полезен, когда нужно узнать, какой конкретный процесс открыл файл или сетевой порт.
# Показать все процессы, слушающие сетевые порты
lsof -i
# Показать процессы, использующие конкретный порт (например, 80)
lsof -i :80
# Показать TCP-порты в состоянии LISTEN
lsof -i TCP -s TCP:LISTEN
4. Проверка доступности порта извне:
Иногда нужно убедиться, что порт не только открыт, но и доступен через firewall.
# Использование netcat (nc)
nc -zv 192.168.1.10 22 # Проверить SSH порт
# Использование telnet
telnet 192.168.1.10 80
# Использование nmap (для сканирования диапазона)
nmap -sT -p 22,80,443 192.168.1.10
Практический пример диагностики: Допустим, веб-сервер не отвечает на порту 8080.
# 1. Проверяем, слушает ли какой-то процесс порт 8080
ss -tlnp | grep :8080
# 2. Если процесс есть, проверяем его конфигурацию и логи
sudo lsof -p <PID> | grep LISTEN
# 3. Проверяем firewall
sudo iptables -L -n -v | grep 8080 # или `sudo firewall-cmd --list-all`
# 4. Проверяем доступность с локального интерфейса
curl -I http://localhost:8080/health