Вступ

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

Навіщо потрібно моніторити вихідні з’єднання?

Розуміння того, які вихідні з’єднання встановлює ваш сервер, є необхідним для:

  1. Безпеки (Security):
    1.1. Виявлення компрометації: Якщо з’єднання йде на невідомий IP-адресу чи порт, це може бути ознакою того, що сервер зламано і він намагається зв’язатися із зовнішнім командним центром (C2-сервером).
    1.2. Контроль політик: Перевірка, чи не намагається якесь ПЗ обійти налаштування фаєрволу.
  2. Діагностики та налагодження (Troubleshooting):
    2.1. Проблеми зі зв’язком: Визначення, чи успішно додаток може встановити з’єднання з базою даних, зовнішнім API або платіжним шлюзом.
    2.2. Повільна робота: Ідентифікація процесів, які створюють надмірне мережеве навантаження.
  3. Управління ресурсами:
    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 <ПОРТ>'.

Регулярне використання цих інструментів дозволить вам завжди мати повний контроль над мережевою активністю вашого сервера.

Від ittutorials