EUR
european

EUR

usa

USD

Russian Ru
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