Обзор архитектуры
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Высокоуровневый поток данных
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/grpc | gRPC-транспорт + Commander API |
gvisor.dev/gvisor | Пользовательский TCP/IP-стек (для TUN) |
github.com/gorilla/websocket | WebSocket-транспорт |
github.com/apernet/quic-go | QUIC-транспорт (Hysteria) |
github.com/refraction-networking/utls | Подмена отпечатков TLS |
github.com/xtls/reality | Протокол REALITY |
github.com/sagernet/sing-shadowsocks | Shadowsocks 2022 |
github.com/miekg/dns | Парсинг DNS-сообщений |
golang.zx2c4.com/wireguard | Реализация WireGuard |
lukechampine.com/blake3 | Хеш BLAKE3 (XUDP GlobalID) |
Принципы проектирования
Конфигурация на основе Protobuf: Вся конфигурация определена как protobuf-сообщения. JSON — это лишь формат сериализации, который преобразуется в protobuf при загрузке.
Реестр функций: Компоненты регистрируют себя через
common.RegisterConfig()с указанием типа protobuf-конфигурации.Instanceавтоматически разрешает зависимости.Интерфейсный подход: Основные контракты определены в
features/как Go-интерфейсы. Реализации вapp/иproxy/удовлетворяют этим интерфейсам.Поток данных через pipe: Входящий и исходящий обработчики связаны через
transport/pipe, обеспечивающий буферизованные каналы с управлением обратным давлением.Активное использование контекста: Метаданные сессии (источник, назначение, пользователь, теги, конфигурация перехвата) передаются через
context.Contextс помощью типизированных ключей.