Files
sdm-xray/ARCHITECTURE.md
ded_ikar 9f6bff6704 sdm-xray v0.2.2: self-signed mode, uninstall.sh, panel v3 (TLS/REALITY, stats, backup), tests, docs
Added:
- install.sh --selfsigned: no-domain mode with pinnedPeerCertSha256
- uninstall.sh: full removal of what install.sh deploys
- Panel v3: TLS/REALITY switch, client rename, log level, backup/restore,
  version+cert status, traffic stats (xray stats API)
- Auto-pin for self-signed certs in generated configs/links
- Go tests (14 tests, all passing)
- CHANGELOG.md, ARCHITECTURE.md, README.md rewrite
- Email defaults to UUID when client name is empty (fixes stats)

Fixed:
- install.sh SIGPIPE and double-v banner
- Mirror drained body bug (iana.org)
2026-08-17 19:11:41 +05:00

4.8 KiB
Executable File

Архитектура sdm-xray

Документ для разработчиков. Для установки/использования — см. README.


Топология

клиент (ПК/роутер)
  → SOCKS5 127.0.0.1:10808
  → VLESS + stealth (свой фрейминг, HTTP/2, ротация путей)
  → TLS 1.3 (uTLS chrome, ALPN h2)
  → VPS:443
    → xray (сервер) → интернет
    → GET/HEAD от зондов → зеркало реального сайта

Транспорт stealth

Кастомный транспорт Xray-core (поле network: "stealth" в streamSettings). Каждая сессия = один HTTP/2 POST-стрим (bidirectional).

Wire-протокол

[TLS 1.3] → [HTTP/2 POST на путь] → [тело: кадры]

Формат кадра: [4B длина][1B тип][payload]

Тип Значение Смысл
DATA 0x01 Данные туннеля (VLESS-поток)
PAD 0x02 Padding (читатель пропускает)
AUTH 0xFE Первый кадр тела запроса (ключ)
CLOSE 0xFF Закрытие

Поведение сервера

  • POST на туннельный путь + AUTH → туннель (200 + двунаправленный обмен)
  • POST без ключа/неверный ключ → 404 + закрытие
  • GET/HEAD (не-туннельные) → reverse-proxy на target (зеркало)

Зеркало

Сервер реверсивно проксирует GET/HEAD запросы на target (реальный сайт). Переписывает Location, HTML-ссылки (href/src/content), CSS url() на свой домен. Лимит тела: 8МБ. Accept-Encoding: identity (для переписывания).

Файлы транспорта

transport/internet/stealth/:

  • config.proto + config.pb.go — protobuf-конфигурация
  • config.go — регистрация конфига в Xray
  • framing.go — чтение/запись кадров
  • conn.go — h2Conn (net.Conn поверх HTTP/2 стрима)
  • dialer.go — клиент (TLS/uTLS, ротация, ретрай, decoy)
  • hub.go — сервер (http.Server, зеркало, AUTH)

Изменённые файлы upstream:

  • infra/conf/transport_internet.go — case "stealth", поле StealthSettings
  • infra/conf/transport_method.go — struct StealthConfig + Build()

Сборка (WSL)

cd ~/xray-mod
export PATH="$PATH:/usr/local/go/bin"
GOOS=linux GOARCH=amd64  go build -o build/xray-server-amd64 ./main
GOOS=linux GOARCH=arm64  go build -o build/xray-client-arm64 ./main
GOOS=windows GOARCH=amd64 go build -o build/xray-client-win.exe ./main

Regen protobuf:

protoc -I. --go_out=. --go_opt=paths=source_relative transport/internet/stealth/config.proto

Панель:

cd ~/sdm-panel
GOOS=linux GOARCH=amd64 go build -o sdm-panel-linux-amd64 .

Деплой на VPS

# SFTP: build/xray-server-amd64 → /usr/local/xray/xray
# install -m 755, systemctl restart xray

Конфиги:

  • /etc/xray/config.json — основной конфиг xray
  • /etc/xray/panel.json — конфиг панели (bind/password/serverName)
  • /etc/xray/server.crt + /etc/xray/server.key — self-signed сертификат (selfsigned-режим)
  • /etc/letsencrypt/live/<domain>/ — LE-сертификат (доменный режим)

VPS (актуальные)

VPS Домен IP Система xray
Основная pay.dedikar.online 13.143.132.66 Ubuntu 24.04 978fd1a
Старая vds.dedikar.online 94.183.182.49 Ubuntu 24.04 8f75aa4

Интеграция в DedVpn.App

Копия: C:\Users\dedikar\PsiphonWarp\DedVpn.App

  • Services/Xray/XrayConfigBuilder.cs — эмит network: "stealth" + stealthSettings
  • Services/Xray/SingBoxConfigBuilder.cs — guard: stealth не поддерживается в sing-box
  • vless://-ссылка из панели → импорт в приложение
  • Runtime: патченый xray.exe в runtime/xray/xray.exe

Известные ограничения

  • HTTP/2 — один поток, throughput ограничен (~140 Мбит bulk, ~22 Мбит веб)
  • Оптимизации (flush-батчинг, окна HTTP/2) провалились — откачены
  • Стока REALITY быстрее (голый TLS), но stealth даёт уникальную маскировку
  • Клиент и сервер должны быть одной версии форка
  • На роутере (ARM Cortex-A53) — CPU для TLS является узким местом