# REALITY REALITY — это модификация TLS, которая использует внешний вид и характеристики рукопожатия целевого сайта как маскировку. REALITY можно использовать только вместе с транспортами `RAW`, `XHTTP` и `gRPC`. :::: tip REALITY сейчас является одной из самых сильных схем защиты транспорта, а снаружи такой трафик выглядит как обычный веб-трафик.
Включение REALITY вместе с подходящим режимом управления потоком XTLS Vision может дать прирост производительности в несколько раз или даже больше чем в десять раз. ::: details Для разработчиков REALITY модифицирует только TLS. На стороне клиента в основном требуется легкая обработка полностью случайного session ID и пользовательской проверки сертификата, поэтому теоретически оно совместимо с большинством TLS-комбинаций. Подробнее см. в [проекте REALITY](https://github.com/XTLS/REALITY). ::: :::: ## RealityObject `RealityObject` соответствует полю `realitySettings` в [`StreamSettingsObject`](../transport.md#streamsettingsobject). ```json { // пример для outbound, аналогично применимо к inbound "outbounds": [ { // ... "streamSettings": { "security": "reality", // [!code focus:30] "realitySettings": { // Входящие настройки (сервер) "show": false, "target": "example.com:443", "xver": 0, "serverNames": ["example.com", "www.example.com"], "privateKey": "", "minClientVer": "", "maxClientVer": "", "maxTimeDiff": 0, "shortIds": ["", "0123456789abcdef"], "mldsa65Seed": "", "limitFallbackUpload": { "afterBytes": 0, "bytesPerSec": 0, "burstBytesPerSec": 0 }, "limitFallbackDownload": { "afterBytes": 0, "bytesPerSec": 0, "burstBytesPerSec": 0 }, // Исходящие настройки (клиент) "serverName": "", "fingerprint": "chrome", "password": "", "shortId": "", "mldsa65Verify": "", "spiderX": "" } } } ] } ``` > `show`: true | false Если значение равно `true`, выводится отладочная информация. ::: tip Ниже идут параметры **inbound** (**серверной стороны**). ::: > `target`: string Обязательный параметр. Формат такой же, как у [dest](../features/fallback.md#fallbackobject) в fallback VLESS. Старое имя поля — `dest`. В текущих версиях оба поля являются алиасами. Если `target` поддерживает постквантовый алгоритм обмена ключами X25519MLKEM768, клиент REALITY также автоматически будет использовать его при согласовании ключей. Проверить поддержку можно командой `xray tls ping cloudflare.com`, подставив вместо домена ваш `target` и при необходимости порт. Ядро отличает серверную и клиентскую конфигурацию по наличию этого поля. Не заполняйте его на клиенте, иначе определение роли будет неправильным. ::: warning Для маскировки Xray **напрямую пересылает** трафик, который не прошел проверку, то есть не является корректным REALITY-запросом, на `target`. Если IP-адрес `target` особый, например это сайт за Cloudflare CDN, ваш сервер фактически превращается в порт-форвардер для Cloudflare и после сканирования может использоваться посторонними. Чтобы этого избежать, можно поставить перед Xray Nginx или другой фильтр по SNI. Также можно рассмотреть `limitFallbackUpload` и `limitFallbackDownload`. ::: > `xver`: number Необязательный параметр. Формат такой же, как у [xver](../features/fallback.md#fallbackobject) в fallback VLESS. > `serverNames`: [string] Обязательный параметр. Список допустимых для клиента значений `serverName`. Подстановочный символ `*` не поддерживается. Обычно достаточно держать этот список согласованным с `target`. На практике допустимы любые SNI, которые принимает сервер в соответствии с поведением `target`, обычно ориентируясь на [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) сертификата, который возвращает целевой сайт. В списке может присутствовать пустая строка `""`, что означает разрешение соединений без SNI. Для этого не требуется IP-сертификат у `target`; достаточно, чтобы он не отклонял Client Hello без SNI. При использовании этого режима клиентский `serverName` не должен быть пустым, вместо этого нужно указать любой корректный IP-адрес как заглушку. Поведение сервера на запросы без SNI можно посмотреть через `xray tls ping`. > `privateKey`: string Обязательный параметр. Генерируется командой `./xray x25519`. > `minClientVer`: string Необязательный параметр. Минимальная версия клиента Xray в формате `x.y.z`. > `maxClientVer`: string Необязательный параметр. Максимальная версия клиента Xray в формате `x.y.z`. > `maxTimeDiff`: number Необязательный параметр. Максимально допустимая разница времени в миллисекундах. > `shortIds`: [string] Обязательный параметр. Список допустимых `shortId`, которыми можно различать клиентов. Требования к формату описаны у поля `shortId`. Если список содержит пустую строку, клиентский `shortId` тоже может быть пустым. > `mldsa65Seed`: string Только для сервера. Приватный ключ, который используется для добавления дополнительной постквантовой подписи к сертификату, отправляемому клиенту REALITY, по алгоритму ML-DSA-65. Если когда-нибудь появится квантовый компьютер, способный ломать x25519, утечка `password` может позволить MITM-атаку; эта функция предназначена для защиты от такого будущего риска. Сгенерировать пару ключей можно командой `xray mldsa65`. После настройки приватного ключа на сервере подпись добавляется только как расширение сертификата и не влияет на старых клиентов или клиентов, которые не включали эту возможность. После включения этой функции сертификат, который возвращает `target`, **должен** быть длиннее 3500 байт, потому что постквантовая подпись делает временный сертификат REALITY больше. Чтобы это само не превратилось в отпечаток, сертификат `target` тоже должен быть большим. Проверить это можно через `xray tls ping example.com`. Для полной постквантовой устойчивости `target` также должен поддерживать X25519MLKEM768. > `limitFallbackUpload` / `limitFallbackDownload` ::: warning Лучшая практика для REALITY по-прежнему состоит в том, чтобы брать сертификаты у ресурса в том же ASN, поэтому в большинстве случаев эта функция вам не понадобится. Имеет смысл рассматривать ее только если вы вынуждены использовать сертификат чего-то вроде бесплатного CDN Cloudflare и хотите не допустить превращения сервера в ускоритель для посторонних. Само ограничение fallback-трафика тоже является отпечатком, поэтому не рекомендуется. Если вы делаете панель или one-click скрипт, такие параметры стоит рандомизировать. ::: ::: tip `limitFallbackUpload` и `limitFallbackDownload` необязательны и позволяют ограничивать скорость fallback-соединений, не прошедших проверку. Значение `bytesPerSec` по умолчанию равно `0`, то есть ограничение выключено. Механизм такой: для каждого непрошедшего проверку fallback-соединения ограничение включается после передачи `afterBytes` байт. Используется алгоритм token bucket. Размер корзины равен `burstBytesPerSec`. Каждый переданный байт тратит один токен. Изначально корзина заполнена полностью. Каждую секунду в нее добавляется `bytesPerSec` токенов, пока она снова не заполнится. Пример: `afterBytes=10485760`, `burstBytesPerSec=5242880`, `bytesPerSec=1048576` означает ограничение до 1 МБ/с после передачи 15 МБ. Если передача приостановится, через 5 секунд можно снова кратковременно выйти на 5 МБ/с. Если `afterBytes` и `burstBytesPerSec` слишком большие, практического эффекта почти не будет. Если `bytesPerSec` и `burstBytesPerSec` слишком маленькие, поведение становится слишком легко отличимым. Подбирать эти параметры нужно с учетом размера ресурсов у сайта, чей сертификат используется. Если всплески не нужны, установите `burstBytesPerSec` в `0`. ::: > `afterBytes`: number Необязательный параметр. Ограничение скорости для fallback-соединения REALITY начинает действовать только после передачи указанного числа байт. По умолчанию `0`. > `bytesPerSec`: number Необязательный параметр. Базовая скорость ограничения для fallback-соединения REALITY, в байтах в секунду. По умолчанию `0`, то есть отключено. > `burstBytesPerSec`: number Необязательный параметр. Пиковая скорость ограничения для fallback-соединения REALITY, в байтах в секунду. Работает, когда значение больше `bytesPerSec`. ::: tip Ниже идут параметры **outbound** (**клиентской стороны**). ::: > `serverName`: string Одно из серверных значений `serverNames`. Клиент также может указать здесь любой IP-адрес. Тогда Xray отправит Client Hello без SNI. Для этого в серверном `serverNames` должна присутствовать пустая строка `""`. > `fingerprint`: string Обязательный параметр. Работает так же, как [TLSObject](./tls.md#tlsobject). Значение `unsafe`, отключающее uTLS для обычного TLS, здесь не поддерживается, потому что REALITY опирается на эту библиотеку для управления низкоуровневыми параметрами TLS. > `shortId`: string Одно из серверных значений `shortIds`. Длина составляет 8 байт, то есть до 16 шестнадцатеричных символов в диапазоне `0`-`f`. Поле может быть короче 16 символов, тогда ядро автоматически дополнит его нулями справа, но количество символов обязательно должно быть **четным**, потому что один байт задается двумя hex-символами. Например, `aa1234` автоматически превратится в `aa12340000000000`, а `aaa1234` вызовет ошибку. Ноль тоже четный, поэтому если в серверном `shortIds` есть пустая строка `""`, клиентское значение тоже может быть пустым. > `password`: string Обязательный параметр. Публичный ключ, соответствующий приватному ключу сервера. Генерируется командой `./xray x25519 -i "приватный ключ сервера"`. Раньше поле называлось `publicKey`, но было переименовано, чтобы не вводить в заблуждение: формально это действительно x25519 public key, но в модели REALITY он хранится у клиента и не должен восприниматься как что-то публично публикуемое. > `mldsa65Verify` Необязательный параметр. Публичный ключ для проверки подписи `mldsa65`. Если значение не пустое, Xray использует его для проверки сертификата, полученного от сервера. Подробности см. у `mldsa65Seed`. > `spiderX`: string Начальный путь и параметры краулера. Рекомендуется использовать разные значения для разных клиентов.