dreamTunnel пробрасывает порт вашего компьютера в публичный интернет через исходящее соединение. NAT, файрвол и CG-NAT не помеха. Каждому туннелю — свой HTTPS-поддомен, сертификат включён, переподключение при обрыве интернета — автоматическое.
iwr -useb https://tunnel.swag.best/install.ps1 | iex
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. Валидный сертификат уже включён: никаких предупреждений браузера. В термиале видно каждый запрос: метод, путь, код ответа и время.
Без регистрации, конфигов и ключей. Установили — запустили — работает. Установщик сам кладёт бинарник в PATH.
Wildcard-сертификат на весь пул поддоменов *.maiuni.online. Браузер открывает туннель как обычный сайт — замок, зелёный, честный.
Обрыв интернета? Клиент переподключается сам: экспоненциальный бэкофф с джиттером, heartbeat каждые 10 секунд, сессия восстанавливается на тот же поддомен.
dt http 3000 my-api — получите https://my-api.maiuni.online. Без имени — случайный короткий поддомен из пула.
Каждое обращение к туннелю видно в консоли: метод, путь, код ответа, время выполнения — как у больших, только свои.
Один бинарник на 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 сервера. Никаких отдельных записей создавать не нужно — поддомены виртуальные, сервер раздаёт их динамически и следит, чтобы два клиента никогда не получили один и тот же.