mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2026-09-29 02:18:06 +03:00
206 lines
16 KiB
Markdown
206 lines
16 KiB
Markdown
# REALITY
|
||
|
||
REALITY — это модификация TLS, которая использует внешний вид и характеристики рукопожатия целевого сайта как маскировку.
|
||
|
||
REALITY можно использовать только вместе с транспортами `RAW`, `XHTTP` и `gRPC`.
|
||
|
||
:::: tip
|
||
REALITY сейчас является одной из самых сильных схем защиты транспорта, а снаружи такой трафик выглядит как обычный веб-трафик.<br>
|
||
Включение 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
|
||
|
||
Начальный путь и параметры краулера. Рекомендуется использовать разные значения для разных клиентов.
|