REALITY
REALITY — это модификация TLS, которая использует внешний вид и характеристики рукопожатия целевого сайта как маскировку.
TIP
REALITY сейчас является одной из самых сильных схем защиты транспорта, а снаружи такой трафик выглядит как обычный веб-трафик.
Включение REALITY вместе с подходящим режимом управления потоком XTLS Vision может дать прирост производительности в несколько раз или даже больше чем в десять раз.
Для разработчиков
REALITY модифицирует только TLS. На стороне клиента в основном требуется легкая обработка полностью случайного session ID и пользовательской проверки сертификата, поэтому теоретически оно совместимо с большинством TLS-комбинаций. Подробнее см. в проекте REALITY.
RealityObject
RealityObject соответствует полю realitySettings в StreamSettingsObject.
{
// пример для outbound, аналогично применимо к inbound
"outbounds": [
{
// ...
"streamSettings": {
"security": "reality",
"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": ""
}
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
show: true | false
Если значение равно true, выводится отладочная информация.
TIP
Ниже идут параметры inbound (серверной стороны).
target: string
Обязательный параметр. Формат такой же, как у dest в 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 в fallback VLESS.
serverNames: [string]
Обязательный параметр. Список допустимых для клиента значений serverName. Подстановочный символ * не поддерживается.
Обычно достаточно держать этот список согласованным с target. На практике допустимы любые SNI, которые принимает сервер в соответствии с поведением target, обычно ориентируясь на SAN сертификата, который возвращает целевой сайт.
В списке может присутствовать пустая строка "", что означает разрешение соединений без 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. Значение 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
Начальный путь и параметры краулера. Рекомендуется использовать разные значения для разных клиентов.