We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Организация безопасного удалённого доступа к PostgreSQL через SSH‑туннелирование и pgBouncer в Termux

В реальных проектах часто требуется обеспечить безопасный удалённый доступ к PostgreSQL: без открытия базы в интернет, с контролем соединений и устойчивостью к пиковым нагрузкам. Надёжный подход — сочетать SSH‑туннелирование и pgBouncer, а управлять всем этим можно удобно из Termux. В этой статье разберём архитектуру, шаги настройки и базовые правила безопасности.

Материал ориентирован на легитимные сценарии администрирования и эксплуатации своих систем/разрешённых контуров доступа. Не рассматриваются способы обхода ограничений или несанкционированного доступа.

Целевая архитектура

Идея следующая:

  • SSH‑туннель обеспечивает защищённый канал между устройством с Termux и сервером.
  • pgBouncer принимает клиентские подключения и переиспользует/управляет соединениями к PostgreSQL.
  • Termux выступает как клиент, а приложения получают доступ к PostgreSQL через локальный порт, который транслируется SSH‑туннелем.

В типичном варианте pgBouncer размещается на сервере (или в той же сети, где доступен PostgreSQL), чтобы минимизировать количество открываемых портов и упростить контроль.

Требования и предпосылки

  • Удалённый сервер с Linux, где установлены OpenSSH Server, PostgreSQL и pgBouncer.
  • Учётная запись для SSH с правами, достаточными для запуска/доступа к pgBouncer.
  • На клиентском устройстве Android установлен Termux.
  • Доступ к конфигурационным файлам pgBouncer (для настройки адресов, режимов и авторизации).

Рекомендуется использовать аутентификацию по ключам SSH и хранить приватный ключ на устройстве пользователя.

Установка и подготовка Termux

На устройстве Android в Termux установите необходимые пакеты. Обычно достаточно OpenSSH-клиента и инструментария для работы с сетью.

pkg update
pkg install openssh-client tsu

Дальше выполните подготовку подключения: добавьте SSH‑ключ на сервер и проверьте корректность логина.

Безопасный SSH‑доступ: ключи и базовая проверка

На сервере должен быть настроен sshd с поддержкой ключей. Если вы ещё не добавляли ключ:

  • Сгенерируйте ключ в Termux (если нужно).
  • Добавьте публичный ключ в ~/.ssh/authorized_keys пользователя на сервере.
  • Проверьте доступ по SSH с Termux.

Пример локальной генерации ключа (при необходимости):

ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519

В Termux публичный ключ обычно доступен как ~/.ssh/id_ed25519.pub. Его нужно добавить в authorized_keys на сервере.

Проверка подключения (замените параметры):

ssh -i ~/.ssh/id_ed25519 user@server.example.com

После успешной проверки можно переходить к туннелированию.

Настройка pgBouncer на сервере

pgBouncer — это промежуточный слой между клиентами и PostgreSQL. Он помогает управлять количеством соединений, снижает нагрузку на PostgreSQL при всплесках и ускоряет установление сеансов.

Порядок действий зависит от дистрибутива, но концепция едина:

  • указать, где pgBouncer слушает соединения;
  • настроить параметры подключения к PostgreSQL;
  • настроить пуллинг и ограничения;
  • проверить авторизацию.

В конфигурации pgBouncer обычно используют файл формата INI: например pgbouncer.ini. Ниже пример концептуальной структуры (параметры могут отличаться в зависимости от версии).

# /etc/pgbouncer/pgbouncer.ini (пример)
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb user=pguser password=YOUR_DB_PASSWORD

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/users.txt

# Режим пула:
# - session — сохраняет сессию до конца соединения
# - transaction — переиспользует соединения на уровне транзакций
# Выбор зависит от требований приложения.
pool_mode = transaction

# Ограничения (пример):
max_client_conn = 100
default_pool_size = 20

Важно:

  • listen_addr имеет смысл держать 127.0.0.1, чтобы pgBouncer не был открыт напрямую наружу.
  • pool_mode выбирайте исходя из поведения вашего приложения. Для большинства API с транзакционными запросами часто подходит transaction, но если приложение держит курсоры или использует особенности сессионирования, может потребоваться session.

Файл пользователей (пример):

# /etc/pgbouncer/users.txt (пример)
"pguser" "md5hashedpassword"

После изменений перезапустите службу pgBouncer:

sudo systemctl restart pgbouncer
sudo systemctl status pgbouncer

Проверьте локально доступность порта:

ss -ltnp | grep 6432

Как это работает вместе: SSH‑туннель в Termux

Логика такая: Termux создаёт SSH‑туннель, который на локальной стороне устройства открывает порт (например, localhost:6432), а на серверной стороне направляет трафик на 127.0.0.1:6432 pgBouncer. Далее любой клиент PostgreSQL (ваше приложение или psql) подключается к localhost:6432 в Termux.

Команда туннелирования (пример):

ssh -i ~/.ssh/id_ed25519 -N -L 6432:127.0.0.1:6432 user@server.example.com

Пояснение ключей:

  • -N — не выполнять удалённую команду, только туннель.
  • -L 6432:127.0.0.1:6432 — локальный порт 6432 форвардит на серверный 127.0.0.1:6432.

Если нужен другой локальный порт (например, чтобы избежать конфликта), замените 6432 в левой части на свободное значение.

Подключение из Termux к PostgreSQL через pgBouncer

Для теста можно использовать psql. Установите клиент PostgreSQL (если требуется):

pkg install postgresql-client

Теперь подключение будет выглядеть так (параметры — замените):

PGPASSWORD='YOUR_DB_PASSWORD' psql -h 127.0.0.1 -p 6432 -U pguser -d mydb

Обратите внимание: соединение идёт в pgBouncer, а не напрямую в PostgreSQL.

Проверка можно сделать запросом:

SELECT version();
SHOW pool_mode;

Если pool_mode как параметр pgBouncer не доступен через SQL (это зависит от ваших настроек), используйте логи/статус pgBouncer. Главное — убедиться, что подключение проходит и авторизация корректна.

Практики безопасности

  • Не открывайте PostgreSQL наружу. PostgreSQL должен быть доступен только на localhost/внутри сети, а снаружи — только через SSH‑туннель.
  • Держите pgBouncer на 127.0.0.1 (или ограничьте доступ фаерволом), чтобы внешний мир не мог подключиться напрямую.
  • Используйте SSH‑ключи, а не пароли (или хотя бы ограничьте парольную аутентификацию).
  • Следите за лимитами (max_client_conn, default_pool_size) и логами pgBouncer.
  • Применяйте минимальные права для пользователя базы, который используется в pgBouncer.

Если вы используете локальную сеть через VPN для удобства маршрутизации внутри своей инфраструктуры, это может облегчить доступ к ресурсам, но туннелирование SSH остаётся главным механизмом защиты подключений к базе.

Автоматизация: автозапуск туннеля и контроль сессии

В администрировании часто удобно запускать туннель по команде и завершать его корректно. Вариант — использовать autossh (если доступно) или простой скрипт. Пример для интерактивного режима:

# Вариант скрипта: start_tunnel.sh
#!/data/data/com.termux/files/usr/bin/sh
ssh -i ~/.ssh/id_ed25519 -N -L 6432:127.0.0.1:6432 user@server.example.com

После запуска оставьте окно открытым — туннель будет активен. Для завершения используйте остановку процесса SSH (например, через Ctrl+C в том же терминале).

В продакшене предпочтительнее управлять туннелями как сервисами/задачами, но конкретная реализация зависит от ваших требований к стабильности сети на Android.

Обнаружение проблем и типовые ошибки

  • Туннель не создаётся: проверьте доступность SSH на сервере и правильность ключа (-i).
  • Ошибка подключения к 127.0.0.1:6432: убедитесь, что pgBouncer слушает 127.0.0.1:6432 на сервере и служба запущена.
  • Ошибка авторизации: проверьте auth_type, содержимое auth_file и соответствие пользователя/пароля.
  • Проблемы поведения приложения после включения pool_mode: попробуйте переключить pool_mode между transaction и session.

Заключение

Безопасный удалённый доступ к PostgreSQL из Termux эффективно организуется через связку SSH‑туннелирования и pgBouncer. SSH даёт защищённый канал и позволяет не открывать БД наружу, а pgBouncer улучшает управление соединениями и устойчивость при нагрузках. Правильная настройка listen_addr, авторизации и режима пула обеспечивает предсказуемую работу приложений и администрирование в рамках легитимных сценариев.

Если вам нужна помощь с настройкой инфраструктуры, аудитом безопасности, подбором параметров pgBouncer или организацией удалённого доступа под ваш кейс, обратитесь в РыбинскЛАБ — поможем спроектировать и внедрить решение.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект