Сравнения и выбор REALITY Обновлено 7 xray, sing-box

REALITY в Xray и sing-box: перенос параметров без потери полей

Как перенести конфигурацию REALITY между Xray и sing-box: таблица соответствий, пошаговая инструкция и диагностика проблем.

REALITYXraysing-boxVLESSXTLSмиграциянастройка
Содержание
КороткоREALITY настраивается по-разному в Xray и sing-box. Для переноса нужно сопоставить dest, serverNames, privateKey и shortIds. В статье — таблицы, примеры и чеклист.

REALITY — это современная технология маскировки трафика, которая имитирует TLS-рукопожатие легитимного сайта. Xray и sing-box — два популярных ядра, поддерживающих REALITY, но их конфигурации структурно различаются. При переходе с одного ядра на другое важно корректно перенести все параметры, иначе соединение не установится. В этой статье мы подробно разберём, какие поля соответствуют друг другу, как выполнить перенос без потери настроек и как диагностировать возникающие проблемы.

Зачем переносить конфигурацию REALITY между Xray и sing-box?

Переход между ядрами может быть вызван разными причинами: желание использовать более лёгкое и быстрое ядро sing-box, необходимость интеграции с другими инструментами, или наоборот — возврат к привычному Xray. Прямое копирование JSON-конфигурации невозможно, так как имена полей, вложенность и даже логика настройки TLS отличаются. Без понимания маппинга придётся долго отлаживать соединение. Знание соответствий помогает перенести конфигурацию за несколько минут, сохранив все ключевые настройки, включая приватные ключи, short_id и параметры flow.

Основные поля REALITY в Xray и sing-box

Для успешного переноса нужно чётко понимать, как в каждом ядре называются и организуются параметры. Ниже приведены таблицы соответствий для серверной (inbound) и клиентской (outbound) частей.

Серверная часть (inbound)

НазначениеXray (streamSettings.realitySettings)sing-box (tls.reality)
Адрес для маскировки рукопожатия и SNIdest (строка «host:port»)tls.server_name (SNI) + tls.reality.handshake.server и tls.reality.handshake.port
Список разрешённых SNIserverNames (массив строк)tls.server_name (единственное значение; берётся первое)
Приватный ключ REALITYprivateKeytls.reality.private_key
Короткие идентификаторыshortIds (массив hex-строк)tls.reality.short_id (строка; берётся первая)
Отладочный выводshow— (всегда выключен)
PROXY-протоколxver— (не поддерживается; используйте accept_proxy_protocol отдельно)

Клиентская часть (outbound)

НазначениеXray (streamSettings.realitySettings)sing-box (tls.reality)
SNIserverNames (массив) или serverName (в некоторых клиентах)tls.server_name
Fingerprint TLSfingerprinttls.utls.fingerprint
Публичный ключ REALITYpublicKeytls.reality.public_key
Короткий идентификаторshortId (строка)tls.reality.short_id
Протокол потокаflowflow (идентично)

Пошаговый перенос из Xray в sing-box (сервер)

Рассмотрим реальный фрагмент конфигурации inbound Xray с REALITY:

{
  "protocol": "vless",
  "settings": {
    "clients": [{"id": "uuid", "flow": "xtls-rprx-vision"}],
    "decryption": "none"
  },
  "streamSettings": {
    "network": "tcp",
    "security": "reality",
    "realitySettings": {
      "dest": "addons.mozilla.org:443",
      "serverNames": ["addons.mozilla.org"],
      "privateKey": "PRIVATE_KEY",
      "shortIds": ["abcdefgh"]
    }
  }
}

В sing-box тот же inbound будет выглядеть так:

{
  "type": "vless",
  "listen": "::",
  "listen_port": 443,
  "users": [{"uuid": "uuid", "flow": "xtls-rprx-vision"}],
  "tls": {
    "enabled": true,
    "server_name": "addons.mozilla.org",
    "reality": {
      "enabled": true,
      "handshake": {
        "server": "addons.mozilla.org",
        "port": 443
      },
      "private_key": "PRIVATE_KEY",
      "short_id": "abcdefgh"
    }
  }
}

Шаги конвертации:

  1. Из dest извлеките адрес и порт. В sing-box адрес поместите в handshake.server, порт — в handshake.port. Значение SNI (обычно тот же адрес) укажите в server_name.
  2. Удалите serverNames. В sing-box используется только одно значение server_name. Если в массиве было несколько доменов, выберите основной.
  3. Перенесите privateKey в reality.private_key. Ключ должен быть в формате base64url (как в Xray).
  4. Возьмите первый элемент из shortIds и запишите его в reality.short_id. Обратите внимание на регистр: обычно используется hex в нижнем регистре.
  5. Опция xver не переносится. В sing-box для поддержки PROXY-протокола настройте accept_proxy_protocol на уровне inbounds.
  6. Поле show игнорируйте — оно используется только для отладки.

Пошаговый перенос из Xray в sing-box (клиент)

Клиентская конфигурация Xray (outbound) содержит:

{
  "protocol": "vless",
  "settings": {
    "vnext": [{
      "address": "server.example.com",
      "port": 443,
      "users": [{"id": "uuid", "flow": "xtls-rprx-vision"}]
    }]
  },
  "streamSettings": {
    "network": "tcp",
    "security": "reality",
    "realitySettings": {
      "serverNames": ["addons.mozilla.org"],
      "fingerprint": "chrome",
      "publicKey": "PUBLIC_KEY",
      "shortId": "abcdefgh"
    }
  }
}

В sing-box этому соответствует outbound:

{
  "type": "vless",
  "server": "server.example.com",
  "server_port": 443,
  "uuid": "uuid",
  "flow": "xtls-rprx-vision",
  "tls": {
    "enabled": true,
    "server_name": "addons.mozilla.org",
    "utls": {
      "enabled": true,
      "fingerprint": "chrome"
    },
    "reality": {
      "enabled": true,
      "public_key": "PUBLIC_KEY",
      "short_id": "abcdefgh"
    }
  }
}

Ключевые изменения:

  • serverNames превращается в строку server_name.
  • fingerprint теперь находится внутри utls.
  • publicKey и shortId переходят в reality.public_key и reality.short_id.

Обратный перенос: из sing-box в Xray

Процесс обратной конвертации симметричен. Для сервера объедините server_name и порт из handshake.port в строку dest. server_name заверните в массив serverNames. private_key и short_id преобразуйте в privateKey и shortIds (массив из одного элемента). Для клиента из server_name сделайте массив serverNames или просто строку, поместите utls.fingerprint в fingerprint, а public_key и short_id переименуйте в camelCase.

Типичные ошибки при переносе

Чаще всего проблемы возникают из-за невнимательности или непонимания смысла полей. Вот самые распространённые ошибки:

  • Потеря flow. Если вы забыли перенести параметр flow: "xtls-rprx-vision" из клиента или сервера, соединение может установиться, но передача данных будет нестабильной или вообще не заработает, особенно при использовании XTLS.
  • Путаница между server_name и handshake.server. В sing-box server_name определяет SNI, который видит клиент, а handshake.server — реальный адрес для поддельного рукопожатия. Если они различаются, клиент будет отправлять неправильный SNI, и сервер REALITY корректно не ответит.
  • Неправильный short_id. В Xray shortIds — это массив, а в sing-box short_id — строка. При переносе нужно брать первый элемент. Также проверяйте длину: стандартный short_id — 8 символов (4 байта) в hex.
  • Игнорирование spiderX. Некоторые конфигурации Xray используют поле spiderX для обхода ограничений. В sing-box такой опции нет, и если она критична, перенос может быть невозможен без потери функциональности.
  • Опечатки в регистре. sing-box строго различает регистр: private_key и privateKey — разные вещи. Проверяйте имена полей по официальной документации.

Диагностика проблем после переноса

Если после переноса соединение не работает или работает нестабильно, действуйте пошагово:

  1. Проверьте DNS и SNI. С клиента выполните команду: openssl s_client -connect host:443 -servername server_name. Вы должны увидеть сертификат того сайта, который указан в server_name (например, addons.mozilla.org). Если вы видите свой сертификат или ошибку — SNI неверный.
  2. Смотрите логи. В Xray установите "log": {"loglevel": "debug"}. В sing-box — "log": {"level": "debug"}. Обращайте внимание на сообщения о TLS-рукопожатии и REALITY.
  3. Проверьте совпадение ключей. На сервере private_key должен соответствовать public_key клиента. Сгенерируйте новую пару ключей (Xray: openssl ecparam -name prime256v1 -genkey -noout -out key.pem и т.д.) и убедитесь, что вы используете правильный формат.
  4. Проверьте короткий ID. Убедитесь, что short_id на клиенте совпадает с одним из short_ids сервера. Если сервер настроен на несколько shortIds, клиент должен использовать один из них.
  5. Проверьте порт и адрес. Иногда при переносе забывают изменить handshake.port или использовать не тот IP. Убедитесь, что с сервера доступен целевой сайт и порт 443.

Чеклист проверки переноса

Перед тем как считать перенос завершённым, пройдитесь по этому списку:

  • ✔️ Параметр flow одинаковый на клиенте и сервере.
  • ✔️ Значение server_name клиента есть в serverNames сервера (или совпадает с единственным server_name).
  • ✔️ handshake.server доступен и возвращает корректный сертификат.
  • ✔️ Используется правильная пара ключей: private_key на сервере, public_key на клиенте.
  • ✔️ short_id совпадает (регистр и длина).
  • ✔️ В клиенте включён utls с поддерживаемым fingerprint (например, chrome).
  • ✔️ Если в Xray была опция xver, она заменена аналогом в sing-box (если нужно).
  • ✔️ Проверено, что в конфигурации нет лишних полей, которые могут вызвать ошибки.

Заключение

Перенос REALITY-конфигурации между Xray и sing-box — задача на внимательность и понимание структуры каждого ядра. Используя таблицы соответствий и пошаговые инструкции из этой статьи, вы сможете выполнить миграцию без потери важных параметров. Не забывайте про диагностику и чеклист — это поможет быстро выявить и исправить ошибки. Актуальную информацию о полях всегда сверяйте с официальной документацией, так как реализация может меняться.

Проверено на практике

  • Дата проверки: 2025-03-23
  • Среда: Linux, Windows, Android
  • Версии: Xray 25.3.6, sing-box 1.12.0

Мини-чеклист

  • Параметр flow одинаковый на клиенте и сервере.
  • Значение server_name клиента есть в serverNames сервера.
  • handshake.server доступен и возвращает корректный сертификат.
  • Используется правильная пара ключей: private_key на сервере, public_key на клиенте.
  • short_id совпадает (регистр и длина).
  • В клиенте включён utls с поддерживаемым fingerprint.
  • Опция xver заменена аналогом в sing-box (если нужно).
  • Проверено отсутствие лишних полей, вызывающих ошибки.

Частые ошибки

  • Потеря параметра flow при переносе — соединение падает или работает нестабильно.
  • Путаница между server_name и handshake.server в sing-box: server_name — это SNI, а handshake.server — реальный адрес для рукопожатия.
  • Неправильный перенос shortIds: в Xray это массив, в sing-box — строка, нужно брать первый элемент.
  • Игнорирование spiderX: эта функция Xray не поддерживается в sing-box, что может снизить обходимость блокировок.
  • Опечатки в регистре: sing-box различает private_key и privateKey, что приводит к ошибкам конфигурации.

Источники и документация

FAQ

Можно ли перенести конфигурацию REALITY из Xray в sing-box без изменения ключей?

Да, приватный и публичный ключи переносятся без изменений. Нужно только правильно переименовать поля (например, privateKey → private_key).

Что делать, если после переноса клиент видит ошибку «invalid user»?

Проверьте соответствие uuid, flow и short_id. Ошибка «invalid user» часто возникает из-за несовпадения flow или короткого идентификатора.

Поддерживает ли sing-box все функции REALITY из Xray?

Нет, некоторые опции, такие как spiderX и xver, отсутствуют. Перед переносом убедитесь, что они не критичны для вашего сценария.

Готовы перейти от сравнения к практике?

Если общая картина уже понятна, не тратьте время на еще один круг сравнений. Проще оформить рабочий доступ и проверить Reality в своем сценарии.

Получить доступ

Дальше по теме

Связанные статьи