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