Як прив'язати сервіси до 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. Замініть їх на свої фактичні адреси.
Якщо ви бачите лише одну адресу, на сервері ще не налаштовано кілька 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
Якщо команда нічого не виводить, конфігурація коректна.
Перед перезапуском SSH переконайтеся, що вказана IP правильна й доступна. Якщо прив’язати SSH до неправильної IP, ви втратите доступ до сервера. Тримайте відкритою другу сесію SSH як страховку або скористайтеся консольним доступом провайдера.
Перезапустіть службу:
sudo systemctl restart sshd
У деяких системах служба може називатися 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 на клієнта/сайт).
У 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
Точний шлях до конфігураційного файлу залежить від системи. Якщо наведеного вище файлу немає, знайдіть секцію [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))
Якщо ви змінюєте 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
Власник: Команда технічної документації