Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

SSH-туннель к MySQL: безопасный доступ к базе без открытия порта 3306

Обновлено: 27.08.2026  ·  Официальная база знаний

Почему открывать порт 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)

В современных графических клиентах баз данных туннель поднимается автоматически встроенными средствами:

  1. В настройках подключения (Connection Settings) укажите Host: 127.0.0.1, Port: 3306, ваш логин и пароль к MySQL.
  2. Перейдите во вкладку SSH (или Network / SSH Tunnel).
  3. Включите галочку «Использовать SSH-туннель» (Use SSH Tunnel).
  4. Укажите Host SSH-сервера, логин системного пользователя и выберите ваш приватный ключ SSH (id_ed25519).
  5. Нажмите «Тест подключения» (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 и двухфакторную аутентификацию для доступа к данным.
Практический опыт инженера: Никогда не меняйте 'bind-address = 0.0.0.0' в конфигурации MySQL ради удобства удаленной разработки. Всегда используйте SSH-туннели по ключам — это на 100% исключает вероятность утечки базы через уязвимости нулевого дня в СУБД.

Частые вопросы (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) наоборот: открывает порт на удаленном сервере и перенаправляет трафик на ваш локальный рабочий компьютер.