Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

Linux / DevOps

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

Полезные материалы
Рекомендуем