Skip to content

Обзор архитектуры

Xray-core — это модульная платформа сетевого проксирования, написанная на Go. Она обрабатывает сетевой трафик через конвейер inbound -> dispatcher -> router -> outbound с подключаемыми протоколами на каждом конце и настраиваемым транспортом в основе.

Структура проекта

xray-core/
  core/          # Instance, загрузка конфигурации, жизненный цикл
  app/           # Функции уровня приложения
    dispatcher/  # Центральный диспетчер (inbound->routing->outbound)
    proxyman/    # Менеджеры входящих/исходящих обработчиков
    router/      # Движок маршрутизации, правила, балансировщики
    dns/         # DNS-резолвер, Fake-IP
    policy/      # Политики таймаутов и буферов
    stats/       # Статистика трафика
    commander/   # gRPC API управления
    reverse/     # Обратный прокси-туннель
    observatory/ # Проверка состояния
  common/        # Общие утилиты
    buf/         # Пул буферов (блоки по 8 КБ)
    net/         # Сетевые примитивы (Address, Destination)
    protocol/    # Абстракции протоколов (RequestHeader, AddressParser)
    session/     # Контекст сессии (Inbound, Outbound, Content)
    mux/         # Мультиплексирование потоков
    xudp/        # UDP-over-mux с адресацией для каждого пакета
    signal/      # Notifier, ActivityTimer, Done
    strmatcher/  # Сопоставление строк/доменов (full, domain, substr, regex, MPH)
    crypto/      # AES, ChaCha20 и др.
    singbridge/  # Мост к библиотеке sing-box
  features/      # Интерфейсы функций (traits/protocols)
    dns/         # Интерфейсы dns.Client, dns.FakeDNSEngine
    inbound/     # Интерфейсы inbound.Manager, inbound.Handler
    outbound/    # Интерфейсы outbound.Manager, outbound.Handler
    routing/     # Интерфейсы routing.Dispatcher, routing.Router
    policy/      # Интерфейс policy.Manager
    stats/       # Интерфейс stats.Manager
  proxy/         # Реализации протоколов
    vless/       # VLESS (с Vision, XUDP, reverse)
    vmess/       # VMess (AEAD)
    trojan/      # Trojan
    shadowsocks/ # Shadowsocks (классический)
    shadowsocks_2022/ # Shadowsocks 2022
    socks/       # SOCKS5
    http/        # HTTP-прокси
    dokodemo/    # Прозрачный прокси (dokodemo-door)
    freedom/     # Прямой исходящий
    blackhole/   # Нулевой исходящий
    dns/         # DNS-прокси
    loopback/    # Повторный вход в маршрутизацию
    wireguard/   # WireGuard-туннель
    hysteria/    # Hysteria2
    tun/         # TUN-устройство + IP-стек gVisor
  transport/     # Транспортный уровень
    internet/    # Реестр транспортов + реализации
      tcp/       # TCP
      websocket/ # WebSocket
      grpc/      # gRPC (gun)
      httpupgrade/ # HTTP Upgrade
      splithttp/ # Split HTTP
      kcp/       # mKCP (надёжный UDP)
      tls/       # TLS + uTLS
      reality/   # REALITY
      hysteria/  # QUIC (транспорт Hysteria)
      udp/       # UDP-диспетчер
    pipe/        # Внутренний pipe (Reader<->Writer)
  infra/conf/    # Конвертация JSON-конфигурации в protobuf

Высокоуровневый поток данных

mermaid
flowchart LR
    Client([Клиент]) -->|TCP/UDP| Inbound

    subgraph Xray["Экземпляр Xray-core"]
        Inbound["Входящий обработчик<br/>(VLESS/VMess/Trojan/...)"]
        Dispatcher["Диспетчер<br/>(перехват + маршрутизация)"]
        Router["Маршрутизатор<br/>(правила + балансировщик)"]
        Outbound["Исходящий обработчик<br/>(Freedom/VLESS/VMess/...)"]

        Inbound -->|"Dispatch(ctx, dest)"| Dispatcher
        Dispatcher -->|"PickRoute(ctx)"| Router
        Router -->|тег исходящего| Dispatcher
        Dispatcher -->|"Dispatch(ctx, link)"| Outbound
    end

    Outbound -->|Транспорт| Server([Удалённый сервер])

Ключевые зависимости

ЗависимостьНазначение
google.golang.org/protobufСериализация конфигурации
google.golang.org/grpcgRPC-транспорт + Commander API
gvisor.dev/gvisorПользовательский TCP/IP-стек (для TUN)
github.com/gorilla/websocketWebSocket-транспорт
github.com/apernet/quic-goQUIC-транспорт (Hysteria)
github.com/refraction-networking/utlsПодмена отпечатков TLS
github.com/xtls/realityПротокол REALITY
github.com/sagernet/sing-shadowsocksShadowsocks 2022
github.com/miekg/dnsПарсинг DNS-сообщений
golang.zx2c4.com/wireguardРеализация WireGuard
lukechampine.com/blake3Хеш BLAKE3 (XUDP GlobalID)

Принципы проектирования

  1. Конфигурация на основе Protobuf: Вся конфигурация определена как protobuf-сообщения. JSON — это лишь формат сериализации, который преобразуется в protobuf при загрузке.

  2. Реестр функций: Компоненты регистрируют себя через common.RegisterConfig() с указанием типа protobuf-конфигурации. Instance автоматически разрешает зависимости.

  3. Интерфейсный подход: Основные контракты определены в features/ как Go-интерфейсы. Реализации в app/ и proxy/ удовлетворяют этим интерфейсам.

  4. Поток данных через pipe: Входящий и исходящий обработчики связаны через transport/pipe, обеспечивающий буферизованные каналы с управлением обратным давлением.

  5. Активное использование контекста: Метаданные сессии (источник, назначение, пользователь, теги, конфигурация перехвата) передаются через context.Context с помощью типизированных ключей.

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