Полные Xray-конфигурации¶
Подписка может возвращать полные конфигурационные файлы xray-core с балансировщиками, обсерваториями и кастомной маршрутизацией. Такие конфигурации передаются в xray-core практически без изменений.
Определение¶
Конфигурация считается «полной», если JSON содержит оба поля:
inbounds— входящие подключенияoutbounds— исходящие подключения
Любой JSON-объект, содержащий и inbounds, и outbounds, распознаётся как полная конфигурация — независимо от наличия балансировщиков, обсерваторий или метаданных.
Формат¶
Одиночная конфигурация¶
{
"log": { "loglevel": "warning" },
"dns": { "servers": [...] },
"inbounds": [
{ "tag": "socks-in", "protocol": "socks", "port": 10808, "listen": "127.0.0.1" },
{ "tag": "http-in", "protocol": "http", "port": 10809, "listen": "127.0.0.1" }
],
"outbounds": [
{ "tag": "proxy-1", "protocol": "vless", "settings": {...} },
{ "tag": "proxy-2", "protocol": "vless", "settings": {...} },
{ "tag": "direct", "protocol": "freedom" },
{ "tag": "block", "protocol": "blackhole" }
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [...],
"balancers": [
{
"tag": "balancer-1",
"selector": ["proxy-1", "proxy-2"],
"strategy": { "type": "leastPing" }
}
]
},
"burstObservatory": {
"subjectSelector": ["proxy-1", "proxy-2"],
"pingConfig": {
"destination": "http://www.google.com/generate_204",
"connectivity": "http://www.google.com/generate_204",
"interval": "30s",
"sampling": 2,
"timeout": "5s"
}
},
"stats": {}
}
Массив конфигураций¶
[
{ "outbounds": [...], "routing": { "balancers": [...] }, "burstObservatory": {...} },
{ "outbounds": [...], "routing": { "balancers": [...] }, "burstObservatory": {...} }
]
Каждый элемент массива — отдельная полная конфигурация, импортируется как отдельный «сервер».
Автоматический патчинг¶
При запуске приложение автоматически патчит конфигурацию (patchFullConfigInbounds):
1. Логирование¶
log.loglevel— устанавливается из настроек пользователяlog.accessиlog.error— устанавливается путь к лог-файлу приложения
iOS:
group.llc.itdev.incy/logs/xray.logAndroid/Desktop: передаётся через параметрlogFilePath
2. Inbound'ы¶
- У всех не-internal
socks/mixed/httpinbound'овlistenпринудительно ставится в127.0.0.1(порт не меняется — конфиг должен сам слушать10808для SOCKS/mixed и10809для HTTP, это точки входа клиента). - Если в конфиге нет ни одного socks-подобного inbound'а — добавляется
mixedinbound на127.0.0.1:10808со sniffing. - На точечные inbound'ы без своей авторизации клиент «накрашивает» креды, чтобы порт не оставался открытым релеем.
3. Stats¶
Если конфигурация содержит burstObservatory или observatory, но не содержит stats — автоматически добавляется пустой объект "stats": {}.
4. DNS Direct Routing (предотвращение циклической зависимости)¶
Условие: конфигурация содержит и observatory, и balancers.
Проблема: Observatory проверяет серверы → для проверки нужен DNS → DNS идёт через балансировщик → балансировщик зависит от результатов Observatory → цикл.
Решение: IP-адреса DNS-серверов из dns.servers добавляются в начало routing.rules с outbound "direct":
Если outbound с тегом "direct" или протоколом "freedom" отсутствует — добавляется автоматически.
Отображение в UI¶
- Полные конфигурации отображаются как один сервер в списке
- Бейджи безопасности и транспорта скрываются (информация внутри конфига)
- Если в
metaестьserverDescription— отображается как описание сервера - Имя сервера берётся из первого proxy-outbound'а
Особенности работы с полными конфигурациями¶
MPH Cache¶
Для полных конфигураций MPH cache не используется. Кэш (mph_cache.dat) предназначен для сериализации DomainMatcher, но несовместим с полными JSON-конфигурациями. При обнаружении полной конфигурации:
- Существующий файл
mph_cache.datудаляется - Xray-core строит матчеры в рантайме
- Флаг
isFullConfigпередаётся из основного приложения в Network Extension (iOS) черезproviderConfigurationиsharedDefaults
Геофайлы (Geo Trimming)¶
Для полных конфигураций обрезка геофайлов пропускается. Полные конфигурации поставляются с собственными кастомными геофайлами от подписки, которые используются как есть. При подключении:
GeoTrimmerне вызывается- Обрезанные файлы удаляются (
deleteTrimmedGeoFiles) - Xray-core использует оригинальные геофайлы
DNS¶
Для полных конфигураций DNS-серверы не заменяются. Полные конфигурации уже содержат корректно настроенные DNS с фильтрами domains/expectIPs, поэтому приложение:
- Не подставляет свои DNS-серверы
- Сохраняет оригинальные DNS-записи из конфигурации
- Добавляет только Direct-правило для DNS-серверов (для предотвращения циклической зависимости с Observatory)
Хранение¶
Полная JSON-конфигурация сохраняется в поле fullConfigJson модели VLESSConfig. При запуске xray-core конфиг патчится и передаётся целиком, без генерации из отдельных полей.