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Зареєстровані портиВикористовуються програмами та проміжним ПО (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:

Принцип найменшої експозиції

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати