Вступ
Для будь-якого системного адміністратора або власника веб-сервера моніторинг мережевих з’єднань є критично важливим завданням. Знання того, куди саме ваш Linux-сервер “стукає”, допомагає швидко діагностувати проблеми, виявляти спроби несанкціонованого доступу (бекдори, шкідливе ПЗ) або просто контролювати роботу додатків.
У цьому посібнику ми розглянемо ключові інструменти Linux (ss
, netstat
, tcpdump
) та методи, які дозволяють чітко побачити, які вихідні з’єднання відкриває ваш сервер, до яких віддалених портів він звертається, і який саме процес це ініціює.

Навіщо потрібно моніторити вихідні з’єднання?
Розуміння того, які вихідні з’єднання встановлює ваш сервер, є необхідним для:
- Безпеки (Security):
1.1. Виявлення компрометації: Якщо з’єднання йде на невідомий IP-адресу чи порт, це може бути ознакою того, що сервер зламано і він намагається зв’язатися із зовнішнім командним центром (C2-сервером).
1.2. Контроль політик: Перевірка, чи не намагається якесь ПЗ обійти налаштування фаєрволу. - Діагностики та налагодження (Troubleshooting):
2.1. Проблеми зі зв’язком: Визначення, чи успішно додаток може встановити з’єднання з базою даних, зовнішнім API або платіжним шлюзом.
2.2. Повільна робота: Ідентифікація процесів, які створюють надмірне мережеве навантаження. - Управління ресурсами:
3.1 Визначення, які додатки споживають найбільше мережевого трафіку.

Ключові інструменти Linux
Для перевірки активних мережевих з’єднань використовують два основні консольні інструменти: ss
(Socket Statistics) і netstat
.
Використання команди ss
Команда ss
є наступником netstat
і працює швидше, особливо на серверах з великою кількістю з’єднань.
Ви можете відфільтрувати встановлені TCP-з’єднання, де віддалений порт (destination port, dport
) відповідає потрібному вам.
Синтаксис:
ss -tna | grep ":<ВІДДАЛЕНИЙ_ПОРТ>"
Або, якщо ви впевнені, що це саме вихідне з’єднання (не є портом, який слухається на вашому сервері):
ss -tn state established dport = :<ВІДДАЛЕНИЙ_ПОРТ>
Пояснення опцій:
-t
або--tcp
: Показує тільки TCP-з’єднання.-n
або--numeric
: Показує числові адреси та номери портів (без спроб визначення імен хостів та сервісів).-a
або--all
: Показує всі сокети (як слухаючі, так і встановлені).state established
: Фільтрує лише встановлені з’єднання.dport = :<ВІДДАЛЕНИЙ_ПОРТ>
: Фільтр за портом призначення (віддаленим портом).
Приклад (якщо віддалений порт 443):
ss -tna | grep ":443"
Вивід буде виглядати приблизно так:
ESTAB 0 0 192.168.1.10:57310 35.157.63.229:443
У цьому прикладі:
192.168.1.10:57310
— Ваша локальна адреса та порт.35.157.63.229:443
— Віддалена адреса та порт, куди йде з’єднання.
Щоб побачити процес (PID та назву) – використовуйте опцію -p
(потрібні права root/sudo):
sudo ss -tpan | grep ":<ВІДДАЛЕНИЙ_ПОРТ>"
Використання команди netstat
(застаріла, але поширена)
Хоча netstat
вважається застарілою, вона все ще працює на більшості систем.
Синтаксис:
netstat -tna | grep ":<ВІДДАЛЕНИЙ_ПОРТ>"
Пояснення опцій:
-t
: Показує TCP-з’єднання.-n
: Числовий вивід (IP-адреси та порти).-a
: Показує всі з’єднання (Established, Listen тощо).
Приклад (якщо віддалений порт 8080):
netstat -tna | grep ":8080"
Вивід буде виглядати приблизно так:
tcp 0 0 10.0.0.5:54321 203.0.113.2:8080 ESTABLISHED
Щоб побачити процес (PID та назву) – використовуйте опцію -p
(потрібні права root/sudo):
sudo netstat -tpan | grep ":<ВІДДАЛЕНИЙ_ПОРТ>"
Використання tcpdump
Ця команда буде перехоплювати лише пакети, що йдуть з вашого сервера (src host <ВАШ_IP>
), і спрямовані на певний віддалений порт (dst port <ПОРТ>
).
sudo tcpdump -n -i <ІНТЕРФЕЙС> 'src host <ВАШ_IP> and dst port <ВІДДАЛЕНИЙ_ПОРТ>'
Пояснення опцій:
-n
: Не перетворювати IP-адреси на імена хостів і номери портів на імена сервісів. Це робить вивід швидшим і чистішим.-i <ІНТЕРФЕЙС>
: Вказує мережевий інтерфейс, який потрібно моніторити (наприклад,eth0
,ens18
,wlan0
). Якщо не вказати,tcpdump
вибере перший доступний'src host <ВАШ_IP> and dst port <ВІДДАЛЕНИЙ_ПОРТ>'
: Це фільтр захоплення (capture filter):
–src host <ВАШ_IP>
: Трафік, що виходить з вашого IP-адреси (тобто вихідне з’єднання).
–dst port <ВІДДАЛЕНИЙ_ПОРТ>
: Трафік, що прямує до вказаного порту призначення (наприклад,443
або8080
).
Якщо ви хочете подивитися трафік, що виходить з усіх мережевих інтерфейсів і не хочете фільтрувати за своєю IP-адресою (тобто не вказувати її), ви можете зробити це, використовуючи tcpdump
і фільтруючи лише за портом призначення (віддаленим портом):
sudo tcpdump -n -i any 'dst port <ВІДДАЛЕНИЙ_ПОРТ>'
Вивід буде виглядати приблизно так:
16:20:15.123456 IP 192.168.1.10.51234 > 203.0.113.5.22: Flags [S], seq 12345, win 29200, length 0
де:
192.168.1.10.51234
: Ваш сервер (IP та локальний вихідний порт).203.0.113.5.22
: Віддалений сервер (IP та порт 22, який ви шукаєте).
Важливо: Оскільки ви відфільтрували лише за dst port
, ви побачите всі пакети, що йдуть на цей порт, включно з трафіком, який, можливо, не ініційований вашим сервером (хоча в більшості випадків, це буде вихідний трафік). Якщо ви бачите пакет з прапорцем [S]
(SYN), це означає, що ваш сервер ініціює це з’єднання.
Перевага tcpdump
: Ви бачите, що відбувається, навіть якщо з’єднання не встановлюється (наприклад, віддалена сторона не відповідає).
Недолік tcpdump
: Він не показує, який саме процес ініціював цей пакет. Для цього потрібен ss -p
Висновок
Ефективний моніторинг вихідних з’єднань на Linux-сервері є основою кібербезпеки та надійності системи.
- Для швидкого визначення процесу (PID) та адреси використовуйте команду
sudo ss -tpan
з фільтрацією за потрібним віддаленим портом. - Для діагностики проблем із встановленням з’єднання та перевірки мережевої активності на рівні пакетів використовуйте
sudo tcpdump -i any 'dst port <ПОРТ>'
.
Регулярне використання цих інструментів дозволить вам завжди мати повний контроль над мережевою активністю вашого сервера.