Commit Graph

86 Commits

Author SHA1 Message Date
samosvalishe 8b2e028f99 fix: устранить замечания комплексной проверки
Критичное:
- go.mod: версия 1.25.5→1.25.0 (go mod tidy); Dockerfile: тег 1.25
- release.yml: go-version 1.25.5 → stable
- удалён temp-файл types.go.tmp.18500.1c9f4278a15a
- udprelay/loop.go: defer conn1/conn2.Close() при сбое Dial; лог write-error

Безопасность/код:
- browserprofile: пермиссии 0644→0600
- bondserver: once.Do перед go readLane (ordering fix)
- cmd/server: err= → err:= (shadow fix в AfterFunc)
- vkauth/client: vkDelayRandom ctx-aware (возвращает error)
- captcha/manual: whitelist хостов в /generic_proxy (SSRF mitigation)

Инфра:
- .dockerignore: исключить .git/.github/notes/dist из build context
- docker-compose.yml: env_file .env для OBF_KEY
- entrypoint.sh: позиционные аргументы вместо unquoted vars; валидация host:port

CI:
- ci.yml: исправлен путь go module cache (~/go/pkg/mod); добавлен -race
- .gitignore: добавлены /dist/, *.test, coverage.out, .env, *.tmp
- .golangci.yml: добавлены gosec и staticcheck
- routes-macos.sh: set -eu вместо set -u

Код:
- bondclient/bondserver: errors.Is(err, io.EOF) вместо err != io.EOF
- cmd/client: константа dtlsHandshakeConcurrency для HandshakeSem

Доки:
- quickstart.md: добавлен Intel Mac (darwin-amd64)
- build.md: версия Go, Windows/macOS cross-compile инструкции
- flags.md: уточнено описание -bond
2026-05-21 20:14:45 +03:00
samosvalishe 6fb3b69b1c build(docker): обновить docker-compose.yml под новые env-переменные
VLESS_MODE/WRAP_MODE/WRAP_KEY → MODE/OBF_MODE/OBF_KEY;
убрать VK_TURN_KCP_PROFILE/VK_TURN_KCP_FEC (env-загрузка удалена)
2026-05-21 19:24:43 +03:00
samosvalishe 278903ff24 build(docker): обновить entrypoint под новые флаги
VLESS_MODE/WRAP_MODE/WRAP_KEY → MODE/OBF_MODE/OBF_KEY;
флаги -vless/-wrap/-wrap-key → -mode tcp/-obf/-obf-key
2026-05-21 19:19:48 +03:00
samosvalishe 1e0ee55e48 docs: обновить документацию под новые флаги
-wrap/-vless/-udp/-vk-link/-dns заменены на -obf/-mode/-transport/-link/-dns-mode
2026-05-21 19:19:44 +03:00
samosvalishe 31e35efbf3 refactor: переименовать флаги и поля CLI/конфига
- wrap → obf: -wrap/-wrap-key/-gen-wrap-key → -obf/-obf-key/-gen-obf-key;
  ObfOpts.WrapMode/WrapKey/GenWrapKey → Mode/Key/GenKey
- vless → mode: -vless/-vless-bond → -mode tcp / -bond;
  clientProxyMode/serverProxyMode принимают string вместо bool
- -udp → -transport tcp|udp; TURNOpts.UDP → TransportUDP (везде)
- -vk-link → -link; -dns → -dns-mode; DNSModeUDP → DNSModePlain ("plain")
- KCP: убрать LoadProfileFromEnv/LoadFECFromEnv — хардкодить DefaultProfile/FEC{}
- Добавить валидацию -transport/-mode/-bond/-dns-mode в ParseClient/ParseServer
2026-05-21 19:19:40 +03:00
samosvalishe 6c3d3d341c chore(lint): расширить golangci-конфиг и устранить замечания
- Добавить nilerr, contextcheck, noctx, unconvert, unparam, gocritic, prealloc;
  убрать пресет std-error-handling и check-blank
- Заменить net.Dial/Listen/ListenPacket на context-aware варианты в tcpfwd,
  bondserver, tcpfwdserver, udprelay, udpserver
- Убрать параметр typ из writeToNextLane (всегда FrameData)
- Убрать лишний DohEndpoint из возвращаемых значений forwardRaw
- Анонимные receivers для методов без доступа к self (logx, vkauth, doh)
- Переименовать неиспользуемые параметры в _ (bondclient, bondserver, netconn,
  dtlsdial тесты)
- cmd/client: unlambda fix StreamsAlive → connectedStreams.Load
2026-05-21 16:49:59 +03:00
samosvalishe dfbfae2901 fix(docker): исправить сборку, добавить compose, убрать VLESS_BOND
- Dockerfile: путь ./cmd/vk-turn-server → ./cmd/server (образ был сломан)
- docker-entrypoint.sh → docker/entrypoint.sh; удалён VLESS_BOND (флаг удалён
  ранее, падал при VLESS_BOND=true); добавлен DEBUG env
- docker-compose.yml: host network, WireGuard-дефолт, все опции закомментированы
  inline; достаточно docker compose up -d
- docs/deploy.md: compose как primary workflow, таблица env дополнена
2026-05-21 16:26:04 +03:00
samosvalishe f3166c0bae docs: переместить route-скрипты в scripts/, исправить пайп с -debug 2>&1
- routes.{sh,ps1,macos.sh} → scripts/; старые файлы из корня удалены
- унифицирован парсинг: TURN server IP, relayed-address=, CIDR, plain IP
- исправлен баг доки: логи клиента идут в stderr, пайп требует -debug 2>&1
- quickstart.md переписан: секция маршрутов, команды трёх платформ
- troubleshooting.md: обновлены пути и примечание про -debug
2026-05-21 16:22:51 +03:00
samosvalishe d1e80751c7 refactor: удалить пакет internal/auth
Multi-tenant авторизация была заглушкой (NopAuthenticator), которая никогда не
планировалась к реализации.

- удалён пакет internal/auth (TenantID, Authenticator, NopAuthenticator)
- bondserver.Registry: map[connKey] → map[uint64], убран параметр tenant
- tcpfwdserver: убран auth.Anonymous из вызова HandleStreamAfterMagic
- удалён тест TestRegistryTenantIsolation
2026-05-21 16:02:16 +03:00
samosvalishe 39b7d277fb chore: игнорировать *.tmp.* файлы 2026-05-21 12:38:30 +03:00
samosvalishe 4ac1f3e25c chore: убрать случайно добавленный .tmp файл 2026-05-21 12:37:03 +03:00
samosvalishe e417dac087 style: перевести комментарии на русский, убрать очевидные 2026-05-21 12:31:50 +03:00
samosvalishe ada9b949a4 fix: правки после рефакторинга
- bondserver: errors.Is для проверки smux.ErrGoAway (обёрнутые ошибки)
- bondserver: убрать лишнюю аллокацию в copyBackendToBond, зеркалит bondclient
- cmd/server: прерывать Accept-цикл при отмене ctx вместо warn-спама
- cmd/server: понизить лог выхода после таймаута с Error до Warn
2026-05-21 09:09:19 +03:00
samosvalishe 3b73d720f1 test: покрыть NopAuthenticator, GenerateSelfSignedCert, HandshakeSem
Минимальное покрытие для заготовки auth и хелперов dtlsdial:
- NopAuthenticator.Authenticate возвращает (Anonymous, nil)
- GenerateSelfSignedCert выдаёт рабочий сертификат с приватным ключом
- HandshakeSem блокирует захват при заполнении и уважает отмену ctx

Также документирует на Authenticator, что интерфейс stream-ориентирован; auth
UDP-режима получит отдельный token-based интерфейс.
2026-05-21 02:02:23 +03:00
samosvalishe c4b6774241 style: gofmt/goimports новых файлов
Применить gofmt и goimports к файлам, добавленным в недавних разбиениях
(udprelay/loop.go, udprelay/run.go, vkauth/token_oksession.go). Группы импортов
теперь по порядку stdlib / external / internal.
2026-05-21 02:01:24 +03:00
samosvalishe 71e3bb1f01 test(bondserver): тест изоляции tenant
Защищает от регрессии, где ключ map Registry откатывается с {Tenant, ConnID} к
голому ConnID. Один и тот же ConnID под двумя TenantID должен резолвиться в
разные serverConn.
2026-05-21 01:33:20 +03:00
samosvalishe 21138fef26 fix(dtlsdial): Dial использует хелпер GenerateSelfSignedCert внутри
Унификация 0b3d8a1 пропустила in-package место вызова: Dialer.Dial всё ещё звал
selfsign.GenerateSelfSigned напрямую вместо нового хелпера
GenerateSelfSignedCert. Маршрутизируем через хелпер, чтобы любая будущая правка
генерации сертификата применялась единообразно.
2026-05-21 01:33:18 +03:00
samosvalishe fba9a5e26d fix(udprelay): синхронизировать watcher-горутину с возвратом Run
fatalErr писался watcher-горутиной вне WaitGroup и читался после wg.Wait();
загрузке не хватало happens-after упорядочивания с записью. Заменено на
atomic.Pointer и канал watcherDone, который Run дренажит после отмены, так что
загрузка всегда видит полную запись.
2026-05-21 01:33:12 +03:00
samosvalishe 0e2d42c912 refactor(vkauth): разбить token.go на файлы по шагам
token.go теперь тонкий оркестратор (~75 строк). Каждый шаг VK-токена в своём
файле:
- token_request.go: хелпер doRequest (POST + browser-заголовки + JSON)
- token_anon.go: fetchAnonToken (шаг 1, login.vk.ru)
- token_call.go: fetchCallToken + captcha-loop + solveCaptcha (шаг 2)
- token_oksession.go: fetchOkRuSession (шаг 3, calls.okcdn.ru)
- token_creds.go: fetchTurnCreds (шаг 4, vchat.joinConversationByLink)

Публичный API (Client, getTokenChain, tokenChainFn) не изменён. Поведение
идентично оригиналу.
2026-05-21 01:26:21 +03:00
samosvalishe d82258f844 refactor(udprelay): разбить на run/loop/listener
Разбивает монолитный udprelay.go на 530 строк на три файла:
- run.go: Run, Deps, ErrFatal, Params, AuthHandler, GetCredsFunc
- loop.go: DTLSLoop, TURNLoop, oneDTLS, oneTURN
- listener.go: runListener, Packet, packetPool, inboundQueueCap

Поведение не изменено; чисто структурный рефакторинг.
2026-05-21 01:25:59 +03:00
samosvalishe 52271d0367 refactor(bondserver): tenant-scoped ключ Registry
Заменяет map[uint64]*serverConn на map[connKey]*serverConn, где connKey =
{auth.TenantID, uint64}. Предотвращает коллизии ConnID между tenant в будущих
multi-tenant развёртываниях. Все текущие вызовы передают auth.Anonymous, поэтому
поведение не изменено.

HandleStreamAfterMagic получает параметр tenant auth.TenantID; tcpfwdserver
передаёт auth.Anonymous, сохраняя single-tenant семантику. serverConn получает
поле tenantID под будущий per-tenant роутинг.
2026-05-21 01:25:05 +03:00
samosvalishe 65aa55b211 feat(auth): добавить заготовку Authenticator
Вводит internal/auth с TenantID, sentinel Anonymous, интерфейсом Authenticator
и NopAuthenticator (no-op, всегда возвращает Anonymous). doc.go описывает
планируемый multi-tenant поток (SQLite/HMAC/deeplink). Реальной реализации
пока нет.
2026-05-21 01:24:58 +03:00
samosvalishe 6b8b82f530 refactor(client): убрать deprecated-теги с package-level логгеров
cmd/client — однопроцессный CLI; package-level Log+SetLogger остаётся
каноническим API. captcha.Solve по-прежнему принимает явный логгер для DI.
Также осовременен backoffSteps через min().
2026-05-21 01:20:54 +03:00
samosvalishe 5735b4a297 fix(captcha/dnsdial): начать DI-миграцию package-level логгеров
captcha.Solve теперь принимает явный параметр logx.Logger, и captchaSession
использует его внутри; package-level переменная Log и SetLogger сохранены, но
помечены deprecated.

auto_solver.go обновлён, чтобы передавать captcha.Log в Solve, сохраняя текущую
обвязку до полного DI-прохода.

manual и dnsdial: SetLogger и Log помечены deprecated с пояснением для будущей
struct-based DI; поведение не изменено.
2026-05-21 01:14:43 +03:00
samosvalishe ef549dc2b8 fix(dtlsdial): унифицировать генерацию self-signed сертификата
Добавляет dtlsdial.GenerateSelfSignedCert() как единственное место создания
self-signed сертификата. cmd/server теперь использует его вместо прямого импорта
selfsign; Dialer.Dial уже использовал ленивый путь certOnce, который внутри
зовёт ту же функцию.
2026-05-21 01:11:08 +03:00
samosvalishe 14376016aa fix(client): применить HandshakeSem к VLESS-диалеру
dtlsdial.Dialer в VLESS-режиме теперь несёт тот же HandshakeSem (cap-3), что и
UDP-диалер, предотвращая неограниченное число конкурентных DTLS-handshake на
пути VLESS/bond.
2026-05-21 01:10:22 +03:00
samosvalishe f54f59bff9 fix(bondserver): отмена при spin из-за потери lane
writeToNextLane теперь зовёт c.cancel() сразу, когда removeLane возвращает
left==0, вместо ожидания таймаута через 10ms sleep-loop. Убирает spin, когда
все lane пропали, а readLane уже отменил контекст.
2026-05-21 01:09:54 +03:00
samosvalishe 9090d5894a fix(udprelay): параллельный старт стримов
Все N стримов теперь стартуют конкурентно. okchan оставлен только как лог-сигнал
первого успешного handshake; стримы 2..N больше не ждут завершения
DTLS-handshake стрима 1.
2026-05-21 01:09:49 +03:00
samosvalishe ac695603b7 fix(bondclient): слать Hello с реальным числом lane после фильтрации
Открыть все кандидатные стримы сначала, затем писать Hello с len(opened), чтобы
bondserver.waitForInitialLanes не зависал на lane, которые никогда не
открывались (закрыты/ошибка). Также документирует, почему клиентский write-retry
не зацикливается как серверный: набор lane клиента фиксирован на время жизни
Handle.
2026-05-21 00:43:48 +03:00
samosvalishe 6588544368 fix(udprelay): инкремент ConnectedStreams до ResetErrors
Конкурентные вызыватели HandleAuthError могли видеть устаревшие счётчики ошибок,
очищенные до того, как стрим стал виден в connected-счётчике. Переупорядочено
так, что снимок stream-alive идёт первым.
2026-05-21 00:43:42 +03:00
samosvalishe 7ffa21b8aa fix(captcha/manual): останавливать HTTP-сервер при отмене ctx
runCaptchaServerAndWait теперь делает select на ctx.Done вместе с keyCh и
закрывает listener в defer. Без этого, когда родительский manualCtx истекал
(3m), внутренняя горутина блокировалась на keyCh навсегда, оставляя
127.0.0.1:8765 занятым до выхода процесса. SolveViaProxy/SolveViaHTTP принимают
ctx и протягивают его; manualCaptchaSolver в cmd/client/main.go форвардит ctx
вместо того, чтобы его терять.
2026-05-21 00:43:36 +03:00
samosvalishe 242862397a chore: переименовать модуль в github.com/samosvalishe/btp; обновить зависимости
- путь модуля: github.com/cacggghp/vk-turn-proxy → github.com/samosvalishe/btp
- директории cmd: cmd/vk-turn-{client,server} → cmd/{client,server}
- зависимости: pion/turn v5.0.4, kcp-go v5.6.72, smux v1.5.57, x/crypto v0.51,
  klauspost/{compress,cpuid,reedsolomon}, x/{net,sys,text,tools,mod,time}
- README, workflows, GLOSSARY обновлены под новые пути
2026-05-20 12:39:26 +03:00
samosvalishe 4a962d8264 refactor(bondframe): вынести Reorder; разделить между bondclient и bondserver 2026-05-20 11:55:35 +03:00
samosvalishe 7b4d6be1d8 refactor(netconn): вынести BiCopy; использовать в tcpfwd и tcpfwdserver 2026-05-20 11:54:00 +03:00
samosvalishe 483e45d68a refactor(kcptun): передавать Profile/FEC явно через config вместо process-wide env 2026-05-20 11:52:27 +03:00
samosvalishe 9459e94066 perf(bondserver): убрать аллокацию snapshotLanes на каждый retry записи 2026-05-20 11:49:50 +03:00
samosvalishe 2b24471553 refactor(tcpfwd): заменить busy-loop poll пула на Ready-канал; тихий accept-цикл при shutdown 2026-05-20 11:49:21 +03:00
samosvalishe 1459f39551 fix(udprelay): ctx-aware jitter-паузы; учёт listener в WaitGroup; всплытие ошибки записи DTLS 2026-05-20 11:48:44 +03:00
samosvalishe fb711c12f5 fix(server): ограниченное ожидание второго сигнала; предупреждение при выключенном -wrap 2026-05-20 11:47:59 +03:00
samosvalishe a8361f3bdf fix(bondframe): ограничить размер ReadFrame значением MaxChunk 2026-05-20 11:47:21 +03:00
samosvalishe d292d3084f fix: описание флагов 2026-05-20 11:33:28 +03:00
samosvalishe 9d7d754740 refactor(logging): унифицировать stdlib log.* в logx по client/cmd
internal/client/captcha, captcha/manual, dnsdial: добавить package-level Log +
SetLogger; убрать прямой обход -debug через stdlib log.Printf. cmd/{client,
server}/main.go: сначала строить logger, весь вывод через logger.{Info,Warn,
Error}f; оставлен один log.Fatalf только для сбоя разбора конфига до логгера.
dnsdial: log.Panicf → panic(fmt.Sprintf).

Исправлены уровни:
- vkauth/token.go: пути [FATAL] теперь Errorf; Auto/Manual captcha failed →
  Warnf; ignored-cleanup-error → Debugf.
- vkauth/client.go: HandleAuthError/cache invalidated → Warnf; throttle wait →
  Debugf; Failed-with-client_id → Warnf.
- udprelay: "Backing off 60s" + SetDeadline failed → Warnf.
- captcha: PoW/show_type/check status/debug_info → Debugf; endSession/close-body/
  script-drift → Warnf.

Префиксы нормализованы к [STREAM %d] [Pkg] msg / [Pkg] msg.
2026-05-20 11:26:21 +03:00
samosvalishe 52e7cb83e6 fix: утечки, уровни logx, обход логгера
- logx: добавить префиксы [DEBUG]/[INFO]/[WARN]/[ERROR]; уровни были
  неразличимы в выводе (всё шло через голый log.Printf).
- logx: добавить хелпер OrNop для nil-проверок на стороне конструктора.
- vkauth/{client,token}.go: заменить прямой log.Printf на c.log.Infof
  (97 мест обходили унифицированный логгер после прошлого рефакторинга).
- udprelay.oneTURN: буферизовать error chan (cap 1) + select на ctx.Done в
  TURNLoop — небуферизованный send блокировался навсегда, когда TURNLoop
  выходил по ctx до чтения, утекали горутина + TURN-стрим.

- udprelay: перенести write-цикл conn2->relay в wg.Go (был голый go func, мог
  пережить wg.Wait и читать из закрытого conn).
- udprelay.TURNLoop: заменить time.Sleep(2s) на select+ctx, чтобы shutdown не
  блокировался per-stream.
- udprelay.Run / tcpfwd.Run: возвращать error вместо log.Panicf при сбое listen;
  cmd/* теперь log.Fatalf на всплывшей ошибке.
- cmd/*: log.Panicf → log.Fatalf для CLI-ошибок (без stack trace на плохой флаг).
- kcptun.NewKCPOverDTLS: закрывать серверный kcp.Listener на error-путях после
  SetDeadline/AcceptKCP (утекал при любом сбое).
- doc пакета udprelay: переписать устаревшее утверждение "avoid importing
  vkauth" (файл импортирует vkauth ради sentinel-ошибок).
- udprelay: lifecycle-сообщения ("Established/Closed DTLS connection")
  Errorf → Infof; строка "relayed-address" под DebugEnabled использует Debugf.
- tcpfwd: lifecycle-сообщения ("connected/disconnected/waiting/listening")
  Errorf → Infof, "failed to wrap listener" → Warnf.
- tcpfwd.maintainSession doc: "fixed 2-3s backoff" было неверно (3s при сбое
  setup, 2s после disconnect).
- pool.go doc: "bond client (in main)" → internal/proxy/bondclient.
- srtpmimicry.Unwrap: doc предупреждает, что AEAD открывает in-place внутри
  wire, поэтому вызыватели должны считать wire потреблённым.
- комментарии-алиасы GetCredsFunc udprelay/tcpfwd: убрать фикцию "cmd/main
  wiring stability" (всё в internal/).

Build чисто, go vet чисто, все тесты проходят.
2026-05-19 22:24:21 +03:00
samosvalishe aff95e87d3 refactor: унифицировать логирование в internal/proxy/* через logx.Logger
Заменяет прямой log.Printf на logger.Errorf/Debugf в каждом proxy-пакете
(udprelay, tcpfwd, bondclient, bondserver, udpserver, tcpfwdserver). Вывод
остаётся совместимым (под капотом stdlib log), но теперь может быть глобально
перенаправлен сменой реализации Logger.

Тесты + lint проходят.
2026-05-19 21:57:33 +03:00
samosvalishe 51bda46446 refactor: симметрия, вынос серверных хендлеров
- internal/proxy/udpserver: handleUDPConnection вынесен из server-main
- internal/proxy/tcpfwdserver: handleVLESSConnection + prefixedConn + pipeConn
  вынесены из server-main
- cmd/vk-turn-server/main.go: 396 → 134 строк, глобалы убраны
- internal/proxy/udprelay: добавлен entrypoint Run() симметрично tcpfwd.Run;
  Pool → packetPool (unexported); listener+fan-in вынесены из client-main
- cmd/vk-turn-client/main.go: 262 → 130 строк, package-глобалы убраны
- dtlsdial.Dialer: кеш self-signed сертификата на Dialer (sync.Once) вместо
  регенерации на каждый handshake
- captcha.solveCaptchaPoW: переиспользование буфера (вместо 10M конкатенаций
  строк), ctx-проверка каждые 1024 итерации (было 4096)

Тесты + lint проходят.
2026-05-19 21:53:13 +03:00
samosvalishe ed6825976a fix: исправить баги, sentinel-ошибки, устаревшие доки
Баги:
- udprelay: errors.Is(DeadlineExceeded) вместо сравнения строк; короткий
  backoff в ветке lockout; обернуть DTLS-ошибку через %w
- bondserver.copyBondToBackend: лимит pending-map в 1024 (паритет с bondclient)
- srtpmimicry.RelayPacketConn: bufPool для горячего UDP-пути (паритет с listen.go)
- vkauth.token.go: ручной солвер под ctx.WithTimeout(ctx, ...) вместо Background
  — нет утечки горутины при shutdown

Гигиена:
- sentinel-ошибки vkauth как var = errors.New(...); вызыватели используют errors.Is
- убраны устаревшие комментарии этапов рефакторинга (Pion SPDX, "Package bond",
  internal/bond, удалённый файл заметок)
- .gitignore: *.exe, *.so

Тесты + lint проходят.
2026-05-19 21:47:48 +03:00
samosvalishe 7e3369f478 docs: заметка DTLS-как-обфускация + breaking changes в README
- internal/transport/dtlsdial/doc.go: объяснить, что DTLS используется как слой
  обфускации под content-фильтр VK TURN, а не как граница безопасности;
  задокументировать, почему -no-dtls был убран и почему решения вроде
  self-signed сертификатов / send-only CID намеренны.
- README: добавить врезку breaking-changes под "Защита от блокировок"; убрать
  строки -no-dtls и server -vless-bond из таблиц флагов; отметить, что bond
  автоопределяется по magic-префиксу на сервере.

Завершает рефакторинг. Все этапы зелёные: go build / go vet / go test / gofmt.
CLI и wire-форматы бит-в-бит кроме двух удалений (-no-dtls на клиенте,
-vless-bond на сервере).
2026-05-19 21:18:58 +03:00
samosvalishe 6c9bfbae82 refactor(config): сгруппировать опции по доменам
Заменяет плоские структуры config.Client / config.Server на
доменно-сгруппированные под-структуры, чтобы форма повторяла концептуальные
слои прокси:

  type Client struct {
      TURN  TURNOpts   // Host, Port, UDP, N
      Obf   ObfOpts    // WrapMode, WrapKey, GenWrapKey
      Proxy ProxyOpts  // Mode, Listen, Peer
      VK    VKOpts     // Link, StreamsPerCred, ManualCaptcha
      DNS   DNSOpts    // Mode, Servers
      Log   LogOpts    // Debug
  }
  type Server struct { Obf; Proxy{Mode, Listen, Connect}; Log }

Enum ProxyMode (udp | tcpfwd | tcpfwd-bond) заменяет два параллельных bool
VLESSMode / VLESSBond в коде вызывающих. Поверхность CLI (-vless, -vless-bond)
не изменена; clientProxyMode / serverProxyMode в Parse* мапят bool в enum.

cmd/vk-turn-{client,server}/main.go: каждый cfg.X теперь cfg.Group.X. Тесты
обновлены; новый TestParseClient_ProxyMode покрывает все четыре комбинации
флагов (включая -vless-bond без -vless, который молча игнорируется как и раньше).

Без изменений флагов CLI, дефолтов, поведения и wire-формата. go build /
go vet / go test / gofmt чисто.
2026-05-19 20:59:23 +03:00
samosvalishe e212465f83 refactor(proxy): вынести общие хелперы (минимальный объём)
Исходный план просил proxy.Engine + интерфейс Handler, объединяющий udprelay и
tcpfwd. После разбора кода заявленные ~70% пересечения оказались ближе к ~30
строкам: udprelay (WG → DTLS-terminate → wrap → TURN) и tcpfwd (TCP → smux →
KCP → DTLS → wrap → TURN) наслаивают wrap/DTLS по-разному и имеют разные
жизненные циклы. Engine с двумя if-ветками просто загнал бы дублирование внутрь,
а не убрал.

Объём минимальный: новый пакет internal/proxy/common с тем, что реально
идентично:

  - тип GetCredsFunc (дублировался в обоих пакетах).
  - DialTURN(ctx, host, port, udp, peer, link, streamID, getCreds) — берёт creds
    и открывает turndial-стрим. Политика retry на auth-ошибке остаётся в udprelay.
  - NewClientWrap(key) — возвращает (nil, nil) при пустом/коротком ключе, иначе
    srtpmimicry.NewConn(key, false).

udprelay и tcpfwd теперь импортируют common.DialTURN / common.NewClientWrap.
Их локальные объявления GetCredsFunc становятся type alias на
common.GetCredsFunc, чтобы связка cmd/vk-turn-client компилировалась без churn.

bond-as-tcpfwd-option отменён вместе с интерфейсом Handler; bondclient остаётся
отдельным пакетом, подключённым через Deps.BondHandler.

Без изменений wire-формата, флагов CLI и поведения. go build / go vet /
go test / gofmt чисто.
2026-05-19 20:52:02 +03:00
samosvalishe 1fb869b3e1 refactor(layout): переименовать пакеты (split wire/transport/proxy)
internal/wrap → internal/wire/srtpmimicry; правки doc ("обфускация, не security").
internal/bond/{frame,client,server} → internal/wire/bondframe,
internal/proxy/bondclient, internal/proxy/bondserver.
internal/netadapt → internal/netconn.
internal/turnpipe → internal/transport/turndial; internal/dtlsdial →
internal/transport/dtlsdial.
tcputil → internal/transport/kcptun; selectedKCPProfile и selectedFEC теперь
кешируются через sync.Once (env читается один раз вместо per-connection).
internal/proxy/udp → internal/proxy/udprelay; internal/proxy/vless →
internal/proxy/tcpfwd. Флаг CLI -vless сохранён.
internal/ish → internal/client/ish; doc пакета расширен (iSH = Linux user-mode
эмулятор на iOS, только linux/386).

Чисто механическое переименование + обновление import-путей/идентификаторов.
Wire-формат, флаги CLI и поведение не изменены. go build + go test зелёные.
2026-05-19 20:42:46 +03:00