В реальных проектах часто требуется обеспечить безопасный удалённый доступ к 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 или организацией удалённого доступа под ваш кейс, обратитесь в РыбинскЛАБ — поможем спроектировать и внедрить решение.