Зачем туннелировать базу данных?
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 с параметрами:
| Поле | Значение |
|---|---|
| Host | tunnel.fxtun.dev |
| Port | 41234 (из вывода fxTunnel) |
| Database | mydb |
| Username | myuser |
| 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 |
|---|---|---|
| Туннель PostgreSQL | ssh -L 5432:localhost:5432 user@server | fxtunnel tcp 5432 |
| Туннель MySQL | ssh -L 3306:localhost:3306 user@server | fxtunnel tcp 3306 |
| Туннель Redis | ssh -L 6379:localhost:6379 user@server | fxtunnel tcp 6379 |
| Несколько баз | ssh -L 5432:localhost:5432 -L 6379:localhost:6379 user@server | fxtunnel tcp 5432 и fxtunnel tcp 6379 |
| Фоновый режим | ssh -f -N -L 5432:localhost:5432 user@server | fxtunnel tcp 5432 (работает на переднем плане, Ctrl+C для остановки) |
Сравнение возможностей
| Возможность | SSH-туннель | fxTunnel |
|---|---|---|
| Нужен свой сервер | Да (с публичным IP) | Нет |
| Время настройки | 5–30 мин (сервер + ключи) | 30 секунд |
| Направление | Удалённый -> локальный (ssh -L) | Локальный -> публичный (обратный) |
| Автопереподключение | Нет (нужен autossh) | Да |
| Несколько клиентов | Требует настройки sshd | Встроенное мультиплексирование |
| Шифрование | Протокол SSH | TLS 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 TCP | 30 секунд, одна команда | TLS 1.3 + аутентификация БД | Бесплатно | Разработка/тестирование, совместный доступ |
| SSH-туннель | 5–30 мин, свой сервер | SSH-шифрование + аутентификация БД | VPS от $5/мес. | Доступ к БД на удалённом сервере |
| VPN | 30–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 | $0 | HTTP/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. Каждый туннель получает свой публичный адрес, и запускать несколько туннелей параллельно можно даже на бесплатном тарифе.