Ваш локальный сервер — в интернете за одну команду

dreamTunnel пробрасывает порт вашего компьютера в публичный интернет через исходящее соединение. NAT, файрвол и CG-NAT не помеха. Каждому туннелю — свой HTTPS-поддомен, сертификат включён, переподключение при обрыве интернета — автоматическое.

Установка

Windows — PowerShell
iwr -useb https://tunnel.swag.best/install.ps1 | iex
Linux / macOS
curl -fsSL https://tunnel.swag.best/install.sh | bash
Запуск туннеля
dt http 8080

  dreamTunnel — tunnel online

  Forwarding   https://my-site.maiuni.online -> http://127.0.0.1:8080
  Connections  https://my-site.maiuni.online

  Press Ctrl+C to stop

  GET /          200 OK        12.4ms
  GET /api        200 OK         3.1ms

Одна команда — и любой HTTP-сервер на порту 8080 доступен по адресу https://my-site.maiuni.online. Валидный сертификат уже включён: никаких предупреждений браузера. В термиале видно каждый запрос: метод, путь, код ответа и время.

Возможности

01

Одна команда

Без регистрации, конфигов и ключей. Установили — запустили — работает. Установщик сам кладёт бинарник в PATH.

02

HTTPS без предупреждений

Wildcard-сертификат на весь пул поддоменов *.maiuni.online. Браузер открывает туннель как обычный сайт — замок, зелёный, честный.

03

Не падает

Обрыв интернета? Клиент переподключается сам: экспоненциальный бэкофф с джиттером, heartbeat каждые 10 секунд, сессия восстанавливается на тот же поддомен.

04

Своё имя поддомена

dt http 3000 my-api — получите https://my-api.maiuni.online. Без имени — случайный короткий поддомен из пула.

05

Живые логи запросов

Каждое обращение к туннелю видно в консоли: метод, путь, код ответа, время выполнения — как у больших, только свои.

06

Кроссплатформенно

Один бинарник на Go: Windows, Linux, macOS — amd64 и arm64. Ставится скриптом, ничего не требует.

Как это работает

  ваш компьютер                          сервер dreamTunnel                 браузер
  ┌─────────────┐   исходящее TLS    ┌──────────────────────┐    HTTPS    ┌─────────┐
  │ dt http 8080├───────────────────>│ :444 control-канал   │<────────────┤ визитёр  │
  │ локальный   │<───────────────────┤ :8453 edge + wildcard├────────────>│ на сайт  │
  │ web-сервер  │   стримы данных    │ сертификат *.maiuni  │             └─────────┘
  └─────────────┘                    └──────────────────────┘
       NAT / CG-NAT / файрвол — не проблема: всё соединение инициирует клиент

Документация

Команды

КомандаЧто делает
dt http 8080Туннель к локальному HTTP-серверу на порту 8080. Поддомен — случайный.
dt http 8080 my-apiТо же, но с постоянным именем: https://my-api.maiuni.online
dt http 8080 --server host:portУказать другой сервер dreamTunnel.
dt tcp 25565Сырой TCP-туннель (например, игровой сервер).
dt loginСохранить сервер и токен в ~/.dreamtunnel/config.env.
dt configПоказать текущую конфигурацию.

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

Клиент держит контрольный канал с сервером и обменивается heartbeat-сообщениями. Если связь пропала — Wi-Fi мигнул, ноутбук уснул, провайдер перебрал кабель — клиент сам начинает переподключение: 1с, 2с, 4с… до 60с максимум, со случайным джиттером, чтобы толпа клиентов не валилась на сервер одновременно.

Сессия хранится локально. После восстановления клиент получает тот же поддомен — ссылки не ломаются. Активные TCP-соединения внутри туннеля при обрыве пересоздаются (это свойство TCP), но сам туннель и URL остаются прежними.

Токен доступа

Для доступа к серверу нужен токен. Он задаётся переменной окружения DT_TOKEN, файлом ~/.dreamtunnel/config.env или командой dt login. В разделяемых конфигурациях токен хранится в обфусцированном виде — мастер-ключ сервера остаётся только на сервере.

Владелец сервера: сгенерировать клиентский токен — dt token <секрет> на сервере (выведет обфусцированную форму для раздачи).

Свой сервер

Релей — это тот же бинарник: dt server. Конфиг в /etc/dreamtunnel/server.conf (секрет, домен, порты, логин/пароль админки). systemd-юнит и wildcard-сертификат через acme.sh DNS-01 — всё как в описании проекта на GitHub.

Пул поддоменов реализован wildcard-записью DNS: *.maiuni.online → IP сервера. Никаких отдельных записей создавать не нужно — поддомены виртуальные, сервер раздаёт их динамически и следит, чтобы два клиента никогда не получили один и тот же.