- Полный отказ от вывода громоздких QR-кодов в терминал
- Автоматический фоновый веб-сервер для раздачи файлов и картинок QR из каталога clients
- Компактная карточка M3 со списком прямых кликабельных ссылок и каталогом файлов
- Прямой вывод ссылок на первого клиента в финальной рамке без подтверждения
- Добавлена опция --web-port (по умолчанию 8080) и сохранение в install.conf
- Обновлена документация и CLI команды freeturn client qr
- Разделение QR-кодов на 3 чётких формата с подробными подсказками:
1. AmneziaWG Direct (AWG 3.1) для официального приложения AmneziaWG
2. FreeTurn App (релей + вшитый VPN) со ссылкой freeturn:// для мобильного приложения FreeTurn
3. AmneziaWG Relay (127.0.0.1:9000) для связки с отдельным CLI/Termux клиентом
- Вывод по умолчанию всех 3 QR-кодов при завершении установки и по команде freeturn client qr
- Инструкции и готовая SCP-команда для скачивания всех 3 картинок (*.png) на ПК
- Добавлена команда freeturn client web для временной раздачи картинок через браузер по HTTP
- Поддержка протокола OSC 1337 для автоматического сохранения файлов в поддерживаемых терминалах
- Включение авторизации по Client ID (allowlist) по умолчанию в мастере установки
- Создание глобального симлинка /usr/local/bin/freeturn для вызова из любой директории
- Умный поиск имени клиента с поддержкой дефисов/регистра (client1 -> client-1)
- Очистка от комментариев и Low ECC (-l L) для компактного QR-кода (~51 колонка) в PowerShell/терминалах
- Интерактивный запрос на вывод QR-кода первого клиента сразу после завершения установки
- Обновление подсказок и документации на команду freeturn
- генерация 18 параметров amneziawg 3.1 и docker-compose для freeturn-awg
- команды cli и rpc v2 для управления пирами и вывода qr-кодов (direct и relay)
- раздельная установка, переконфигурация и раздельное удаление компонентов
- набор из 27 автоматических bats-тестов установщика
- актуализация документации по прямому режиму и развёртыванию
убраны флаги -mode и -bond: остался только udp-релей для wireguard.
удалены tcpfwd, tcpfwdserver, bondclient, bondserver, bondframe, kcptun,
wire/relay; proxy/common переехал в udprelay/dial.
BREAKING CHANGE: флаги -mode и -bond удалены; конфиги и ссылки freeturn://
с tcp-режимом больше не принимаются.
- Добавлен пакет `internal/routemgr` для автоматического создания
host-маршрутов (/32) через шлюз ОС (Windows, Linux, macOS).
- В `config.Client` и CLI добавлен флаг `-routes` (по умолчанию отключен).
- Интегрирован callback `OnTURNServer` в `udprelay` и `tcpfwd`
для динамического добавления маршрутов при старте стримов.
- Для Android (и переименованных JNI-бинарей Linux) добавлено
graceful-отключение менеджера маршрутов.
- Обновлена документация (`quickstart.md`): добавлены примеры с
использованием `-routes` и `-client-id`.
Персона строится детерминированно из FingerprintSeed (Client ID) и живёт
между перезапусками; при отказе captcha сжигается, и цепочка проходится
заново новой личностью с чистыми куками.
Телеметрия captcha (internal/captcha/telemetry.go) собирает аналитику
виджета: сэмплы сенсоров, connection-поля, курсор/тапы. Жест проживается
в реальном времени, иначе тайминги массивов не сходятся.
internal/personanet - TLS-клиент персоны (JA3 + split ClientHello), общий
для VK-auth и ручной captcha; порядок заголовков задаёт browserprofile.
BREAKING CHANGE: флаг -browser убран, семейство персоны всегда Chrome -
только Chromium даёт NetworkInformation и Generic Sensors, без которых
телеметрия captcha неполна. Класс устройства по-прежнему за -platform.
- Добавлена поддержка Safari в -browser.
Обновлена валидация флага, документация и выбор TLS/HTTP2-профиля для
chrome, firefox и safari.
- Улучшено переиспользование сохранённого браузерного профиля.
Добавлен VK_PROFILE_PATH, сохраняется Accept-Language, определяется семейство
браузера и mobile-профиль, а TLS-клиент пересобирается под захваченный UA.
- Обновлена форма запросов VK Smart Captcha.
Учитываются domain из redirect_uri, id.vk.ru origin/referer, settings_key для
slider captcha, сохранённый browser_fp и device JSON.
- Улучшено автоматическое решение captcha.
Обновлён формат PoW-ответа, добавлена mobile accelerometer телеметрия,
NetworkInformation отправляется только для Chromium-профилей, а slider solver
получил обратный скоринг и более естественные cursor traces.
- Убрано шумное throughput debug-логирование в relay-путях.
Удалён Stats.LogEvery и его вызовы в UDP/TCP relay, при этом агрегированная
TrafficStats-статистика сохранена.
- Обновлены тесты и инфраструктура сборки.
Добавлены проверки Safari, browser profile storage, captcha telemetry и
saved-profile fallback; tls-client обновлён до v1.15.1; Android bind в
Taskfile разделён для Windows и Unix-платформ
Флаг -browser chrome|firefox (default firefox, Chrome - escape-hatch), client-local для VK-auth, в freeturn:// URI не идёт. browserprofile.ForKind даёт канонные UA/JA3/Accept-Language; ApplyFhttp шлёт sec-ch-ua* только для Chrome (Firefox их не отправляет). dial.go выбирает profiles.Firefox_147 / Chrome_146 под UA.
Control-plane TLS-dial переведён на MultiSplitWriteConn (фрагментация SNI).
freeturn:// теперь несёт base64url(json) вместо query-string. Поля:
v, provider, peer, transport, mode, bond, obf, key, n, spc, cid,
listen, dns, dnss, mcap, name. Версионирован полем v=1.
config.PeekSubURL: pre-parse -sub до ParseClient, URI первой ноды
подсовывается позиционным аргументом - применение общим путём.
ParseClient применяет все новые поля URI (N, StreamsPerCred,
ClientID, Listen, DNSMode, DNSServers, ManualCaptcha, transport).
Чинит тихий выход после выбора метода (set -e + установка WireGuard
в мастере убивали скрипт без диагностики) и неудобный выбор.
- trap ERR с номером строки и командой вместо тихой смерти
- WireGuard только детектится (порт бэкенда), без авто-установки
- whiptail-TUI: gauge-прелоадеры (pull/up/download/deps), меню с
--default-item, backtitle, валидация портов/hex-ключа; fallback на
текст со спиннером, чтение из /dev/tty (работает через curl | bash)
- non-interactive режим: -y + флаги (--method/--mode/--obf-key/
--version/--update/--uninstall/--purge), CLI бьёт install.conf
- health-check после старта (docker inspect / systemctl is-active):
падение даёт ошибку с логами, а не ложное «Готово»
- docs: curl | bash one-liner + примеры non-interactive
Клиент всегда отправляет Client ID первой DTLS app-record, сервер
всегда читает. Флаг -auth и URI-параметр auth удалены — рассинхрон
client/server невозможен. -clients-file на сервере включает только
проверку ID по allowlist clients.json.
Также:
- clients.json и client_config.json пишутся с правами 0o600
- исправлены все находки golangci-lint (errcheck, gosec, govet shadow)
Примечание: удалён флаг -auth и URI-параметр auth; Client ID теперь
всегда в первой записи туннеля — старые клиенты/серверы несовместимы.
Повторный запуск install-server.sh обнаруживает установку и предлагает меню: обновить версию (конфиг сохраняется), переконфигурировать, удалить.
- конфиг установки в /opt/free-turn-proxy/install.conf (chmod 600)
- выбор версии релиза при установке (список с GitHub API, дефолт latest)
- iptables -C перед -I: нет дублей правил при повторе
- атомарная подмена бинарника systemd + restart
- docker compose pull для подтягивания нового образа
- internal/clientsdb: БД клиентов с hot-reload + length-prefixed ID wire
- internal/uri: parse/encode share-ссылок freeturn://
- internal/sub: загрузка и парсинг подписок (sub.md)
- client: флаги -auth, -client-id, -sub; позиционный URI; ID через crypto/rand
- server: подкоманда clients (add/remove/list), чтение ID под -clients-file
- запись/чтение ID учитывают DTLS record-orientation (буфер на запись целиком)
- docs: uri.md, sub.md; правки flags/deploy/quickstart
- снят UTF-8 BOM по всем исходникам
Сейчас нужен только VK-провайдер. internal/provider/static и связанные флаги
-static-user/-static-pass/-static-addr удалены, валидация и тесты обновлены.
Интерфейс provider.Provider остаётся — слот для будущих реализаций сохранён в
нейтральных формулировках doc-комментариев.
Переносит VK-specific пакеты под internal/provider/vk/internal/* — теперь
недоступны для импорта извне provider/vk (Go internal/ rule). ish остался в
internal/client/ish — не VK-specific.
vk.SetCaptchaLoggers удалён: логгеры captcha/manual подключаются внутри vk.New,
debug-флаг передаётся через новое поле Config.Debug. cmd/client/main.go больше
не импортирует captcha-пакеты.
Документация обновлена.
Вытаскивает источник TURN-creds из захардкоженной привязки к VK в интерфейс
internal/provider.Provider. Pipeline (proxy/udprelay, proxy/tcpfwd) работает
только через интерфейс — без VK-specific импортов и sentinel'ов.
Реализации:
- internal/provider/vk: фасад над client/vkauth (требует -link)
- internal/provider/static: фиксированные creds для self-hosted coturn /
metered / любого RFC 5766/8656 TURN (флаги -static-user/-static-pass/
-static-addr)
Изменения интерфейса:
- common.GetCredsFunc дропнула link (provider держит сам)
- udprelay AuthHandler: LockoutUntilUnix → BackoffUntilUnix
- vkauth sentinels обёрнуты в provider.ErrBackoffActive / ErrFatalNoStreams
через errors.Join (backward-compat сохранён)
Документация: docs/providers.md (новый), docs/glossary.md и docs/flags.md
обновлены.
- routes.{sh,ps1,macos.sh} → scripts/; старые файлы из корня удалены
- унифицирован парсинг: TURN server IP, relayed-address=, CIDR, plain IP
- исправлен баг доки: логи клиента идут в stderr, пайп требует -debug 2>&1
- quickstart.md переписан: секция маршрутов, команды трёх платформ
- troubleshooting.md: обновлены пути и примечание про -debug
runCaptchaServerAndWait теперь делает select на ctx.Done вместе с keyCh и
закрывает listener в defer. Без этого, когда родительский manualCtx истекал
(3m), внутренняя горутина блокировалась на keyCh навсегда, оставляя
127.0.0.1:8765 занятым до выхода процесса. SolveViaProxy/SolveViaHTTP принимают
ctx и протягивают его; manualCaptchaSolver в cmd/client/main.go форвардит ctx
вместо того, чтобы его терять.