Чек-лист реализации
Пошаговое руководство по повторной реализации 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: Основной конвейер
Transport Link
- [ ]
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
Для минимально жизнеспособного прокси:
- Buffer + Pipe — фундамент
- Dispatcher + Router — основной конвейер (можно начать с простой маршрутизации по тегам)
- TCP Transport + TLS — связность
- Freedom outbound — прямые соединения
- Протокол VLESS — один полный протокол (inbound + outbound)
- Сниффинг — как минимум TLS SNI для маршрутизации на основе доменов
- DNS — базовый UDP DNS-резолвер
Это даст вам работающий VLESS-прокси. Добавляйте функции инкрементально.