15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
30.10.2024

Проверка открытых и прослушиваемых портов в Linux с использованием netstat и ss

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

Независимо от того, запускаете ли вы высоконагруженное приложение на плане VPS Hosting или управляете парком bare-metal машин, понимание сетевого охвата вашего Linux сервера является обязательным. Это руководство предоставляет комплексное и технически точное описание того, как использовать как netstat, так и ss — два наиболее широко используемых инструмента командной строки для проверки портов в Linux — вместе с дополнительными инструментами и лучшими практиками из реальной жизни.

Оглавление

  1. Понимание портов и их типов
  2. Проверка портов с помощью netstat
  3. Проверка портов с помощью ss
  4. Сравнение netstat и ss
  5. Другие инструменты для проверки открытых портов
  6. Лучшие практики безопасности для управления открытыми портами
  7. Заключение

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 -y

CentOS / RHEL / AlmaLinux / Rocky Linux:

sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -y

Arch 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 -i

3. Проверка портов с помощью 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}

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

Функцияnetstatss
Пакет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 должен пр

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать