Введение
По умолчанию MySQL/MariaDB на Ubuntu, установленный через HestiaCP, слушает только localhost (127.0.0.1). Такой режим безопасен, но мешает подключаться с других хостов — например, когда веб‑приложение находится на отдельном инстансе или разработчик должен работать с базы напрямую. Ниже пошагово показываем, как открыть порт 3306, создать ограниченного пользователя и не потерять безопасность сервера.
Что будем делать:
Разрешим MySQL слушать внешние IP.
Создадим юзера, привязанного к конкретному адресу/подсети.
Пропишем правило в UFW (или iptables) через HestiaCP.
Проверим соединение и дадим чек‑лист hardening.
Разрешаем MySQL слушать внешний интерфейс
vim /etc/mysql/mariadb.conf.d/50-server.cnf
Найдите директиву:
bind-address = 127.0.0.1
Варианты:
Заменить на конкретный внешний IP сервера — безопаснее.
Установить
0.0.0.0
или закомментировать строку — слушаем все интерфейсы.
Сохраняем, перезапускаем службу:
sudo systemctl restart mariadb
Проверяем:
ss -tunlp | grep 3306
Должно показывать LISTEN на нужном IP.
Создаём ограниченного пользователя
Не используйте
%
без необходимости — задавайте конкретный IP или CIDR!
sudo mysql -u root -p
-- for one IP
CREATE USER 'remote_app'@'203.0.113.42' IDENTIFIED BY 'Str0ngP@ss!';
GRANT ALL PRIVILEGES ON mydb.* TO 'remote_app'@'203.0.113.42';
-- for /24
CREATE USER 'netdev'@'192.168.10.%' IDENTIFIED BY 'NetPass2025!';
GRANT SELECT,INSERT,UPDATE,DELETE ON analytics.* TO 'netdev'@'192.168.10.%';
FLUSH PRIVILEGES;
EXIT;
Открываем порт 3306 в фаерволе
UFW (стандарт HestiaCP)
sudo ufw allow from 203.0.113.42 to any port 3306 proto tcp # only one IP
sudo ufw reload
Для подсети:
sudo ufw allow from 192.168.10.0/24 to any port 3306 proto tcp
iptables
iptables -A INPUT -p tcp -s 203.0.113.42 --dport 3306 -j ACCEPT
Открываем доступ только с данного IP 203.0.113.42
Если нужно открыть доступ всем IP (не безопасно):
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
Сохраним правила: sudo netfilter-persistent save
.
Интеграция с интерфейсом HestiaCP (опционально)
Чтобы управлять БД через панель, добавьте новый хост:
v-add-database-host mysql remote remote_app Str0ngP@ss! 203.0.113.42
После этого в веб‑GUI появится внешний сервер remote.
Проверка соединения
На рабочей станции:
mysql -h 203.0.113.5 -uremote_app -pStr0ngP@ss!
Если всё настроено верно, получите промпт MySQL.
Если порт был открыт для всех IP, то можно проверить из внешних онлайн тестеров:
Чек‑лист безопасности
MySQL слушает конкретный IP, а не | ☐ |
Пользователь ограничен по IP/подсети | ☐ |
Включён SSL между клиентом и сервером ( | ☐ |
Порт 3306 открыт выборочно, а не всему интернету | ☐ |
Пароль сложный, длина ≥ 12 символов | ☐ |
root‑логин по сети запрещён | ☐ |
Включён | ☐ |
Шифрование и аудит удалённых соединений
Включаем TLS
Ubuntu‑пакет MariaDB уже содержит self‑signed сертификаты /etc/mysql/ssl/
. Активируйте шифрование в конфиге:
[mysqld]
require_secure_transport = ON
ssl-ca = /etc/mysql/ssl/ca.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
Перезапустите службу и проверьте:
mysql -h 203.0.113.5 --ssl-mode=REQUIRED -u remote_app -p -e "\s" | grep SSL
Для кастомных сертификатов используйте openssl
или cfssl
и выпускайте ключи на 4096 бит.
Ограничиваем ресурсы пользователя
ALTER USER 'remote_app'@'203.0.113.42' WITH
MAX_USER_CONNECTIONS 5
MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 200;
Так единичный утечённый пароль не выведет сервер из строя.
Включаем аудит
Простой вариант — general log только для удалённых IP:
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/remote.log
log_output = FILE
Логи можно анализировать fail2ban‑фильтром, блокируя IP после 10 неудачных попыток.
Авто‑ротация журналов
Добавьте правило в /etc/logrotate.d/mysql-remote
с хранением 14 дней для предотвращения переполнения диска.
Заключение
Открыть MySQL наружу — задача двух команд, но безопасно открыть — целый чек‑лист. Настройка bind-address
, IP‑фильтрация на уровне UFW/iptables и минимальные привилегии пользователя защищают базу от сканеров и брутфорса. Проверяйте логи /var/log/mysql/error.log
, используйте mysqltuner
, обновляйте пароли — и ваш удалённый доступ будет таким же надёжным, как локальный.
Лучшее правило: «Разрешай столько, сколько нужно, и не на минуту дольше». По окончании тестов закрывайте порт — это займет меньше времени, чем восстановление после взлома