Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

Безопасный доступ к базе со своего компьютера

Подключиться к PostgreSQL, MySQL или Redis на сервере из DBeaver или IDE через SSH-туннель — не открывая порт базы в интернет.

Level
Intermediate
Reading time
3 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  1. SSH-туннель из терминала
  2. DBeaver, DataGrip и другие клиенты
  3. Постоянный туннель в ~/.ssh/config
  4. Если нужен прямой доступ
  5. Проверьте результат
  6. Частые ошибки

Открытый порт базы данных — постоянная мишень для перебора паролей и эксплойтов. Правильный способ работать с базой со своего компьютера — пробросить порт через SSH: база по-прежнему слушает только localhost на сервере, а трафик идёт внутри зашифрованного SSH-соединения.

SSH-туннель из терминала

На своём компьютере выполните (для PostgreSQL):

bash
$ ssh -N -L 15432:127.0.0.1:5432 deploy@203.0.113.10
  • -L 15432:127.0.0.1:5432 — локальный порт 15432 пробрасывается на 127.0.0.1:5432 сервера.
  • -N — не открывать оболочку, только держать туннель.
  • Для MySQL/MariaDB используйте 3306, для Redis — 6379.

Пока команда работает, подключайтесь к базе как к локальной:

bash
$ psql -h 127.0.0.1 -p 15432 -U app appdb$ # MariaDB: ssh -N -L 13306:127.0.0.1:3306 deploy@203.0.113.10$ mysql -h 127.0.0.1 -P 13306 -u app -p appdb

DBeaver, DataGrip и другие клиенты

Графические клиенты умеют поднимать туннель сами. В настройках подключения:

  1. 01На основной вкладке укажите хост 127.0.0.1, порт базы на сервере (5432 или 3306), имя базы, пользователя и пароль базы.
  2. 02На вкладке SSH включите туннель: хост 203.0.113.10, порт 22, пользователь сервера и ваш приватный ключ.
  3. 03Нажмите «Проверить соединение».

Постоянный туннель в ~/.ssh/config

~/.ssh/config
Host db-prod    HostName 203.0.113.10    User deploy    LocalForward 15432 127.0.0.1:5432    ServerAliveInterval 30
bash
$ ssh -N db-prod

Если нужен прямой доступ

Иногда туннель неудобен — например, для внешнего сервиса аналитики со статическим IP. Тогда разрешите подключение только с конкретного адреса, а не со всего интернета:

bash
$ ufw allow from 198.51.100.7 to any port 5432 proto tcp$ ufw status numbered

Дополнительно в PostgreSQL задайте listen_addresses = '*' и строку в pg_hba.conf только для этого адреса с методом scram-sha-256; в MariaDB — bind-address = 0.0.0.0 и пользователя с хостом '198.51.100.7'. Лучше ещё включить TLS на стороне СУБД.

Проверьте результат

С компьютера, где нет туннеля, порт базы должен быть закрыт. Проверьте с любого внешнего хоста:

bash
$ nc -zv -w 3 203.0.113.10 5432

Ожидаемый результат — timeout или connection refused.

Частые ошибки

  • «bind: Address already in use» — локальный порт занят. Возьмите другой, например 25432.
  • Туннель поднялся, но база отвечает «connection refused» — на сервере она слушает другой адрес или порт. Проверьте ss -tlnp на сервере.
  • Туннель обрывается при простое — добавьте ServerAliveInterval 30 в ~/.ssh/config.

Read to the end and the article counts toward your learning progress.

  • SSH-туннель
  • удалённый доступ
  • DBeaver
  • проброс порта
  • база данных

Was this article helpful?