Как привязать службы к 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
Владелец: Команда технической документации