Проверка открытых и прослушиваемых портов в Linux с использованием netstat и ss
Мониторинг открытых и прослушиваемых портов в системе Linux — одна из наиболее критических практик для поддержания безопасности сервера, диагностики проблем с сетью и эффективного управления инфраструктурой. Регулярно проверяя, какие порты открыты и какие сервисы привязаны к ним, вы можете заранее выявить попытки несанкционированного доступа, обнаружить неправильные конфигурации и устранить ненужные поверхности атак, прежде чем они станут серьезными уязвимостями.
Независимо от того, запускаете ли вы высоконагруженное приложение на плане VPS Hosting или управляете парком bare-metal машин, понимание сетевого охвата вашего Linux сервера является обязательным. Это руководство предоставляет комплексное и технически точное описание того, как использовать как netstat, так и ss — два наиболее широко используемых инструмента командной строки для проверки портов в Linux — вместе с дополнительными инструментами и лучшими практиками из реальной жизни.
Оглавление
- Понимание портов и их типов
- Проверка портов с помощью netstat
- Проверка портов с помощью ss
- Сравнение netstat и ss
- Другие инструменты для проверки открытых портов
- Лучшие практики безопасности для управления открытыми портами
- Заключение
1. Понимание портов и их типов {#understanding-ports}
Прежде чем переходить к самим инструментам, важно четко понимать, что такое порты, как они классифицируются и почему их мониторинг важен.
Что такое сетевой порт?
Сетевой порт — это логическая конечная точка связи, связанная с конкретным процессом или сервисом на хосте. Порты позволяют одному серверу с одним IP-адресом одновременно запускать несколько сетевых сервисов — например, веб-сервер на порту 80, демон SSH на порту 22 и базу данных на порту 3306.
Категории портов
| Диапазон | Категория | Описание |
|---|---|---|
| 0–1023 | Известные порты | Зарезервированы для стандартных системных сервисов (HTTP, SSH, FTP и т. д.) |
| 1024–49151 | Зарегистрированные порты | Используются приложениями и middleware (MySQL, PostgreSQL и т. д.) |
| 49152–65535 | Динамические/эфемерные порты | Временно назначаются для исходящих клиентских соединений |
Состояния портов, которые вы встретите
- LISTEN — порт открыт и сервис активно ожидает входящих соединений.
- ESTABLISHED — существует активное соединение между двумя конечными точками.
- TIME_WAIT — соединение закрывается; система ожидает, чтобы убедиться, что удаленная сторона получила финальное подтверждение.
- CLOSE_WAIT — удаленная сторона закрыла соединение; локальное приложение еще не закрыло свою сторону.
Транспортные протоколы
- TCP (Transmission Control Protocol): Ориентированный на соединение, надежный, с проверкой ошибок и гарантированной доставкой. Используется HTTP, HTTPS, SSH, FTP и большинством протоколов уровня приложений.
- UDP (User Datagram Protocol): Без соединения, быстрее, но без гарантий доставки. Используется DNS, NTP, DHCP и потоковыми сервисами.
2. Проверка портов с помощью netstat {#netstat}
Что такое netstat?
netstat (статистика сети) — это классическая утилита командной строки, которая отображает активные сетевые соединения, таблицы маршрутизации, статистику интерфейсов и прослушиваемые порты. Хотя она официально устарела в пользу ss на современных дистрибутивах Linux, netstat остается широко развернутой — особенно на устаревших системах и в окружениях, где администраторы хорошо знакомы с ее синтаксисом.
Установка netstat
netstat является частью пакета net-tools, который больше не устанавливается по умолчанию на многих современных дистрибутивах. Установите его следующим образом:
Debian / Ubuntu:
sudo apt update && sudo apt install net-tools -yCentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -yArch Linux:
sudo pacman -S net-toolsОсновной синтаксис netstat
sudo netstat [options]Проверка всех прослушиваемых TCP и UDP портов
sudo netstat -tulnРазбор флагов:
| Флаг | Значение |
|---|---|
-t | Отображать TCP соединения и порты |
-u | Отображать UDP соединения и порты |
-l | Показывать только прослушиваемые сокеты (порты, ожидающие соединений) |
-n | Отображать числовые IP-адреса и номера портов (пропустить разрешение DNS для скорости) |
Пример вывода:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*Чтение вывода:
- Proto — используемый протокол (tcp, udp, tcp6, udp6).
- Local Address — IP-адрес и номер порта, на котором прослушивается сервис.
0.0.0.0означает, что сервис прослушивает все доступные интерфейсы;127.0.0.1означает, что он доступен только локально. - Foreign Address — адрес удаленного клиента (показывается как
0.0.0.0:*для прослушиваемых портов без активного соединения). - State — состояние соединения (
LISTEN,ESTABLISHED,TIME_WAITи т. д.).
Включение информации о процессе
Чтобы увидеть, какой процесс владеет каждым прослушиваемым портом, добавьте флаг -p:
sudo netstat -tulnpПример вывода с информацией о процессе:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2847/nginx
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3102/mysqld> Примечание: Вы должны запустить эту команду с sudo, чтобы увидеть имена процессов для всех пользователей, а не только ваших.
Фильтрация вывода для конкретных портов или сервисов
Используйте grep для сужения результатов до конкретного порта или сервиса:
# Check if anything is listening on port 80
sudo netstat -tuln | grep ":80"
# Check for SSH (port 22)
sudo netstat -tuln | grep ":22"
# Check for MySQL (port 3306)
sudo netstat -tuln | grep ":3306"
# Check for HTTPS (port 443)
sudo netstat -tuln | grep ":443"Просмотр всех активных соединений (не только прослушиваемых)
Чтобы увидеть все активные соединения, включая установленные, удалите флаг -l:
sudo netstat -tunpОтображение таблицы маршрутизации
sudo netstat -rОтображение статистики сетевого интерфейса
sudo netstat -i3. Проверка портов с помощью ss {#ss}
Что такое ss?
ss (статистика сокетов) — это современная замена для netstat, разработанная как часть пакета iproute2. Она взаимодействует непосредственно с ядром Linux через сокеты Netlink, что делает ее значительно быстрее и эффективнее, чем netstat — особенно на системах с тысячами одновременных соединений.
ss установлена по умолчанию практически на всех современных дистрибутивах Linux, включая Ubuntu 18.04+, CentOS 7+, Debian 9+ и их производные.
Основной синтаксис ss
ss [options] [filter]Проверка всех прослушиваемых TCP и UDP портов
ss -tulnФлаги имеют идентичное значение netstat:
| Флаг | Значение |
|---|---|
-t | Показывать TCP сокеты |
-u | Показывать UDP сокеты |
-l | Показывать только прослушиваемые сокеты |
-n | Показывать числовые адреса (без разрешения DNS) |
Пример вывода:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 511 [::]:443 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*Включение информации о процессе
sudo ss -tulnpПример вывода:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1023,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2847,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3102,fd=21))Фильтрация по протоколу
Показывать только прослушиваемые TCP порты:
ss -tlПоказывать только прослушиваемые UDP порты:
ss -ulПоказывать все TCP соединения (включая установленные):
ss -tПродвинутая фильтрация с ss
Одна из самых мощных функций ss — это встроенная фильтрация на основе выражений, которая позволяет фильтровать по порту, адресу, состоянию и многому другому — без необходимости использования grep.
Фильтрация по конкретному номеру порта:
ss -tuln sport = :80
ss -tuln sport = :443
ss -tuln sport = :22Фильтрация по порту назначения:
ss -tuln dport = :3306Показывать все сокеты в состоянии ESTABLISHED:
ss -t state establishedПоказывать все сокеты в состоянии LISTEN:
ss -t state listeningФильтрация по IP-адресу источника:
ss -tuln src 192.168.1.100Показывать соединения с конкретным удаленным хостом:
ss -t dst 203.0.113.50Объединение нескольких фильтров:
ss -t state established '( dport = :443 or sport = :443 )'Отображение использования памяти сокетом
ss также может показывать подробное использование памяти на сокет, что полезно для диагностики проблем производительности:
ss -tmОтображение информации о таймерах
ss -toЭто показывает таймеры повторной передачи и таймеры keepalive для TCP соединений, что неоценимо для диагностики проблем со стабильностью соединения.
4. Сравнение netstat и ss {#comparison}
Оба инструмента достигают одной и той же фундаментальной цели, но есть значимые различия, которые должны направлять ваш выбор:
| Функция | netstat | ss |
|---|---|---|
| Пакет | net-tools (часто не предустановлен) | iproute2 (предустановлен на современных дистрибутивах) |
| Скорость | Медленнее (читает из /proc/net/) | Быстрее (использует интерфейс ядра Netlink) |
| Производительность в масштабе | Деградирует с тысячами соединений | Эффективно обрабатывает большое количество соединений |
| Продвинутая фильтрация | Требует передачи в grep | Встроенная фильтрация на основе выражений |
| Детальность вывода | Хорошо | Более детально (память, таймеры и т. д.) |
| Поддержка IPv6 | Адекватная | Отличная |
| Статус обслуживания | Устарела | Активно поддерживается |
| Кривая обучения | Знакома давним администраторам | Немного другой синтаксис, но хорошо документирована |
Когда использовать netstat
- При администрировании старых систем Linux (CentOS 6, Debian 7 и т. д.), где
ssможет быть недоступна. - При работе со скриптами или документацией, которые уже используют синтаксис
netstat. - Когда вы более комфортны с ее форматом вывода и не нуждаетесь в продвинутой фильтрации.
Когда использовать ss
- На любом современном дистрибутиве Linux (Ubuntu 18.04+, CentOS 7+, Debian 9+ и новее).
- При управлении серверами с высоким объемом одновременных соединений — такими как те, что работают на Dedicated Servers под большой нагрузкой.
- Когда вам нужна продвинутая фильтрация, информация о таймерах или статистика памяти сокета.
- Для автоматизации и скриптинга, где производительность имеет значение.
5. Другие инструменты для проверки открытых портов {#other-tools}
Помимо netstat и ss, несколько других утилит полезны для проверки портов и анализа сети в Linux.
lsof — List Open Files (Список открытых файлов, включая сокеты)
lsof (List Open Files) рассматривает сетевые сокеты как файлы (в соответствии с философией Linux «все является файлом») и может отобразить, какой процесс имеет открытый конкретный порт.
Установка lsof:
# Debian/Ubuntu
sudo apt install lsof -y
# CentOS/RHEL
sudo yum install lsof -yПроверка, какой процесс использует порт 80:
sudo lsof -i :80Проверка, какой процесс использует порт 443:
sudo lsof -i :443Список всех сетевых соединений:
sudo lsof -iСписок всех TCP прослушиваемых сокетов:
sudo lsof -i TCP -s TCP:LISTENПример вывода:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2847 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
nginx 2848 www-data 6u IPv4 23456 0t0 TCP *:http (LISTEN)nmap — Network Mapper
nmap — это мощный инструмент сканирования сети, используемый для аудита безопасности, обнаружения сети и сканирования портов. В отличие от ss и netstat (которые проверяют локальную систему), nmap может сканировать как локальные, так и удаленные хосты.
Установка nmap:
# Debian/Ubuntu
sudo apt install nmap -y
# CentOS/RHEL
sudo yum install nmap -yСканирование всех TCP портов на localhost:
sudo nmap -sT localhostСканирование открытых портов с определением ОС:
sudo nmap -sT -O localhostСканирование конкретного диапазона портов:
sudo nmap -p 1-1024 localhostСканирование UDP портов (требует root):
sudo nmap -sU localhostСканирование удаленного сервера:
sudo nmap -sT 203.0.113.50> Важно: Сканируйте только системы, которыми вы владеете, или системы, на которые у вас есть явное разрешение. Несанкционированное сканирование портов может нарушить законы и условия обслуживания.
fuser — Определение процессов, использующих файлы или сокеты
# Find which process is using port 80 (TCP)
sudo fuser 80/tcp
# Find which process is using port 53 (UDP)
sudo fuser 53/udp/proc/net/ — Прямой интерфейс ядра
Для целей скриптинга вы можете читать информацию о портах непосредственно из виртуальной файловой системы ядра Linux:
# View raw TCP socket table
cat /proc/net/tcp
# View raw UDP socket table
cat /proc/net/udpОбратите внимание, что адреса и порты в /proc/net/tcp отображаются в шестнадцатеричном формате и требуют преобразования для удобства чтения человеком. Инструменты, такие как ss и netstat, автоматически анализируют эти данные.
6. Лучшие практики безопасности для управления открытыми портами {#security}
Знание того, как проверять открытые порты — это только половина дела. Действие на основе этой информации — это то, что защищает ваш сервер. Вот практические лучшие практики, которые должен следовать каждый администратор Linux:
Принцип наименьшего раскрытия
Открывайте только те порты, которые абсолютно необходимы для функционирования вашего приложения. Каждый открытый порт — это потенциальный вектор атаки. Регулярно проверяйте ваши прослушиваемые порты и закрывайте или блокируйте брандмауэром все, что не нужно быть общедоступным.
Привязка сервисов к конкретным интерфейсам
Избегайте привязки сервисов к 0.0.0.0 (все интерфейсы), если это не требуется. Например, сервер базы данных MySQL должен пр
