Открытый порт базы данных — постоянная мишень для перебора паролей и эксплойтов. Правильный способ работать с базой со своего компьютера — пробросить порт через SSH: база по-прежнему слушает только localhost на сервере, а трафик идёт внутри зашифрованного SSH-соединения.
SSH-туннель из терминала
На своём компьютере выполните (для PostgreSQL):
$ ssh -N -L 15432:127.0.0.1:5432 [email protected]- -L 15432:127.0.0.1:5432 — локальный порт 15432 пробрасывается на 127.0.0.1:5432 сервера.
- -N — не открывать оболочку, только держать туннель.
- Для MySQL/MariaDB используйте 3306, для Redis — 6379.
Пока команда работает, подключайтесь к базе как к локальной:
$ psql -h 127.0.0.1 -p 15432 -U app appdb$ # MariaDB: ssh -N -L 13306:127.0.0.1:3306 [email protected]$ mysql -h 127.0.0.1 -P 13306 -u app -p appdbDBeaver, DataGrip и другие клиенты
Графические клиенты умеют поднимать туннель сами. В настройках подключения:
- 01На основной вкладке укажите хост 127.0.0.1, порт базы на сервере (5432 или 3306), имя базы, пользователя и пароль базы.
- 02На вкладке SSH включите туннель: хост 203.0.113.10, порт 22, пользователь сервера и ваш приватный ключ.
- 03Нажмите «Проверить соединение».
Постоянный туннель в ~/.ssh/config
Host db-prod HostName 203.0.113.10 User deploy LocalForward 15432 127.0.0.1:5432 ServerAliveInterval 30$ ssh -N db-prodЕсли нужен прямой доступ
Иногда туннель неудобен — например, для внешнего сервиса аналитики со статическим IP. Тогда разрешите подключение только с конкретного адреса, а не со всего интернета:
$ 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 на стороне СУБД.
Проверьте результат
С компьютера, где нет туннеля, порт базы должен быть закрыт. Проверьте с любого внешнего хоста:
$ 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.