Формат полной конфигурации Xray Raw JSON
Путь: Подключение → экспертный режим → Raw JSON → импорт/редактор. Нужны корневой name и все реальные proxy outbounds. Выбор серверов, Smart и Custom обычного режима сюда не добавляются.
Файл полный для OneXray, не обязательно для CLI: платформенный inbound создаёт приложение.
Владение полями
| Настройка | Ответственность |
|---|---|
| Узлы, порядок, цепочки | Пользователь; пустые слоты недопустимы |
| Routing, balancers, DNS servers, пулы FakeDNS | Пользователь, без автоматического добавления Smart Routing |
| inbounds с tag tunIn | Отсутствующий inbound создаётся; существующий получает только управляемые платформой settings |
| Другие inbounds | Пользователь с учётом платформы/ресурсов; дополнительный TUN не создавайте |
| log, metrics, счётчики | Приложение; не копируйте пути, слушатели и политику статистики |
| Стратегия DNS queries | Настройка IPv6 приложения |
| Пути ресурсов/сертификатов, TUN fd | Runtime приложения |
| Исходящий интерфейс Windows/Linux | Выбор в приложении, Raw его не переопределяет |
Исходный текст и runtime-копия различаются. Неуправляемые пользовательские поля сохраняются. Dump runtime содержит локальные пути/порты: не публикуйте его без изменений как переносимый шаблон.
Существующий tunIn сохраняется
Для существующего tunIn сохраняются позиция в массиве, остальные поля inbound и пользовательский sniffing, включая выключенный или отсутствующий. В TUN settings приложение управляет только name, mtu, gateway, dns, autoSystemRoutingTable, autoOutboundsInterface: подставляет значения платформы, а Apple/Android удаляют последние четыре неприменимых поля. Остальные settings сохраняются. Без SOCKS-адаптации требуется protocol: "tun".
Windows MSIX и симулятор iOS явно адаптируют inbound в SOCKS: меняют протокол, адрес/порт слушателя и необходимые SOCKS settings, сохраняя прочие поля. Только при полном отсутствии tunIn приложение создаёт его со стандартным sniffing. Полный Raw не ограничен списком полей продвинутого шаблона Custom.
VLESS и полная DNS-схема
Шаблон: замените хост, UUID, TLS и порт. Geodata не требуется. Здесь явно заданы перехват DNS и маршруты запросов: одной замены dns.servers недостаточно.
{
"name": "VLESS with explicit DNS",
"dns": {
"tag": "user-dns-query",
"servers": [
"8.8.8.8"
]
},
"outbounds": [
{
"tag": "user-proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "server.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000001",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "server.example.com"
}
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
},
{
"tag": "user-dns",
"protocol": "dns",
"settings": {
"rules": [
{
"action": "hijack",
"qType": "1,28"
},
{
"action": "direct"
}
]
},
"streamSettings": {
"sockopt": {
"dialerProxy": "user-proxy"
}
}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ruleTag": "Resolve tunnel DNS",
"inboundTag": [
"tunIn"
],
"port": "53",
"outboundTag": "user-dns"
},
{
"ruleTag": "DNS through VPN",
"inboundTag": [
"user-dns-query"
],
"outboundTag": "user-proxy"
},
{
"ruleTag": "Local network",
"ip": [
"192.168.0.0/16",
"10.0.0.0/8",
"172.16.0.0/12"
],
"outboundTag": "direct"
}
]
}
}Первый outbound — proxy по умолчанию. Порт 53 с tunIn поступает в user-dns; A/AAAA обрабатывает встроенный DNS, его исходящие запросы идут через proxy. Остальные DNS-типы пересылаются через dialerProxy DNS outbound. Частные IP — напрямую. Правило ссылается на tunIn, но вход создаётся приложением.
Не создавайте перехват 53 без DNS outbound или петлю, возвращающую запросы резолвера в его же перехват. DoH приложений на 443 — не обычный DNS на 53.
Два входа и конечный выход
Направление: устройство → вход → конечный выход → назначение. dialerProxy в streamSettings.sockopt копии выхода указывает на соответствующий вход, не наоборот.
Нужны два настоящих входа и один выход. Две копии выхода имеют одинаковые реквизиты конечного сервера, но разные tags и зависимости.
{
"name": "Two paths to one final exit",
"dns": {
"tag": "user-dns-query",
"servers": [
"8.8.8.8"
]
},
"outbounds": [
{
"tag": "exit-a",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "exit.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000003",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "exit.example.com"
},
"sockopt": {
"dialerProxy": "entry-a"
}
}
},
{
"tag": "exit-b",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "exit.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000003",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "exit.example.com"
},
"sockopt": {
"dialerProxy": "entry-b"
}
}
},
{
"tag": "entry-a",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "entry-a.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000001",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "entry-a.example.com"
}
}
},
{
"tag": "entry-b",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "entry-b.example.com",
"port": 443,
"users": [
{
"id": "00000000-0000-4000-8000-000000000002",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "entry-b.example.com"
}
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
},
{
"tag": "user-dns",
"protocol": "dns",
"settings": {
"rules": [
{
"action": "hijack",
"qType": "1,28"
},
{
"action": "direct"
}
]
},
"streamSettings": {
"sockopt": {
"dialerProxy": "exit-a"
}
}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ruleTag": "Resolve tunnel DNS",
"inboundTag": [
"tunIn"
],
"port": "53",
"outboundTag": "user-dns"
},
{
"ruleTag": "DNS through VPN",
"inboundTag": [
"user-dns-query"
],
"balancerTag": "user-pool"
},
{
"ruleTag": "Local network",
"ip": [
"192.168.0.0/16",
"10.0.0.0/8",
"172.16.0.0/12"
],
"outboundTag": "direct"
},
{
"ruleTag": "Explicit balanced destinations",
"domain": [
"domain:example.net"
],
"balancerTag": "user-pool"
}
],
"balancers": [
{
"tag": "user-pool",
"selector": [
"exit-a",
"exit-b"
],
"strategy": {
"type": "roundRobin"
},
"fallbackTag": "direct"
}
]
},
"observatory": {
"subjectSelector": []
}
}Selector содержит полные tags выходов. Явно заданный example.net и DNS используют balancer; остальной трафик — первую цепочку. Не-A/AAAA DNS также использует первый выход. Fallback direct разрешает прямое соединение, а не блокирует его. Пример не обещает балансировку всего непопавшего под правила трафика.
Проверка и зависимости
Сохранение строит и закрывает временный instance без Start, исключая/сокращая управляемые ресурсы. Сохраняются пользовательские протоколы, DNS и routing-зависимости. Успех не проверяет права, привязку портов или сеть.
Собственные DAT установите заранее через данные маршрутизации или используйте обмен Raw с отдельными Geodata App Links. Корневой geodata.assets — контракт Custom, не загрузчик обычного Raw. См. зависимости. Не встраивайте абсолютные пути и не рассчитывайте на загрузку при запуске VPN; другие файлы/модули также нужно предоставить.
Редкие поля описаны в справочнике Xray соответствующей версии, который не отменяет границы приложения. При объявленном сервере или пуле FakeDNS новый tunIn получает восстановление домена. Sniffing существующего inbound не меняется: при необходимости настройте восстановление сами. См. поведение и ограничения FakeDNS.