# Формат полной конфигурации Xray Raw JSON

Source: https://onexray.com/ru/docs/configuration/raw-json/
Description: Полная пользовательская конфигурация с учётом полей, которыми управляет OneXray.


Путь: Подключение → экспертный режим → 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 недостаточно.

[JSON: raw-vless-tls.json](https://onexray.com/examples/raw-vless-tls.json)

```json
{
  "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 и зависимости.

[JSON: raw-chain.json](https://onexray.com/examples/raw-chain.json)

```json
{
  "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. См. [зависимости](https://onexray.com/ru/docs/configuration/geodata/). Не встраивайте абсолютные пути и не рассчитывайте на загрузку при запуске VPN; другие файлы/модули также нужно предоставить.

Редкие поля описаны в [справочнике Xray соответствующей версии](https://xtls.github.io/config/), который не отменяет границы приложения. При объявленном сервере или пуле FakeDNS новый `tunIn` получает восстановление домена. Sniffing существующего inbound не меняется: при необходимости настройте восстановление сами. См. [поведение и ограничения FakeDNS](https://onexray.com/ru/docs/configuration/dns/).


