Расширенная маршрутизация Xray в JSON
Выберите расширенную маршрутизацию, если обычных правил недостаточно для ваших DNS, sniffing или локальных inbounds. Серверы по-прежнему выбираются в OneXray; реальные proxy-узлы и их реквизиты в шаблоне не нужны. Для управления самими узлами и цепочками используйте полный Raw JSON.
Путь: Подключение → способ обработки трафика → Новый собственный маршрут → Расширенный JSON. Импортируйте файл или отредактируйте JSON, задайте имя и сохраните. Затем выберите маршрут и существующий сервер, подписку или все ручные узлы. Это шаблон Custom Routing, не полный Raw экспертного режима.
Обычные и расширенные маршруты делят лимит трёх профилей; имя уникально, 1–32 символа. Тип сохранённого профиля не переключается: преобразования через форму с потерей полей нет. Для другого типа создайте профиль. У Raw отдельный лимит.
Слоты узлов и теги
Начните outbounds с 1–3 последовательных пустых объектов, затем добавляйте вспомогательные выходы. Чередовать их нельзя. Автоматическому выбору, подписке и всем ручным узлам нужно соответствующее число разных пригодных узлов. Выбор одного конкретного сервера заменяет всю область слотов одним узлом. Смена серверов не меняет шаблон.
Порядок runtime: выбранные узлы, исходные вспомогательные выходы, затем direct/block App. При стандартном roundRobin без совпадения используется первый outbound, catch-all не добавляется. Активный leastPing дописывает после правил proxy-правило для управляемого TUN/LAN; дополнительные входы требуют явных правил. Безусловное правило пользователя может остановить второй проход IPIfNonMatch.
| Тег | Контракт |
|---|---|
proxy |
Balancer App с roundRobin/leastPing; runtime selector и fallback формируются по стратегии. |
| direct, block | Выходы приложения: можно ссылаться, нельзя определять в шаблоне. |
| tunIn | Платформенный inbound; разрешены ссылки из правил. Шаблон задаёт только tag и sniffing. |
| dnsOut | DNS outbound пользователя; при необходимости определите явно, приложение его не добавит. |
| app-entry-, app-exit- | Внутренние имена узлов; определения и ссылки запрещены. |
| Остальные | Пользовательские inbounds, DNS-запросы и вспомогательные выходы. Имя DNS не задаёт скрытый прямой/proxy-маршрут. |
Шаблон не добавляет конечный выход и не накладывает произвольные изменения на узлы приложения. dialerProxy ссылается на реальный outbound, не balancer. Для полного владения узлами и цепочками используйте Raw.
Допустимый JSON
Корень: name, outbounds, inbounds, dns, routing, fakedns, observatory и метаданные обмена geodata.assets. Имя и зависимости хранятся отдельно от JSON шаблона. Поля mode/enabled/ID узлов не добавляются.
| Часть | Поля и границы |
|---|---|
| routing | domainStrategy и упорядоченные rules; стратегия и ruleTag сохраняются. |
| Правило | ruleTag, domain, ip, port, network, protocol, localOS, inboundTag, localIP, localPort, balancerTag, outboundTag. Выберите одно действие. |
| tunIn | Только tag/sniffing, без protocol/listen/port/settings. |
| Дополнительный inbound | tag, protocol, listen, port, settings, sniffing; протокол socks, http или tunnel. Несколько независимых экземпляров допустимы. |
| SOCKS settings | auth, users/accounts, udp; сохраняются все пары user/pass. |
| HTTP settings | users/accounts, без allowTransparent. |
| Tunnel settings | rewriteAddress, rewritePort, allowedNetwork. Это перенаправление порта, не ещё один системный TUN. |
| sniffing | enabled, routeOnly, destOverride, metadataOnly, domainsExcluded, ipsExcluded; отдельно для каждого входа. |
| Вспомогательный outbound | tag, protocol, settings, streamSettings.sockopt.dialerProxy и streamSettings.finalmask только для Freedom. Только freedom/blackhole/dns, settings по синтаксису встроенного Core; без реальных удалённых proxy-узлов. |
| DNS | Поддерживаемые Core hosts, servers, clientIp, tag, параметры кеша, fallback и параллельных запросов. |
| FakeDNS | Стандартные пулы fakedns с ipPool/poolSize и полная цепочка DNS/sniffing. При отсутствии пулов действуют значения Core. |
Не принимаются process, sourceIP/source/sourcePort, attrs, routing user и HTTP allowTransparent. Значения полей проверяет libXray; приложение проверяет границы шаблона и владение ресурсами, не создавая вторую грамматику доменов/IP. Этот список не ограничивает полный Raw.
DNS принадлежит шаблону
OneXray не вставляет proxy/direct DNS servers, не выводит domains из прямых правил, не добавляет правила 53/853 и не меняет порядок. Задайте весь путь DNS, включая используемый DNS outbound и обработку не-A/AAAA запросов, в видимом JSON.
Корень DNS: hosts, servers, clientIp, tag, disableCache, serveStale, serveExpiredTTL, disableFallback, disableFallbackIfMatch, enableParallelQuery, useSystemHosts. Сервер — строка адреса либо объект: address, port, clientIp, domains, expectedIPs, unexpectedIPs, skipFallback, tag, timeoutMs, параметры кеша/устаревших ответов, finalQuery. Используйте синтаксис встроенного Core.
Корневой и серверный queryStrategy нужно опустить: это поле приложения, шаблон с ним отклоняется. IPv6 задаёт UseIP/UseIPv4 без изменения адресов DNS. Транспорты +local обходят маршрутизацию Xray и не могут соблюдать обязательный интерфейс Windows/Linux; на этих системах они отклоняются. DNS tag не меняет этот факт. См. DNS.
Журналы, stats, metrics, policy, env/ресурсы и физический интерфейс принадлежат App; дополнительно разрешены только ограниченные стратегия proxy и параметры проб ниже.
Sniffing и полный Raw
Явный объект tunIn.sniffing в расширенном шаблоне сохраняется целиком; пропущенные дочерние поля получают значения Core. Без всего объекта действуют значения приложения, включая обнаружение FakeDNS. Один routeOnly не включает sniffing; явно выключенный sniffing не включается скрыто.
В полном Raw существующий tunIn сохраняет позицию, sniffing и неуправляемые settings. Приложение обновляет только необходимые платформенные параметры; отсутствующий sniffing остаётся отсутствующим. Только отсутствие всего inbound приводит к созданию стандартного. Шесть управляемых полей и адаптация SOCKS описаны в Raw JSON.
Полные примеры
Все примеры используют узлы приложения. Для двух автоматических слотов нужны два пригодных узла; можно выбрать один конкретный сервер. Не-A/AAAA DNS из туннеля явно отбрасывается; при необходимости измените эту политику. Примеры не обещают защиту от всех утечек или блокировку при отказе.
Локальный SOCKS и TUN routeOnly
Замените пароль дополнительного SOCKS — это входящий аккаунт, не реквизиты удалённого сервера. Подключите локальный клиент к 127.0.0.1:12080. Его трафик явно идёт в proxy, нематченный системный трафик — через первый узел. Не-loopback listen открывает доступ соответствующей сети: проверьте авторизацию и firewall. Мобильный фон может ограничить слушатели. Счётчик главной страницы учитывает только tunIn.
{
"outbounds": [
{},
{},
{
"tag": "dnsOut",
"protocol": "dns",
"settings": {
"rules": [
{
"action": "hijack",
"qType": "1,28"
},
{
"action": "drop"
}
]
}
}
],
"inbounds": [
{
"tag": "tunIn",
"sniffing": {
"enabled": true,
"routeOnly": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
},
{
"tag": "local-socks",
"protocol": "socks",
"listen": "127.0.0.1",
"port": 12080,
"settings": {
"auth": "password",
"users": [
{
"user": "local-user",
"pass": "CHANGE_THIS_PASSWORD"
}
],
"udp": true
},
"sniffing": {
"enabled": true,
"routeOnly": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
}
],
"dns": {
"servers": [
{
"tag": "dns-proxy",
"address": "8.8.8.8"
}
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ruleTag": "Proxy DNS",
"inboundTag": [
"dns-proxy"
],
"balancerTag": "proxy"
},
{
"ruleTag": "Tunnel DNS",
"inboundTag": [
"tunIn"
],
"port": 53,
"outboundTag": "dnsOut"
},
{
"ruleTag": "DNS over TLS",
"inboundTag": [
"tunIn"
],
"port": 853,
"balancerTag": "proxy"
},
{
"ruleTag": "Local SOCKS uses VPN",
"inboundTag": [
"local-socks"
],
"balancerTag": "proxy"
}
]
},
"name": "Local SOCKS and Sniffing"
}Прямой Китай и раздельный DNS
Нужны стандартные geosite.dat:CN и geoip.dat:CN. Прямой DNS 1.1.1.1 должен быть доступен без выбранного proxy; при необходимости замените его. DNS-правила предшествуют правилам назначения. Catch-all отсутствует, поэтому возможен второй IP-проход IPIfNonMatch.
{
"outbounds": [
{},
{},
{
"tag": "dnsOut",
"protocol": "dns",
"settings": {
"rules": [
{
"action": "hijack",
"qType": "1,28"
},
{
"action": "drop"
}
]
}
}
],
"inbounds": [
{
"tag": "tunIn",
"sniffing": {
"enabled": true,
"routeOnly": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
}
],
"dns": {
"servers": [
{
"tag": "dns-proxy",
"address": "8.8.8.8"
},
{
"tag": "dns-direct",
"address": "1.1.1.1",
"domains": [
"geosite:CN"
],
"skipFallback": true
}
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ruleTag": "Proxy DNS",
"inboundTag": [
"dns-proxy"
],
"balancerTag": "proxy"
},
{
"ruleTag": "Direct DNS",
"inboundTag": [
"dns-direct"
],
"outboundTag": "direct"
},
{
"ruleTag": "Tunnel DNS",
"inboundTag": [
"tunIn"
],
"port": 53,
"outboundTag": "dnsOut"
},
{
"ruleTag": "DNS over TLS",
"inboundTag": [
"tunIn"
],
"port": 853,
"balancerTag": "proxy"
},
{
"ruleTag": "China websites",
"domain": [
"geosite:CN"
],
"outboundTag": "direct"
},
{
"ruleTag": "China IPs",
"ip": [
"geoip:CN"
],
"outboundTag": "direct"
}
]
},
"name": "China Direct and Split DNS"
}Явный FakeDNS
DNS, два пула и destOverride: fakedns заданы вместе. Система должна отправлять fake IP в туннель; не исключайте диапазоны. После переподключения кешированные IP могут устареть. Реальный DNS сохранён для запросов, которым он нужен. См. ограничения FakeDNS.
{
"outbounds": [
{},
{},
{
"tag": "dnsOut",
"protocol": "dns",
"settings": {
"rules": [
{
"action": "hijack",
"qType": "1,28"
},
{
"action": "drop"
}
]
}
}
],
"inbounds": [
{
"tag": "tunIn",
"sniffing": {
"enabled": true,
"routeOnly": true,
"destOverride": [
"http",
"tls",
"quic",
"fakedns"
]
}
}
],
"dns": {
"servers": [
"fakedns",
{
"tag": "dns-proxy",
"address": "8.8.8.8"
}
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ruleTag": "Proxy DNS",
"inboundTag": [
"dns-proxy"
],
"balancerTag": "proxy"
},
{
"ruleTag": "Tunnel DNS",
"inboundTag": [
"tunIn"
],
"port": 53,
"outboundTag": "dnsOut"
},
{
"ruleTag": "DNS over TLS",
"inboundTag": [
"tunIn"
],
"port": 853,
"balancerTag": "proxy"
},
{
"ruleTag": "Private networks",
"ip": [
"geoip:PRIVATE"
],
"outboundTag": "direct"
}
]
},
"name": "Explicit FakeDNS",
"fakedns": [
{
"ipPool": "198.19.0.0/16",
"poolSize": 32768
},
{
"ipPool": "fc00:1::/64",
"poolSize": 32768
}
]
}Импорт, обмен и проверка
- Тип обычного JSON задаётся выбранным редактором: импортируйте в расширенный JSON, не угадывайте тип по DNS и не отправляйте его в обычную форму.
- App Link: /config/add?type=custom-advanced&data=<base64>#<name>. Обычный Custom использует custom. Типизированные ссылки доступны и через существующий импорт App Links.
- geodata.assets содержит только file/url, без стандартных файлов; конфликт имён отклоняется. Импорт загружает зависимости во временную область, сохранение фиксирует их и удаляет метаданные. Вставка manifest в текст не запускает загрузку: используйте Импорт. Обмен восстанавливает зависимости по смысловым ссылкам routing/DNS/sniffing. См. Geodata.
- Сохранение проверяет копию через TestXray: слоты заменяются локальными freedom, добавляются фиксированные balancer/direct/block, безопасный inbound несёт пользовательский TUN sniffing. Instance строится и закрывается без Start, VPN и проверки скорости узлов.
- Затем проверьте старт VPN, сайты, DNS-пути, каждый дополнительный слушатель и FakeDNS. Успешное построение не проверяет сеть, разрешения и привязку портов. Windows/Linux и платформенные функции Apple требуют проверки на соответствующих системах.
Fragment
Расширенный шаблон может определить freedom-outbound с tag fragment; компилятор соединит с ним выбранные узлы, сохранив параметры. См. Fragment.
Необязательный выбор прокси
Корневой observatory принимает probeURL/probeInterval/enableConcurrency, а routing.balancers — только стратегию proxy roundRobin/leastPing. Runtime selector/fallbackTag/subjectSelector остаются у App. leastPing при двух цепочках добавляет proxy catch-all для управляемого TUN/LAN; дополнительные входы требуют явных правил. Round robin не добавляет catch-all. Поведение.
Вспомогательные Freedom-outbounds также допускают streamSettings.finalmask; параметры масок проверяет встроенный Core. Это не открывает произвольные network/security узла или физический интерфейс. См. Fragment.