Контрольный список реализации
Комплексный контрольный список для реимплементации sing-box, организованный по фазам. Каждая фаза базируется на предыдущих.
Фаза 1: Основа
Система конфигурации
- [ ] JSON-парсер с контекстно-зависимым реестром типов
- [ ] Корневая структура
Optionsсо всеми полями верхнего уровня - [ ] Тип
Listable[T](принимает одиночное значение или массив) - [ ] Тип
Duration(парсинг строк продолжительности Go) - [ ] Тип
NetworkList(одна строка или массив "tcp"/"udp") - [ ] Перечисление
DomainStrategy(as_is, prefer_ipv4, prefer_ipv6, ipv4_only, ipv6_only) - [ ] Перечисление
NetworkStrategy - [ ] Перечисление
InterfaceType(wifi, cellular, ethernet, other) - [ ] Тип
DNSQueryType(строковое имя или uint16) - [ ]
UDPTimeoutCompat(число-как-секунды или строка продолжительности) - [ ]
ServerOptions(server + server_port) - [ ]
ListenOptions(адрес прослушивания, порт, параметры сокета) - [ ]
DialerOptions(detour, bind, timeout, метка маршрутизации, сетевая стратегия) - [ ]
DomainResolveOptions(сокращённая строка или полный объект) - [ ] Полиморфный парсинг входящих/исходящих/эндпоинтов/сервисов/DNS через реестры типов
- [ ] Система тегов сборки / флагов функций для условного включения протоколов
- [ ] Валидация дублирования тегов для входящих и исходящих/эндпоинтов
Логирование
- [ ] Уровни логов: trace, debug, info, warn, error, fatal, panic
- [ ] Контекстно-зависимый логгер (контекст для каждого соединения)
- [ ] Наблюдаемая фабрика логов (для потоковой передачи логов Clash API)
- [ ] Поддержка вывода в файл
- [ ] Опция меток времени
- [ ] Опция цветного вывода
Жизненный цикл сервисов
- [ ] Этапы запуска: Initialize, Start, PostStart, Started
- [ ] Упорядоченный запуск сервисов с разрешением зависимостей
- [ ] Корректное завершение с распространением
Close() - [ ] Контекстный реестр сервисов (
service.FromContext[T])
Фаза 2: Основной конвейер
Интерфейсы адаптера
- [ ] Интерфейс
adapter.Inbound - [ ] Интерфейс
adapter.Outbound(сN.Dialer) - [ ] Интерфейс
adapter.Endpoint(двунаправленный: входящий + исходящий) - [ ] Интерфейс
adapter.Router - [ ] Структура метаданных
adapter.InboundContext - [ ]
adapter.ConnectionRouterExдля маршрутизации соединений - [ ]
adapter.OutboundManager(поиск по тегу, исходящий по умолчанию) - [ ]
adapter.InboundManager - [ ]
adapter.EndpointManager - [ ]
adapter.NetworkManager
Сетевые примитивы
- [ ] Интерфейс
N.Dialer(DialContext, ListenPacket) - [ ]
N.ExtendedConn(расширения буферизированного чтения/записи) - [ ]
N.PacketConn(сReadPacket/WritePacketдля zero-copy) - [ ] Утилиты
bufio(копирование, каналы, счётчики соединений) - [ ] Тип
M.Socksaddr(унифицированный addr:port с поддержкой FQDN) - [ ] Распространение метаданных соединения через контекст
Слушатель
- [ ] TCP-слушатель с настраиваемыми параметрами сокета
- [ ] UDP-слушатель с обработкой пакетного соединения
- [ ] Конфигурация keep-alive
- [ ] Поддержка TCP Fast Open
- [ ] Поддержка Multipath TCP
- [ ] Поддержка метки маршрутизации (
SO_MARK) - [ ] Поддержка сетевого пространства имён (
setns) - [ ] Поддержка привязки к интерфейсу
Дайлер
- [ ] Дайлер по умолчанию с параметрами сокета
- [ ] Дайлер с обходом (цепочка через другой исходящий)
- [ ] Привязка к интерфейсу
- [ ] Привязка к адресу (inet4/inet6)
- [ ] Распространение метки маршрутизации
- [ ] Таймаут подключения
- [ ] Интеграция разрешения доменов
- [ ] Сетевая стратегия (предпочтение определённых типов интерфейсов)
- [ ] Запасной дайлер (попытка нескольких сетей)
Маршрутизатор
- [ ] Конвейер сопоставления правил маршрутизации
- [ ] Стандартные типы правил (домен, IP, порт, процесс, сеть и т.д.)
- [ ] Логические правила (AND, OR с инверсией)
- [ ] Действия правил (route, reject, hijack-dns, sniff, resolve)
- [ ] Финальный исходящий (маршрут по умолчанию)
- [ ] Интеграция наборов правил
- [ ] Конвейер DNS-правил (отдельный от правил маршрутизации)
- [ ] Маршрутизация соединений с обогащением метаданных
Определение протокола
- [ ] Фреймворк определения протоколов
- [ ] Определение HTTP (метод + заголовок host)
- [ ] Определение TLS (SNI из ClientHello)
- [ ] Определение QUIC (SNI из QUIC ClientHello)
- [ ] Определение DNS (домен запроса)
- [ ] Определение SSH
- [ ] Определение RDP
- [ ] Определение BitTorrent
- [ ] Определение DTLS
- [ ] Обработка таймаута определения
- [ ] Опция переопределения назначения
Фаза 3: Транспортный уровень
TLS
- [ ] TLS-клиент (с SNI, ALPN, закреплением сертификата)
- [ ] TLS-сервер (сертификат, ключ, ACME)
- [ ] Клиент UTLS (отпечатки Chrome/Firefox/Safari)
- [ ] Reality клиент и сервер
- [ ] Поддержка ECH (Encrypted Client Hello)
- [ ] Оптимизация kTLS (Linux)
Транспорты V2Ray
- [ ] Транспорт WebSocket (клиент + сервер)
- [ ] Транспорт HTTP/2 (клиент + сервер)
- [ ] Транспорт gRPC (клиент + сервер)
- [ ] Транспорт HTTPUpgrade (клиент + сервер)
- [ ] Транспорт QUIC (клиент + сервер) [тег сборки: with_quic]
Мультиплекс (sing-mux)
- [ ] Клиент мультиплекса (протоколы smux, yamux, h2mux)
- [ ] Сервер мультиплекса
- [ ] Мультиплексирование потоков через одно соединение
- [ ] Поддержка заполнения
- [ ] Опция управления перегрузкой Brutal
- [ ] Конфигурация max connections / min streams / max streams
Фаза 4: Протоколы
Direct
- [ ] Прямой входящий (приём соединений и маршрутизация)
- [ ] Прямой исходящий (прямое подключение к назначению)
Block
- [ ] Блокирующий исходящий (отклонение соединений)
SOCKS
- [ ] Входящий SOCKS5 (с необязательной аутентификацией)
- [ ] Входящий SOCKS4/4a
- [ ] Исходящий SOCKS5 (клиент)
- [ ] SOCKS5 UDP ASSOCIATE
HTTP
- [ ] Входящий HTTP-прокси (CONNECT + простой HTTP)
- [ ] Исходящий HTTP CONNECT (клиент)
- [ ] Базовая/дайджест-аутентификация
Mixed
- [ ] Смешанный входящий (автоопределение HTTP/SOCKS5)
Shadowsocks
- [ ] Однопользовательский входящий Shadowsocks
- [ ] Многопользовательский входящий Shadowsocks
- [ ] Входящий Shadowsocks с ретрансляцией
- [ ] Исходящий Shadowsocks
- [ ] Шифры AEAD (aes-128-gcm, aes-256-gcm, chacha20-ietf-poly1305)
- [ ] Шифры AEAD 2022 (2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm, 2022-blake3-chacha20-poly1305)
- [ ] Ретрансляция UDP
- [ ] Поддержка плагинов SIP003 (obfs, v2ray-plugin)
- [ ] UDP-over-TCP (UoT)
VMess
- [ ] Входящий VMess
- [ ] Исходящий VMess
- [ ] Режимы безопасности: auto, zero, aes-128-gcm, chacha20-poly1305, aes-128-cfb, none
- [ ] Поддержка alterId (устаревшая)
- [ ] Опция глобального заполнения
- [ ] Опция аутентифицированной длины
- [ ] Кодирование пакетов: packetaddr, xudp
VLESS
- [ ] Входящий VLESS
- [ ] Исходящий VLESS
- [ ] Аутентификация на основе UUID
- [ ] Flow: xtls-rprx-vision
- [ ] Кодирование пакетов: packetaddr, xudp
Trojan
- [ ] Входящий Trojan
- [ ] Исходящий Trojan
- [ ] Хеширование пароля SHA-224 (56-байтовый hex-ключ)
- [ ] Ретрансляция UDP через протокол Trojan
ShadowTLS
- [ ] Входящий ShadowTLS (v1, v2, v3)
- [ ] Исходящий ShadowTLS
- [ ] Ретрансляция TLS-рукопожатия
Hysteria / Hysteria2 [тег сборки: with_quic]
- [ ] Входящий и исходящий Hysteria
- [ ] Входящий и исходящий Hysteria2
- [ ] Управление перегрузкой Brutal
TUIC [тег сборки: with_quic]
- [ ] Входящий и исходящий TUIC
- [ ] Мультиплексирование на основе QUIC
WireGuard [тег сборки: with_wireguard]
- [ ] Эндпоинт WireGuard (двунаправленный)
- [ ] Рукопожатие протокола Noise
- [ ] Управление пирами
Прочее
- [ ] Входящий NaiveProxy (и исходящий с тегом сборки)
- [ ] Исходящий Tor
- [ ] Исходящий SSH
Группы исходящих
- [ ] Группа Selector (ручной выбор с сохранением)
- [ ] Группа URLTest (автоматический выбор по задержке)
- [ ] Реализация URL-теста
- [ ] Хранилище истории тестов
Фаза 5: DNS
Система DNS
- [ ] DNS-маршрутизатор с выбором транспорта на основе правил
- [ ] DNS-кэш с TTL
- [ ] Ограничение ёмкости кэша
- [ ] Независимый кэш для каждого правила
- [ ] Подсеть клиента (EDNS0)
- [ ] Применение стратегии домена (разрешение A/AAAA/оба)
DNS-транспорты
- [ ] UDP DNS-транспорт
- [ ] TCP DNS-транспорт
- [ ] TLS DNS-транспорт (DoT)
- [ ] HTTPS DNS-транспорт (DoH)
- [ ] QUIC DNS-транспорт (DoQ) [тег сборки: with_quic]
- [ ] HTTP/3 DNS-транспорт [тег сборки: with_quic]
- [ ] Локальный системный DNS-транспорт
- [ ] DNS-транспорт файла hosts
- [ ] DNS-транспорт FakeIP
- [ ] DHCP DNS-транспорт [тег сборки: with_dhcp]
FakeIP
- [ ] Пул адресов FakeIP (IPv4 + IPv6)
- [ ] Выделение и переиспользование адресов
- [ ] Двунаправленное сопоставление (адрес <-> домен)
- [ ] Постоянное хранение в файле кэша
- [ ] Сохранение метаданных (указатель выделения)
Правила DNS
- [ ] Сопоставление правил DNS (домен, источник, тип запроса и т.д.)
- [ ] Действия правил DNS (route, reject, предопределённый ответ)
- [ ] Кэш отклонённых DNS-ответов (RDRC)
Фаза 6: Расширенные функции
Наборы правил
- [ ] Чтение двоичного формата SRS
- [ ] Запись двоичного формата SRS
- [ ] Чтение исходного формата JSON
- [ ] Локальный набор правил с наблюдением за файлом
- [ ] Удалённый набор правил с HTTP-загрузкой и кэшированием ETag
- [ ] Встроенные наборы правил
- [ ] Подсчёт ссылок набора правил и управление памятью
- [ ] Метаданные набора правил (флаги process/WIFI/IPCIDR)
- [ ] Извлечение IP-набора для маршрутизации TUN
GeoIP / GeoSite (устаревшие)
- [ ] Чтение MaxMind MMDB (тип sing-geoip)
- [ ] Чтение двоичного формата GeoSite
- [ ] Компиляция GeoSite в правила
- [ ] Автозагрузка при первом использовании
Поиск процессов
- [ ] Linux: диагностика сокета netlink + поиск в procfs
- [ ] macOS: парсинг списка PCB sysctl
- [ ] Windows: IP Helper API (GetExtendedTcpTable)
- [ ] Android: netlink + сопоставление UID с пакетом
- [ ] Делегирование через интерфейс платформы
TUN
- [ ] Создание и настройка TUN-устройства
- [ ] Автомаршрутизация (управление таблицей маршрутизации)
- [ ] Перехват DNS через TUN
- [ ] Поддержка IPv4 и IPv6
- [ ] Настройка MTU
- [ ] Платформенный TUN (Android VpnService, iOS NetworkExtension)
Clash API [тег сборки: with_clash_api]
- [ ] HTTP REST-сервер с маршрутизатором chi
- [ ] Аутентификация по Bearer-токену
- [ ] Поддержка WebSocket
- [ ] Потоковая передача статистики трафика
- [ ] Потоковая передача логов с фильтрацией по уровню
- [ ] Отслеживание и перечисление соединений
- [ ] Перечисление прокси и тестирование задержки
- [ ] API обновления Selector
- [ ] Переключение режимов с сохранением
- [ ] Обслуживание статических файлов внешнего UI
- [ ] Настройка CORS
V2Ray API [тег сборки: with_v2ray_api]
- [ ] gRPC-сервер
- [ ] Сервис статистики (GetStats, QueryStats, GetSysStats)
- [ ] Счётчики трафика для каждого входящего/исходящего/пользователя
- [ ] Соглашение об именовании счётчиков (сущность>>>тег>>>traffic>>>направление)
- [ ] Сопоставление по паттернам (подстрока и регулярное выражение)
Файл кэша
- [ ] База данных bbolt (или эквивалент)
- [ ] Сохранение выбранного исходящего
- [ ] Сохранение режима Clash
- [ ] Кэширование удалённых наборов правил
- [ ] Сохранение FakeIP (двунаправленное сопоставление)
- [ ] Сохранение RDRC с истечением срока действия
- [ ] Пространство имён Cache ID
- [ ] Восстановление после повреждения (удаление и пересоздание)
- [ ] Асинхронная буферизация записи
Интерфейс платформы
- [ ] Определение интерфейса, совместимого с gomobile
- [ ] Мост управления TUN-устройством
- [ ] Мониторинг интерфейса по умолчанию
- [ ] Перечисление сетевых интерфейсов
- [ ] Мост поиска владельца соединения
- [ ] Чтение состояния WIFI
- [ ] Доступ к системным сертификатам
- [ ] Отправка уведомлений
- [ ] Мониторинг соседей
- [ ] Правила по запросу (iOS)
- [ ] Жизненный цикл сетевого расширения (iOS)
- [ ] Командный сервер (IPC)
Фаза 7: Тестирование и совместимость
Совместимость проводного формата
- [ ] Тесты проводного формата протокола VLESS
- [ ] Тесты проводного формата протокола VMess
- [ ] Тесты проводного формата протокола Trojan
- [ ] Тесты проводного формата Shadowsocks (все варианты шифров)
- [ ] Тесты проводного формата мультиплекса (sing-mux)
- [ ] Интеграционные тесты с официальным sing-box
Совместимость конфигурации
- [ ] Парсинг примеров конфигураций официального sing-box
- [ ] Тесты сериализации «туда-обратно»
- [ ] Тесты миграции устаревших форматов
- [ ] Тесты отклонения неизвестных полей
Совместимость
- [ ] Тестирование с серверами sing-box
- [ ] Тестирование с серверами Xray-core
- [ ] Тестирование с Clash.Meta
- [ ] Совместимость формата наборов правил SRS
- [ ] Совместимость базы данных GeoIP
- [ ] Совместимость базы данных GeoSite