REALITY в Xray и sing-box: перенос параметров без потери полей
Как перенести конфигурацию REALITY между Xray и sing-box: таблица соответствий, пошаговая инструкция и диагностика проблем.
Содержание
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) |
|---|---|---|
| Адрес для маскировки рукопожатия и SNI | dest (строка «host:port») | tls.server_name (SNI) + tls.reality.handshake.server и tls.reality.handshake.port |
| Список разрешённых SNI | serverNames (массив строк) | tls.server_name (единственное значение; берётся первое) |
| Приватный ключ REALITY | privateKey | tls.reality.private_key |
| Короткие идентификаторы | shortIds (массив hex-строк) | tls.reality.short_id (строка; берётся первая) |
| Отладочный вывод | show | — (всегда выключен) |
| PROXY-протокол | xver | — (не поддерживается; используйте accept_proxy_protocol отдельно) |
Клиентская часть (outbound)
| Назначение | Xray (streamSettings.realitySettings) | sing-box (tls.reality) |
|---|---|---|
| SNI | serverNames (массив) или serverName (в некоторых клиентах) | tls.server_name |
| Fingerprint TLS | fingerprint | tls.utls.fingerprint |
| Публичный ключ REALITY | publicKey | tls.reality.public_key |
| Короткий идентификатор | shortId (строка) | tls.reality.short_id |
| Протокол потока | flow | flow (идентично) |
Пошаговый перенос из 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"
}
}
}Шаги конвертации:
- Из
destизвлеките адрес и порт. В sing-box адрес поместите вhandshake.server, порт — вhandshake.port. Значение SNI (обычно тот же адрес) укажите вserver_name. - Удалите
serverNames. В sing-box используется только одно значениеserver_name. Если в массиве было несколько доменов, выберите основной. - Перенесите
privateKeyвreality.private_key. Ключ должен быть в формате base64url (как в Xray). - Возьмите первый элемент из
shortIdsи запишите его вreality.short_id. Обратите внимание на регистр: обычно используется hex в нижнем регистре. - Опция
xverне переносится. В sing-box для поддержки PROXY-протокола настройтеaccept_proxy_protocolна уровне inbounds. - Поле
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-boxshort_id— строка. При переносе нужно брать первый элемент. Также проверяйте длину: стандартный short_id — 8 символов (4 байта) в hex. - Игнорирование spiderX. Некоторые конфигурации Xray используют поле
spiderXдля обхода ограничений. В sing-box такой опции нет, и если она критична, перенос может быть невозможен без потери функциональности. - Опечатки в регистре. sing-box строго различает регистр:
private_keyиprivateKey— разные вещи. Проверяйте имена полей по официальной документации.
Диагностика проблем после переноса
Если после переноса соединение не работает или работает нестабильно, действуйте пошагово:
- Проверьте DNS и SNI. С клиента выполните команду:
openssl s_client -connect host:443 -servername server_name. Вы должны увидеть сертификат того сайта, который указан вserver_name(например, addons.mozilla.org). Если вы видите свой сертификат или ошибку — SNI неверный. - Смотрите логи. В Xray установите
"log": {"loglevel": "debug"}. В sing-box —"log": {"level": "debug"}. Обращайте внимание на сообщения о TLS-рукопожатии и REALITY. - Проверьте совпадение ключей. На сервере
private_keyдолжен соответствоватьpublic_keyклиента. Сгенерируйте новую пару ключей (Xray:openssl ecparam -name prime256v1 -genkey -noout -out key.pemи т.д.) и убедитесь, что вы используете правильный формат. - Проверьте короткий ID. Убедитесь, что
short_idна клиенте совпадает с одним изshort_idsсервера. Если сервер настроен на несколькоshortIds, клиент должен использовать один из них. - Проверьте порт и адрес. Иногда при переносе забывают изменить
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 в своем сценарии.
Получить доступ