Подключение к удалённой базе данных за NAT

Время · ~5 мин Уровень · Начальный Протокол · PostgreSQL / MySQL / любой TCP

Вам нужно обратиться к базе данных — PostgreSQL, MySQL, Redis, MongoDB — которая работает на сервере без публичного IP, и вы хотите использовать привычный клиент: psql, DBeaver, инструмент миграций. Правильный путь — не открывать порт базы в интернет. С LRO база продолжает слушать на localhost на своей машине, а вы дотягиваетесь до неё на локальном порту своей через зашифрованный туннель.

Роли для этой задачи: машина, на которой работает база, является клиентом (эндпоинт живёт на ней); ваш компьютер, где вы запускаете клиент БД, является саппортом (он открывает локальный порт, к которому вы подключаетесь). Впервые здесь? Начните с гайда ваш первый туннель; не уверены, какая сторона есть какая, — смотрите выбор роли агента.
  1. Убедитесь, что база слушает локально

    На машине с базой сервер должен слушать на 127.0.0.1 — так настроено по умолчанию в большинстве установок. Ничего из этого не должно смотреть в интернет; LRO подключается к базе с той же машины.

    $ ss -ltn | grep 5432 # postgres on 127.0.0.1:5432 (3306 for MySQL, 6379 Redis)

    Это безопасная конфигурация: база привязана к loopback, поэтому напрямую из сети недоступна, и LRO этого не меняет. Удалённая машина запускает агента LRO в режиме Client (клиент); ваш компьютер — в режиме Support (саппорт).

  2. Добавьте эндпоинт базы на агенте-клиенте

    В панели Endpoints → Create endpoint (эндпоинты → создать эндпоинт). Выберите агента-клиента (машину с базой), назовите его, например, Office Postgres, и задайте target 127.0.0.1 и port 5432.

    Endpoints list with an Office Postgres endpoint on the client agent pointing at 127.0.0.1:5432
    Рис. 1. Эндпоинт базы живёт на агенте-клиенте — target 127.0.0.1:5432, локальный Postgres.
  3. Откройте туннель со своей машины

    Tunnels → Add tunnel (туннели → добавить туннель). Выберите свой компьютер как агента-саппорта, укажите эндпоинт Office Postgres и задайте локальный порт — совпадение со стандартным портом базы (5432) упрощает команды клиента, но подойдёт любой свободный локальный порт. Создайте туннель; через мгновение он станет Active (активным).

    Tunnels table with an active tunnel from lab-server to admin-laptop listening on 0.0.0.0:5432
    Рис. 2. Активный туннель — ваша машина слушает на 5432 и пробрасывает на удалённый 127.0.0.1:5432.
  4. Подключитесь своим клиентом БД

    На вашем компьютере направьте клиент на локальный порт. Соединение приходит на удалённую базу через туннель — здесь с помощью psql:

    $ psql -h 127.0.0.1 -p 5432 -U appuser -d shopdb
    psql session through the LRO tunnel running SELECT version() and a query against the orders table
    Рис. 3. Реальный запрос к удалённой базе — через порт, который существует только на вашем ноутбуке.

    Всё, что говорит на протоколе базы, работает так же, будучи направленным на локальный порт — дампы, восстановления, миграции:

    $ pg_dump -h 127.0.0.1 -p 5432 -U appuser shopdb > shopdb.sql $ DATABASE_URL=postgres://appuser@127.0.0.1:5432/shopdb npm run migrate

    GUI-клиенты — то же самое: в DBeaver, pgAdmin или TablePlus укажите хост 127.0.0.1 и порт 5432 — туннель сделает остальное.

Заметки

Работайте с любой базой данных где угодно — не выставляя ни одного порта.

Создать аккаунт →