Прив'язка служб до конкретної IP-адреси на сервері з кількома IP | INTROSERV
EUR
european

EUR

usa

USD

Ukraine Ua
Ex. VAT Ex. VAT 0%

Як прив'язати сервіси до IP-адреси на сервері з кількома IP

Рівень: Середній
Орієнтовний час: ~25 хвилин
Мета: Налаштувати SSH, Nginx, Apache та MySQL/MariaDB так, щоб вони слухали лише конкретну IP-адресу, а не всі інтерфейси на сервері з кількома IP.

Вступ

Коли сервер має кілька IP-адрес, більшість служб за замовчуванням слухають усі адреси. Часто це небажано: база даних не повинна бути доступною з публічної IP, а вебсервер одного клієнта не має відповідати на адресі іншого клієнта. Прив’язування служб до конкретних IP дає кращий контроль доступу та зменшує площу атаки. У цьому посібнику ми налаштуємо кілька поширених служб – SSH, Nginx, Apache, MySQL/MariaDB – так, щоб вони слухали лише вибрану IP.

Уся «магія» відбувається в конфігураційних файлах цих сервісів: ви змінюєте директиву (наприклад, Listen, listen або bind-address), потім робите reload/restart і перевіряєте, яка IP/порт реально «слухає».

Передумови

Перш ніж почати, переконайтеся, що виконано такі умови:

  • Операційна система: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 або CentOS/RHEL 8/9
  • Доступ: sudo або root-доступ до сервера
  • Мережа: на сервері налаштовано щонайменше дві IP-адреси (перевірте у Кроці 1)
  • Потрібні знання: впевнена робота з командним рядком Linux та базове редагування текстових файлів

Крок 1: Визначте свої IP-адреси

Перевірте, які IP-адреси призначено серверу:

ip -4 addr show

Очікуваний вивід (приклад):

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... inet 203.0.113.10/24 brd 203.0.113.255 scope global eth0 inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0:1

Упродовж цього посібника ми використовуватимемо 203.0.113.10 як публічну IP та 198.51.100.5 як другу IP. Замініть їх на свої фактичні адреси.

Info

Якщо ви бачите лише одну адресу, на сервері ще не налаштовано кілька IP. Зверніться до провайдера або додайте адресу вручну, перш ніж продовжити (наприклад, через netplan в Ubuntu або nmcli у системах на базі NetworkManager).

Крок 2: Прив’яжіть SSH до конкретної IP

За замовчуванням SSH слухає 0.0.0.0 (усі IPv4-інтерфейси) і зазвичай також :: (усі IPv6-інтерфейси). Щоб обмежити його однією IP:

Зробіть резервну копію конфігурації:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

Відкрийте файл конфігурації SSH:

sudo nano /etc/ssh/sshd_config

Примітка про IPv6: якщо потрібно прив’язати SSH і до конкретної IPv6-адреси, додайте другий рядок, наприклад ListenAddress 2001:db8::10. Якщо IPv6 на сервері не використовується, можна примусово увімкнути лише IPv4, задавши AddressFamily inet у sshd_config.

Знайдіть директиву ListenAddress і задайте її так:

ListenAddress 203.0.113.10

Якщо ListenAddress закоментовано або відсутній, додайте рядок у будь-якому місці файлу.

Перевірте конфігурацію:

sudo sshd -t

Якщо команда нічого не виводить, конфігурація коректна.

Warning

Перед перезапуском SSH переконайтеся, що вказана IP правильна й доступна. Якщо прив’язати SSH до неправильної IP, ви втратите доступ до сервера. Тримайте відкритою другу сесію SSH як страховку або скористайтеся консольним доступом провайдера.

Перезапустіть службу:

sudo systemctl restart sshd

Info

У деяких системах служба може називатися ssh, а не sshd.

Переконайтеся, що SSH тепер слухає лише вказану IP:

sudo ss -tlnp | grep sshd

Очікуваний вивід:

LISTEN 0 128 203.0.113.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))

Якщо ви бачите 0.0.0.0:22 – зміни не застосувалися. Перевірте конфігурацію на помилки або конфліктні рядки ListenAddress.

Крок 3: Прив’яжіть Nginx до конкретної IP

Директива listen визначає, яку IP та порт використовує Nginx.

Зробіть резервну копію конфігурації:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup

Відкрийте конфігурацію сайту:

sudo nano /etc/nginx/sites-available/default

Примітка: якщо у вас кілька конфігів/сайтів (кілька файлів у /etc/nginx/sites-available/ та /etc/nginx/sites-enabled/ або кілька *.conf у /etc/nginx/conf.d/), явну IP потрібно вказувати в кожній потрібній директиві listen. Також можна призначити окрему IP для кожного сайту (одна IP на клієнта/сайт).

Info

У CentOS/RHEL типовий шлях до конфігурації – /etc/nginx/conf.d/default.conf. Синтаксис той самий.

Змініть директиву listen з:

listen 80; listen [::]:80;

На:

listen 203.0.113.10:80;

Примітка про IPv6: якщо залишити listen [::]:80; (або подібний рядок) увімкненим, Nginx продовжить слухати на всіх IPv6-адресах. Якщо IPv6 не використовується — приберіть/закоментуйте IPv6-рядки listen; якщо використовується — явно прив’яжіть і потрібну IPv6-адресу.

Якщо ви також використовуєте HTTPS:

listen 203.0.113.10:443 ssl;

Перевірте конфігурацію та перезавантажте службу:

sudo nginx -t sudo systemctl reload nginx

Перевірте:

sudo ss -tlnp | grep nginx

Очікуваний вивід:

LISTEN 0 511 203.0.113.10:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))

Крок 4: Прив’яжіть Apache до конкретної IP

Apache використовує директиву Listen у головному конфігураційному файлі.

Debian/Ubuntu:

sudo cp /etc/apache2/ports.conf /etc/apache2/ports.conf.backup sudo nano /etc/apache2/ports.conf

CentOS/RHEL:

sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup sudo nano /etc/httpd/conf/httpd.conf

Змініть:

Listen 80

На:

Listen 203.0.113.10:80

Для HTTPS:

Listen 203.0.113.10:443

Також оновіть усі блоки <VirtualHost *:80>, щоб вони використовували IP:

<VirtualHost 203.0.113.10:80>

Залежно від дистрибутива, ці блоки зазвичай знаходяться у:

  • Debian/Ubuntu: /etc/apache2/sites-available/ та /etc/apache2/sites-enabled/ (інколи також включені файли з /etc/apache2/conf-available/ / conf-enabled/)
  • CentOS/RHEL: /etc/httpd/conf.d/ та файли, які підключаються з /etc/httpd/conf/httpd.conf

Якщо не впевнені, виконайте пошук: sudo grep -R "<VirtualHost" -n /etc/apache2 /etc/httpd 2>/dev/null

Перевірте конфігурацію та перезавантажте:

Debian/Ubuntu:

sudo apachectl configtest sudo systemctl reload apache2

CentOS/RHEL:

sudo apachectl configtest sudo systemctl reload httpd

Перевірте:

sudo ss -tlnp | grep -E 'apache|httpd'

Крок 5: Прив’яжіть MySQL/MariaDB до конкретної IP

За замовчуванням MySQL/MariaDB часто слухає 127.0.0.1 (лише localhost), але це може відрізнятися залежно від дистрибутива/пакета та попередніх налаштувань безпеки. Перед змінами перевірте, що реально «слухає» зараз:

sudo ss -tlnp | grep 3306

Debian/Ubuntu:

# MySQL (часто на Debian/Ubuntu) sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf # MariaDB (часто в Ubuntu після встановлення mariadb-server) sudo cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.backup sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

CentOS/RHEL (MariaDB):

sudo cp /etc/my.cnf.d/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf.backup sudo nano /etc/my.cnf.d/mariadb-server.cnf

Info

Точний шлях до конфігураційного файлу залежить від системи. Якщо наведеного вище файлу немає, знайдіть секцію [mysqld] у /etc/my.cnf або /etc/mysql/my.cnf.

Знайдіть рядок bind-address і змініть його:

bind-address = 198.51.100.5

Перезапустіть службу:

# Debian/Ubuntu sudo systemctl restart mysql # або (якщо MariaDB) sudo systemctl restart mariadb # CentOS/RHEL sudo systemctl restart mysqld # або (якщо MariaDB) sudo systemctl restart mariadb

Перевірте:

sudo ss -tlnp | grep 3306

Очікуваний вивід:

LISTEN 0 80 198.51.100.5:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))

Warning

Якщо ви змінюєте bind-address з 127.0.0.1 на маршрутизовану IP, переконайтеся, що є правило брандмауера, яке дозволяє підключення лише з довірених джерел. Ніколи не відкривайте порт бази даних у публічний інтернет без захисту.

Перевірка

Після налаштування всіх служб виконайте підсумкову перевірку:

sudo ss -tlnp

Переконайтеся, що кожна служба показує потрібну IP – не 0.0.0.0 або *.

Також можна перевірити з іншого комп’ютера:

ssh [email protected] # має працювати ssh [email protected] # має бути відхилено, якщо SSH прив’язано до іншої IP

Відкат

Щоб відкотити будь-яку зміну, відновіть резервну копію конфігурації та перезапустіть службу.

Для SSH:

sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd

Для будь-якої іншої служби – скасуйте зміну listen / bind-address у відповідному конфігураційному файлі та перезапустіть службу. Початкове значення майже завжди 0.0.0.0, * або 127.0.0.1.

Висновок

Ось і все. Кожну службу можна обмежити, змінивши одну директиву, перезапустивши її та перевіривши результат командою ss -tlnp.

Версія документа: 1.0
Останнє оновлення: Квітень 2026
Власник: Команда технічної документації

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA