Зачем туннелировать базу данных?

PostgreSQL работает на localhost, коллеге нужно выполнить к нему запрос, а CI-серверу — запустить миграции. Знакомо? Традиционные решения — VPN, SSH-туннели, открытие портов на роутере — либо долго настраиваются, либо небезопасны, либо попросту невозможны за CGNAT и корпоративными файрволами.

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

В этом руководстве рассмотрены три базы данных, которые разработчики туннелируют чаще всего — PostgreSQL, MySQL и Redis — с пошаговыми командами fxTunnel, лучшими практиками безопасности и сравнением с SSH-туннелированием.

Как работает туннелирование баз данных

Туннелирование баз данных — это просто TCP-туннель, направленный на порт базы данных. Все основные СУБД — PostgreSQL, MySQL, Redis, MongoDB — общаются по TCP. Туннель создаёт виртуальный канал между публичным портом на релейном сервере и локальным портом вашей базы. Внешние клиенты подключаются к публичному адресу, а каждый байт перенаправляется на вашу локальную базу данных и обратно.

Схема работы:

Удалённый клиент (psql, mysql, redis-cli, DBeaver, ваше приложение)
        |
        | TCP-соединение
        v
+------------------------------+
|  Сервер fxTunnel             |
|  Публичный порт: 41234      |
|                              |
|  Мультиплексор: поток на     |
|  каждое клиентское соединение|
+--------------+---------------+
               | единое TLS-соединение
               | (все потоки мультиплексированы)
               v
+------------------------------+
|  Клиент fxTunnel             |
|                              |
|  Демультиплексор:            |
|  поток -> localhost:5432     |
+------------------------------+
               |
               v
        localhost:5432
        (PostgreSQL)

Ключевые свойства туннеля к базе данных:

  • Протокол-агностик — туннель перенаправляет сырые TCP-байты. Ему неважно, является ли полезная нагрузка wire-протоколом PostgreSQL, COM-протоколом MySQL или RESP Redis. Любая TCP-база данных работает.
  • Мультиплексирование — несколько одновременных подключений от разных клиентов проходят через единое TLS-соединение между клиентом и сервером fxTunnel. Каждое подключение получает свой логический поток.
  • Шифрование — все данные между клиентом и сервером fxTunnel зашифрованы TLS 1.3. Подробнее о модели безопасности — в статье TLS 1.3 в безопасности туннелей.
  • Низкая задержка — fxTunnel добавляет +1–5 мс к базовой сетевой задержке. Для запросов к базе данных это незаметно.

Установка

Установите fxTunnel на машину, где работает база данных:

# Быстрая установка (Linux/macOS)
curl -fsSL https://fxtun.dev/install.sh | bash

# Проверяем
fxtunnel --version

Docker-сетапы и другие варианты установки разобраны в статье Docker + туннель.

Туннелирование PostgreSQL

PostgreSQL — база данных, которую туннелируют чаще всего: для совместной отладки, предоставления доступа к dev-базе коллегам, запуска миграций из CI и подключения GUI-инструментов вроде DBeaver и pgAdmin.

Создание туннеля

# Перенаправление локального PostgreSQL (порт по умолчанию 5432)
fxtunnel tcp 5432

fxTunnel выводит публичный адрес:

fxTunnel v1.x — tunnel is active
Protocol:    TCP
Public addr: tunnel.fxtun.dev:41234
Forwarding:  tunnel.fxtun.dev:41234 -> localhost:5432

Press Ctrl+C to stop

Подключение через psql

С любой машины с сетевым доступом:

psql -h tunnel.fxtun.dev -p 41234 -U myuser -d mydb

Подключение ведёт себя точно так же, как если бы вы подключались к локальному экземпляру PostgreSQL. Все функции psql работают: \dt, \d table_name, COPY, транзакции и подготовленные запросы.

Подключение через GUI-инструмент (DBeaver, pgAdmin)

В вашем GUI-инструменте создайте новое подключение к PostgreSQL с параметрами:

ПолеЗначение
Hosttunnel.fxtun.dev
Port41234 (из вывода fxTunnel)
Databasemydb
Usernamemyuser
Passwordпароль от базы данных

Никакой специальной конфигурации не нужно. GUI-инструмент видит стандартный сервер PostgreSQL.

Подключение из приложения

Обновите строку подключения в вашем приложении, указав адрес туннеля:

# Стандартная строка подключения PostgreSQL
DATABASE_URL=postgres://myuser:mypass@tunnel.fxtun.dev:41234/mydb
# Python (psycopg2)
import psycopg2
conn = psycopg2.connect(
    host="tunnel.fxtun.dev",
    port=41234,
    user="myuser",
    password="mypass",
    dbname="mydb"
)
// Node.js (pg)
const { Client } = require('pg');
const client = new Client({
  host: 'tunnel.fxtun.dev',
  port: 41234,
  user: 'myuser',
  password: 'mypass',
  database: 'mydb',
});
await client.connect();

PostgreSQL на нестандартном порту

Если PostgreSQL слушает на нестандартном порту, укажите его:

fxtunnel tcp 15432

Туннелирование MySQL

Туннелирование MySQL работает идентично PostgreSQL. Туннель перенаправляет сырой TCP — wire-протокол MySQL проходит без изменений.

Создание туннеля

# Перенаправление локального MySQL (порт по умолчанию 3306)
fxtunnel tcp 3306

Вывод:

fxTunnel v1.x — tunnel is active
Protocol:    TCP
Public addr: tunnel.fxtun.dev:38901
Forwarding:  tunnel.fxtun.dev:38901 -> localhost:3306

Press Ctrl+C to stop

Подключение через mysql CLI

mysql -h tunnel.fxtun.dev -P 38901 -u root -p

Обратите внимание на заглавную -P для порта (строчная -p — это запрос пароля в клиенте MySQL).

Подключение из приложения

# Строка подключения MySQL
DATABASE_URL=mysql://root:mypass@tunnel.fxtun.dev:38901/mydb
# Python (mysql-connector)
import mysql.connector
conn = mysql.connector.connect(
    host="tunnel.fxtun.dev",
    port=38901,
    user="root",
    password="mypass",
    database="mydb"
)
// Node.js (mysql2)
const mysql = require('mysql2/promise');
const conn = await mysql.createConnection({
  host: 'tunnel.fxtun.dev',
  port: 38901,
  user: 'root',
  password: 'mypass',
  database: 'mydb',
});

MySQL SSL Mode

Некоторые MySQL-клиенты по умолчанию включают SSL при подключении к не-localhost хосту. Если ваш локальный MySQL не настроен с SSL, вам может потребоваться отключить SSL на стороне клиента:

mysql -h tunnel.fxtun.dev -P 38901 -u root -p --ssl-mode=DISABLED

Это безопасно, потому что сам туннель шифруется TLS 1.3 между клиентом и сервером fxTunnel. Трафик между вашим локальным MySQL и клиентом fxTunnel остаётся на localhost и не покидает машину.

Туннелирование Redis

Redis — самая лёгкая база данных для туннелирования. Он использует простой текстовый протокол (RESP) поверх TCP, а соединения обычно короткоживущие или используют пул соединений.

Создание туннеля

# Перенаправление локального Redis (порт по умолчанию 6379)
fxtunnel tcp 6379

Вывод:

fxTunnel v1.x — tunnel is active
Protocol:    TCP
Public addr: tunnel.fxtun.dev:44567
Forwarding:  tunnel.fxtun.dev:44567 -> localhost:6379

Press Ctrl+C to stop

Подключение через redis-cli

redis-cli -h tunnel.fxtun.dev -p 44567

Все команды redis-cli работают нормально:

tunnel.fxtun.dev:44567> SET mykey "hello"
OK
tunnel.fxtun.dev:44567> GET mykey
"hello"
tunnel.fxtun.dev:44567> KEYS *
1) "mykey"

Подключение из приложения

# Python (redis-py)
import redis
r = redis.Redis(
    host="tunnel.fxtun.dev",
    port=44567,
    decode_responses=True
)
r.set("key", "value")
print(r.get("key"))
// Node.js (ioredis)
const Redis = require('ioredis');
const client = new Redis({
  host: 'tunnel.fxtun.dev',
  port: 44567,
});
await client.set('key', 'value');
const val = await client.get('key');

Redis AUTH

Если ваш экземпляр Redis требует аутентификации, туннель не мешает. Используйте стандартную команду AUTH или передайте пароль при подключении:

redis-cli -h tunnel.fxtun.dev -p 44567 -a yourpassword

Туннелирование нескольких баз данных одновременно

Типичная среда разработки включает PostgreSQL, Redis и, возможно, MySQL на одной машине. Вы можете туннелировать их все одновременно:

# Терминал 1: PostgreSQL
fxtunnel tcp 5432

# Терминал 2: MySQL
fxtunnel tcp 3306

# Терминал 3: Redis
fxtunnel tcp 6379

Каждый туннель получает независимый публичный адрес. fxTunnel поддерживает несколько одновременных туннелей на бесплатном тарифе.

Пример с Docker Compose

Для полного стека разработки с туннелями добавьте fxTunnel как сервис в docker-compose:

version: "3.8"

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: devpass
      POSTGRES_DB: myapp
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  tunnel-postgres:
    image: ghcr.io/mephistofox/fxtunnel:latest
    command: ["tcp", "postgres:5432"]
    depends_on:
      - postgres

  tunnel-redis:
    image: ghcr.io/mephistofox/fxtunnel:latest
    command: ["tcp", "redis:6379"]
    depends_on:
      - redis
docker compose up
# tunnel-postgres_1 | tcp://pg-xyz.fxtun.dev:18432 -> tcp://postgres:5432
# tunnel-redis_1    | tcp://rd-xyz.fxtun.dev:19637 -> tcp://redis:6379

Другие Docker-сценарии разобраны в статье Docker + туннель: доступ к контейнерам из интернета.

Туннель к базе данных vs SSH-туннель

SSH-туннелирование (ssh -L) десятилетиями было стандартным способом доступа к удалённым базам данных. Оно по-прежнему работает, но fxTunnel закрывает ряд болевых точек, которые SSH не решает. Более глубокое сравнение — в статье SSH-туннель vs современные инструменты.

Сравнение команд

ЗадачаSSH-туннельfxTunnel
Туннель PostgreSQLssh -L 5432:localhost:5432 user@serverfxtunnel tcp 5432
Туннель MySQLssh -L 3306:localhost:3306 user@serverfxtunnel tcp 3306
Туннель Redisssh -L 6379:localhost:6379 user@serverfxtunnel tcp 6379
Несколько базssh -L 5432:localhost:5432 -L 6379:localhost:6379 user@serverfxtunnel tcp 5432 и fxtunnel tcp 6379
Фоновый режимssh -f -N -L 5432:localhost:5432 user@serverfxtunnel tcp 5432 (работает на переднем плане, Ctrl+C для остановки)

Сравнение возможностей

ВозможностьSSH-туннельfxTunnel
Нужен свой серверДа (с публичным IP)Нет
Время настройки5–30 мин (сервер + ключи)30 секунд
НаправлениеУдалённый -> локальный (ssh -L)Локальный -> публичный (обратный)
АвтопереподключениеНет (нужен autossh)Да
Несколько клиентовТребует настройки sshdВстроенное мультиплексирование
ШифрованиеПротокол SSHTLS 1.3
Инспектор трафикаНетДа (от $5/мес.)
Поддержка UDPНетДа
Зависимость от вендораНетНет (open source)

Когда SSH лучше

SSH-туннели остаются правильным выбором, когда:

  • У вас уже есть сервер с SSH-доступом, и база данных работает на этом сервере.
  • Вам нужно получить доступ к базе данных на удалённом сервере с вашей локальной машины (направление ssh -L).
  • Корпоративная политика запрещает установку сторонних инструментов.

Когда fxTunnel лучше

fxTunnel удобнее, когда:

  • Вам нужно дать другим доступ к вашей локальной базе данных (обратное направление).
  • У вас нет сервера с публичным IP.
  • Вам нужно автопереподключение, мультиплексирование и простая настройка.
  • Вы запускаете базы данных в Docker и хотите декларативный docker-compose-сетап.

Лучшие практики безопасности

Открытие базы данных — даже для разработки — требует осторожности. TCP-туннель делает вашу базу доступной из интернета, и любой, кто узнает публичный адрес и порт, может попытаться подключиться. Несколько простых мер существенно снижают риски.

1. Используйте надёжные учётные данные

Никогда не используйте пароли по умолчанию или беспарольный доступ при туннелировании:

# PostgreSQL: установите надёжный пароль
ALTER USER myuser WITH PASSWORD 'a-strong-random-password';

# MySQL: установите надёжный пароль
ALTER USER 'root'@'%' IDENTIFIED BY 'a-strong-random-password';

# Redis: включите AUTH
# В redis.conf:
requirepass a-strong-random-password

2. Ограничьте привилегии пользователя базы данных

Создайте выделенного пользователя с минимальными привилегиями для доступа через туннель:

-- PostgreSQL: пользователь только для чтения
CREATE USER tunnel_user WITH PASSWORD 'strong-pass';
GRANT CONNECT ON DATABASE mydb TO tunnel_user;
GRANT USAGE ON SCHEMA public TO tunnel_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO tunnel_user;

-- MySQL: пользователь только для чтения
CREATE USER 'tunnel_user'@'%' IDENTIFIED BY 'strong-pass';
GRANT SELECT ON mydb.* TO 'tunnel_user'@'%';
FLUSH PRIVILEGES;

3. Закрывайте туннель по окончании работы

Туннель — не постоянный сервис. Закрывайте его, как только закончите работу:

# Нажмите Ctrl+C в терминале с fxTunnel
# Туннель закроется мгновенно, публичный адрес перестанет работать

4. Привяжите к localhost

Убедитесь, что база данных слушает только на localhost, а не на всех интерфейсах. Это предотвращает прямой доступ, даже если кто-то сканирует вашу машину:

# PostgreSQL (postgresql.conf)
listen_addresses = 'localhost'

# MySQL (my.cnf)
bind-address = 127.0.0.1

# Redis (redis.conf)
bind 127.0.0.1

Туннель подключается к localhost, поэтому эта конфигурация прекрасно работает с туннелированием.

5. Никогда не туннелируйте продакшен-базы данных

TCP-туннель предназначен для разработки и тестирования. Никогда не открывайте продакшен-базу данных с реальными данными клиентов через туннель. Для доступа к продакшену используйте VPN, приватные сети или специализированные инструменты управления доступом к базам данных.

Сравнение: способы доступа к базам данных

МетодНастройкаБезопасностьСтоимостьЛучше всего для
fxTunnel TCP30 секунд, одна командаTLS 1.3 + аутентификация БДБесплатноРазработка/тестирование, совместный доступ
SSH-туннель5–30 мин, свой серверSSH-шифрование + аутентификация БДVPS от $5/мес.Доступ к БД на удалённом сервере
VPN30–60 мин, инфраструктураПолное сетевое шифрованиеЗависит от решенияПостоянный командный доступ
Прямое открытие порта5 мин, доступ к роутеруМинимальная (без шифрования)БесплатноНикогда не рекомендуется
Публичный IP облачной БД5 мин, консоль провайдераФайрвол провайдера + аутентификация БДПо тарифу провайдераОблачные базы данных

Типичные сценарии использования

Совместная отладка

Коллега сообщает о баге, который воспроизводится только с определёнными данными в базе. Вместо создания дампа и его отправки туннелируйте базу данных и дайте коллеге возможность выполнять запросы напрямую:

fxtunnel tcp 5432
# Поделитесь публичным адресом с коллегой
# Коллега подключается: psql -h tunnel.fxtun.dev -p 41234 -U debug_user mydb

Тестирование CI/CD-пайплайна

Запускайте интеграционные тесты в CI против вашей локальной базы данных:

# На вашей машине: запустите туннель
fxtunnel tcp 5432

# В конфигурации CI: укажите URL базы данных на туннель
DATABASE_URL=postgres://ci_user:pass@tunnel.fxtun.dev:41234/mydb
npm test

Разработка мобильных приложений

Мобильное приложение на физическом устройстве не может достучаться до localhost. Туннелируйте API-сервер и базу данных:

# API-сервер
fxtunnel http 3000

# База данных (если мобильному приложению нужен прямой доступ к БД для отладки)
fxtunnel tcp 5432

Удалённая работа DBA

Администратору баз данных нужно осмотреть и оптимизировать вашу базу разработки. Вместо предоставления SSH-доступа к вашей машине туннелируйте порт базы данных:

fxtunnel tcp 5432
# Поделитесь адресом и пользователем с правами только на чтение с DBA

Тарифы

Облачный сервис на fxtun.dev позволяет начать туннелирование за 30 секунд без настройки сервера.

ТарифЦенаВозможности
Free$0HTTP/TCP/UDP туннели, без ограничений на соединения
Proот $5/мес.Свои домены, инспектор запросов, replay
Teamот $10/мес.10+ одновременных туннелей, приоритетная поддержка

Туннелирование баз данных работает на бесплатном тарифе. Исходный код полностью открыт на GitHub.

FAQ

Можно ли туннелировать PostgreSQL через fxTunnel?

Да – fxtunnel tcp 5432 создаёт TCP-туннель к локальному PostgreSQL. Вы получаете публичный адрес вида tunnel.fxtun.dev:41234, к которому подключается любой psql-клиент, GUI-инструмент или приложение. Wire-протокол PostgreSQL проходит без изменений, так что на стороне базы ничего настраивать не нужно.

Безопасно ли открывать базу данных через туннель?

Для разработки и тестирования — да. Весь трафик между клиентом и релейным сервером шифруется TLS 1.3. При этом конечная точка туннеля доступна из интернета, поэтому обязательно используйте надёжные пароли, ограничивайте привилегии пользователей до необходимого минимума и закрывайте туннель по окончании сессии. Продакшен-базу с реальными данными клиентов так открывать нельзя.

Какую задержку добавляет туннель к базе данных?

Ожидайте +1-5 мс поверх базовой сетевой задержки. Для интерактивных запросов в psql, mysql CLI или GUI-инструменте это незаметно. Для массовых операций вроде миграций или загрузки больших объёмов данных накладные расходы туннеля невелики по сравнению со временем на дисковые операции и выполнение запросов.

Чем отличается SSH-туннель от fxTunnel для доступа к базе данных?

SSH-туннель требует собственного сервера с SSH-доступом, ручной настройки через ssh -L и не переподключается автоматически (разве что с autossh). fxTunnel не требует сервера, настраивается одной командой, сам восстанавливает соединение и включает инспектор трафика. Оба варианта шифруют данные — SSH через свой протокол, fxTunnel через TLS 1.3. Подробнее о компромиссах — в статье SSH-туннель vs современные инструменты.

Можно ли туннелировать несколько баз данных одновременно?

Да. Запустите отдельную команду fxtunnel tcp для каждого порта — 5432 для PostgreSQL, 3306 для MySQL, 6379 для Redis. Каждый туннель получает свой публичный адрес, и запускать несколько туннелей параллельно можно даже на бесплатном тарифе.