SSH-туннель к MySQL: безопасный доступ к базе без открытия порта 3306
Почему открывать порт 3306 наружу — фатальная ошибка
База данных MySQL/MariaDB по умолчанию слушает порт 3306 TCP. Если открыть этот порт в файрволе для всего интернета (0.0.0.0/0), ботнеты со всего мира начинают непрерывный подбор паролей (брутфорс). Любая найденная уязвимость в версии СУБД приведет к мгновенной краже всех персональных данных компании. SSH-туннелирование (Local Port Forwarding) позволяет безопасно подключаться к базе через шифрованный канал SSH, оставив порт 3306 закрытым внутри сервера.
Как работает SSH-туннель на пальцах
Ваш рабочий компьютер создает локальный порт (например, 3307), подключается к серверу по защищенному порту SSH (22) и «пробрасывает» трафик напрямую к внутренней петле сервера 127.0.0.1:3306. Для СУБД это выглядит так, будто запрос пришел локально с самого сервера.
Пошаговая настройка безопасного подключения к СУБД
Способ 1: Создание туннеля через консоль (Linux, macOS, Windows PowerShell)
Выполните команду на своем локальном рабочем компьютере:
ssh -N -L 3307:127.0.0.1:3306 ubuntu@IP_адрес_сервераРазбор параметров команды:
-N— не открывать консоль сервера (только удерживать туннель перенаправления трафика).-L— локальный проброс портов (Local Forwarding).3307— порт на вашем локальном компьютере (можно указать любой свободный).127.0.0.1:3306— внутренний адрес и порт MySQL на целевом сервере.
(Если SSH сервера работает на нестандартном порту, добавьте флаг: -p 2222).
Способ 2: Подключение через графический клиент (DBeaver / DataGrip / HeidiSQL)
В современных графических клиентах баз данных туннель поднимается автоматически встроенными средствами:
- В настройках подключения (Connection Settings) укажите Host:
127.0.0.1, Port:3306, ваш логин и пароль к MySQL. - Перейдите во вкладку SSH (или Network / SSH Tunnel).
- Включите галочку «Использовать SSH-туннель» (Use SSH Tunnel).
- Укажите Host SSH-сервера, логин системного пользователя и выберите ваш приватный ключ SSH (
id_ed25519). - Нажмите «Тест подключения» (Test Connection).
Шаг 3: Проверка привязки MySQL на сервере
Убедитесь, что сам сервер MySQL слушает только локальные подключения. В файле /etc/mysql/mysql.conf.d/mysqld.cnf директива bind-address должна иметь значение:
bind-address = 127.0.0.1Типовые ошибки администраторов
- Отказ в доступе пользователю MySQL (Access denied for user 'root'@'localhost'): По умолчанию пользователю root может быть запрещен вход с паролем через сторонние клиенты. Создайте отдельного пользователя базы данных для администрирования с правами на нужные таблицы.
- Закрытие окна терминала с туннелем: Консольная команда туннеля работает, пока открыт терминал. Для запуска туннеля в фоновом режиме добавьте флаг
-f:ssh -f -N -L 3307:127.0.0.1:3306 user@ip.
ITSTM настроит безопасные VPN-шлюзы (WireGuard / OpenVPN), интеграцию с корпоративным каталогом Active Directory и двухфакторную аутентификацию для доступа к данным.
Частые вопросы (FAQ)
Можно ли пробросить порт для PostgreSQL аналогичным способом?
Да, синтаксис абсолютно идентичен, только вместо порта 3306 укажите стандартный порт PostgreSQL: ssh -N -L 5433:127.0.0.1:5432 user@server_ip.
Как закрыть фоновый SSH туннель, запущенный с флагом -f?
Найдите процесс с помощью pgrep: pgrep -a ssh | grep 3307, затем завершите его командой kill PID.
Почему в DBeaver тест SSH проходит, а к базе подключиться не удается?
Проверьте учетные данные самой СУБД (логин/пароль к MySQL), а также права пользователя MySQL на доступ к базе данных с хоста 'localhost' или '127.0.0.1'.
В чем разница между Local (-L) и Remote (-R) SSH Forwarding?
Local (-L) открывает порт на вашем ПК и перенаправляет трафик на удаленный сервер. Remote (-R) наоборот: открывает порт на удаленном сервере и перенаправляет трафик на ваш локальный рабочий компьютер.