Skip to content

Чек-лист реализации

Пошаговое руководство по повторной реализации Xray-core в другом фреймворке. Элементы упорядочены по зависимостям — более ранние элементы необходимы для более поздних.

Фаза 1: Фундамент

Система буферов

  • [ ] Реализовать пулируемый байтовый буфер (размер по умолчанию 8 КБ, эквивалент sync.Pool)
  • [ ] Курсоры начала/конца для нарезки без копирования
  • [ ] MultiBuffer (список буферов) для пакетного ввода-вывода
  • [ ] Поле Buffer.UDP для метаданных назначения для каждого пакета
  • [ ] Интерфейсы Reader / Writer с ReadMultiBuffer() / WriteMultiBuffer()
  • [ ] Цикл Copy(reader, writer) с callback-функцией таймера активности
  • [ ] BufferedWriter для пакетной отправки заголовка + первой полезной нагрузки

Pipe

  • [ ] Двунаправленный pipe: New() -> (Reader, Writer)
  • [ ] Обратное давление: настраиваемый лимит размера, блокировка при записи когда полон
  • [ ] Уведомление на основе сигналов (неблокирующий сигнал, блокирующее ожидание)
  • [ ] Экземпляр Done для уведомления о закрытии
  • [ ] Поддержка чтения с таймаутом (ReadMultiBufferTimeout)

Сетевые примитивы

  • [ ] Тип Address: IPv4, IPv6, Domain
  • [ ] Тип Destination: Network (TCP/UDP) + Address + Port
  • [ ] AddressParser: сериализация (байт типа + адрес) с порядком порт-затем-адрес

Контекст сессии

  • [ ] Метаданные Inbound: Source, Tag, User, Conn, CanSpliceCopy
  • [ ] Метаданные Outbound: Target, OriginalTarget, RouteTarget, Tag, CanSpliceCopy
  • [ ] Метаданные Content: Protocol, SniffingRequest, Attributes
  • [ ] Передача контекста через все вызовы

Фаза 2: Основной конвейер

  • [ ] Link = пара (Reader, Writer)
  • [ ] Создание пары pipe: inboundLink <-> outboundLink (перекрёстное подключение)

Диспетчер

  • [ ] Dispatch(ctx, destination) -> Link (асинхронная маршрутизация)
  • [ ] DispatchLink(ctx, destination, link) (синхронная маршрутизация)
  • [ ] Создание пары pipe с обёртками статистики
  • [ ] cachedReader для сниффинга без потребления данных
  • [ ] Конвейер сниффинга: HTTP, TLS SNI, QUIC, BitTorrent, FakeDNS
  • [ ] Логика решения shouldOverride()
  • [ ] RouteOnly против полного переопределения
  • [ ] routedDispatch() — принудительный тег -> маршрутизатор -> outbound по умолчанию

Сниффер

  • [ ] Определение HTTP-метода + заголовка Host
  • [ ] Извлечение TLS ClientHello SNI
  • [ ] Извлечение SNI из начального пакета QUIC
  • [ ] Определение протокола BitTorrent
  • [ ] Сниффер метаданных FakeDNS (поиск в пуле IP)
  • [ ] Составной результат (домен метаданных + протокол содержимого)
  • [ ] Таймаут 200 мс, максимум 2 попытки

Маршрутизатор

  • [ ] Последовательная проверка правил (первое совпадение побеждает)
  • [ ] Матчеры доменов: Full, Domain (суффикс), Substr, Regex
  • [ ] Матчеры IP: диапазон CIDR с бинарным поиском
  • [ ] Матчеры портов: точные и диапазоны
  • [ ] Матчеры Network, Protocol, User, InboundTag
  • [ ] Загрузка файлов GeoIP .dat
  • [ ] Загрузка файлов GeoSite .dat
  • [ ] Стратегия доменов: AsIs, IPIfNonMatch, IPOnDemand
  • [ ] Балансировщики: random, roundRobin, leastPing, leastLoad

Система функциональных модулей

  • [ ] Реестр модулей (сопоставление тип -> экземпляр)
  • [ ] Разрешение зависимостей (эквивалент RequireFeatures)
  • [ ] Реестр конфигураций (тип protobuf -> фабричная функция)
  • [ ] Жизненный цикл экземпляра: создание -> добавление модулей -> разрешение -> запуск

Фаза 3: Транспортный уровень

Реестр транспорта

  • [ ] RegisterTransportDialer(name, dialer)
  • [ ] RegisterTransportListener(name, listener)
  • [ ] MemoryStreamConfig (конфигурация транспорта + безопасности времени выполнения)
  • [ ] Dialer: Dial(ctx, dest) -> Connection
  • [ ] Listener: приём соединений с callback-функцией

TCP-транспорт

  • [ ] Базовое TCP-подключение и прослушивание
  • [ ] Опции сокетов: SO_MARK, TCP_FASTOPEN, SO_REUSEPORT
  • [ ] Happy Eyeballs (RFC 8305) для двойного стека
  • [ ] Поддержка TProxy / Redirect (Linux)

Безопасность TLS

  • [ ] Стандартный TLS с настраиваемыми сертификатами
  • [ ] Отпечатки uTLS (Chrome, Firefox, Safari и т.д.)
  • [ ] Согласование ALPN
  • [ ] Закрепление сертификатов

Безопасность REALITY

  • [ ] Сервер: имитация реального TLS-сервера, аутентификация Short ID
  • [ ] Клиент: uTLS с пользовательским SessionID
  • [ ] CA не требуется (используется реальный сертификат целевого сервера)

Дополнительные транспорты (реализация по необходимости)

  • [ ] WebSocket (gorilla/websocket или аналог)
  • [ ] gRPC (двунаправленная потоковая передача)
  • [ ] HTTPUpgrade (HTTP/1.1 Upgrade)
  • [ ] SplitHTTP (POST загрузка + GET скачивание)
  • [ ] mKCP (надёжный UDP-транспорт)

Фаза 4: Протоколы прокси

VLESS (приоритет: высокий)

  • [ ] Заголовок запроса: версия + UUID + addons + команда + адрес
  • [ ] Заголовок ответа: версия + addons
  • [ ] Кодирование/декодирование protobuf Addons
  • [ ] Валидатор пользователей (UUID -> поиск аккаунта)
  • [ ] Inbound: декодирование заголовка, аутентификация, диспетчеризация
  • [ ] Outbound: кодирование заголовка, подключение к транспорту, двунаправленное копирование
  • [ ] Система фоллбэков: имя -> ALPN -> путь
  • [ ] UDP: пакеты с префиксом длины (2Б + полезная нагрузка)
  • [ ] Обнаружение и обработка Mux
  • [ ] Обнаружение XUDP (session=0, network=UDP)

VLESS Vision (приоритет: высокий для производительности)

  • [ ] Отслеживание TrafficState для каждого соединения
  • [ ] XtlsPadding: заполнение переменной длины с командой
  • [ ] XtlsUnpadding: удаление заполнения, разбор команд
  • [ ] XtlsFilterTls: определение версии TLS из ServerHello
  • [ ] VisionWriter: заполнение во время рукопожатия, переключение на прямой режим при AppData
  • [ ] VisionReader: удаление заполнения, обнаружение команды прямого копирования
  • [ ] Поддержка прямого копирования / splice

Freedom (приоритет: высокий)

  • [ ] Прямое исходящее соединение
  • [ ] Стратегия доменов: AsIs, UseIP, UseIPv4, UseIPv6
  • [ ] Переопределение / перенаправление назначения
  • [ ] Фрагментация TLS ClientHello (опция Fragment)

VMess

  • [ ] AEAD-заголовок: auth ID + длина (AES-GCM) + команда (AES-GCM)
  • [ ] Шифрование тела: AES-128-GCM, ChaCha20-Poly1305, без шифрования
  • [ ] Nonce для каждого сообщения со счётчиком
  • [ ] Аутентификация на основе времени (+/-120 с)

Trojan

  • [ ] SHA224(password) + CRLF + команда + адрес + CRLF
  • [ ] Поддержка фоллбэков
  • [ ] UDP-фрейминг (2Б длина + полезная нагрузка)

Shadowsocks

  • [ ] AEAD: AES-128/256-GCM, ChaCha20-Poly1305
  • [ ] Деривация ключей (HKDF)
  • [ ] Защита от повторов (фильтр nonce)
  • [ ] Shadowsocks 2022 (через sing-shadowsocks или собственная реализация)

Другие протоколы

  • [ ] SOCKS5 (RFC 1928)
  • [ ] HTTP-прокси (CONNECT + plain)
  • [ ] Dokodemo-door (прозрачный прокси)
  • [ ] Blackhole (пустой приёмник)
  • [ ] Loopback (повторный вход в маршрутизацию)

Фаза 5: Расширенные функции

Mux

  • [ ] Формат фрейма: meta_len + session_id + status + option + address
  • [ ] Клиент: пул ClientManager -> ClientWorker
  • [ ] Сервер: демультиплексирование ServerWorker + диспетчеризация
  • [ ] Управление сессиями (создание, данные, закрытие, keepalive)

XUDP

  • [ ] PacketWriter: адресация для каждого пакета в mux-фреймах
  • [ ] PacketReader: извлечение назначения для каждого пакета
  • [ ] GlobalID: хэш BLAKE3 адреса источника
  • [ ] Флаг контекста Cone-режима

DNS

  • [ ] Мульти-серверный DNS с маршрутизацией на основе доменов
  • [ ] Бэкенды UDP, TCP, DoH, DoQ
  • [ ] Кэширование с TTL
  • [ ] Пул Fake-IP (LRU, выделение на основе CIDR)
  • [ ] Интеграция со сниффингом диспетчера

TUN

  • [ ] Создание TUN-устройства для конкретной платформы
  • [ ] IP-стек в пространстве пользователя (gVisor или альтернатива)
  • [ ] TCP-форвардер (рукопожатие -> net.Conn)
  • [ ] Обработчик UDP Full-Cone NAT
  • [ ] Построение сырых UDP-пакетов для обратного пути

Статистика

  • [ ] Счётчики трафика по пользователям
  • [ ] Отслеживание пользователей онлайн
  • [ ] Обёртка SizeStatWriter

Прочее

  • [ ] Обратный прокси (Bridge + Portal)
  • [ ] Observatory (проверка работоспособности)
  • [ ] Commander (gRPC API управления)
  • [ ] Политики (таймауты, размеры буферов, по уровням)

Фаза 6: Конфигурация

  • [ ] Парсинг JSON-конфигурации
  • [ ] Преобразование конфигурации в объекты времени выполнения
  • [ ] Создание обработчиков inbound/outbound
  • [ ] Настройки потока (транспорт + безопасность)
  • [ ] Конфигурация сниффинга
  • [ ] Конфигурация правил маршрутизации

Приоритетный порядок для MVP

Для минимально жизнеспособного прокси:

  1. Buffer + Pipe — фундамент
  2. Dispatcher + Router — основной конвейер (можно начать с простой маршрутизации по тегам)
  3. TCP Transport + TLS — связность
  4. Freedom outbound — прямые соединения
  5. Протокол VLESS — один полный протокол (inbound + outbound)
  6. Сниффинг — как минимум TLS SNI для маршрутизации на основе доменов
  7. DNS — базовый UDP DNS-резолвер

Это даст вам работающий VLESS-прокси. Добавляйте функции инкрементально.

Технический анализ для целей повторной реализации.