EN & RU: Refactor finalmask

This commit is contained in:
Meow
2026-05-25 06:13:35 +08:00
parent c529dc44c2
commit 64b8a52456
2 changed files with 336 additions and 200 deletions
+177 -109
View File
@@ -1,8 +1,8 @@
# FinalMask
FinalMask добавляет последний слой маскировки после того, как ядро уже обработало защиту транспорта, включая TLS и REALITY.
FinalMask добавляет последний слой маскировки после того, как ядро уже обработало шифрование транспортного уровня, включая TLS и REALITY.
Он используется для разных вариантов TCP- и UDP-маскировки, а также для настройки параметров QUIC.
Его можно использовать для разных видов маскировки TCP- и UDP-трафика, а также для настройки параметров QUIC.
## FinalMaskObject
@@ -55,19 +55,31 @@ FinalMask добавляет последний слой маскировки п
}
```
> `tcp[n].type`: header-custom | fragment | sudoku
## TCPMask
Первый элемент массива является самым внешним слоем маскировки.
Массив для маскировки TCP-трафика, исходящего из ядра. Первый элемент массива является самым внешним слоем маскировки.
Используется вместе с `raw`, `httpupgrade`, `websocket`, `grpc` и `xhttp`.
```json
{
"finalmask": {
// [!code focus:6]
"tcp": [
{
"type": "",
"settings": {}
}
]
}
}
```
`header-custom`:
> `type`: header-custom | fragment | sudoku
`fragment`:
Тип этого слоя маскировки.
`sudoku`:
> `settings`: header-custom | fragment | sudoku
> `tcp[n].settings`: header-custom | fragment | sudoku
Конкретные настройки для этого типа маскировки. Поля каждого типа приведены ниже.
### header-custom
@@ -111,13 +123,13 @@ FinalMask добавляет последний слой маскировки п
`clients[n][m].delay`: задержка в миллисекундах. Если значение равно `0`, данные отправляются слитно с предыдущим пакетом.
`clients[n][m].rand`: добавить заданное число случайных байт. Несовместимо с `packet`.
`clients[n][m].rand`: добавляет указанное количество случайных байтов. Несовместимо с `packet`.
`clients[n][m].randRange`: диапазон значений случайных байт. По умолчанию `0-255`.
`clients[n][m].randRange`: диапазон значений случайных байтов. По умолчанию `0-255`.
`clients[n][m].type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию — `array`.
`clients[n][m].type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию - `array`.
`clients[n][m].packet`: добавить фиксированные данные. Несовместимо с `rand`.
`clients[n][m].packet`: добавляет фиксированные данные. Несовместимо с `rand`.
### fragment
@@ -130,6 +142,20 @@ FinalMask добавляет последний слой маскировки п
}
```
Управляет исходящей TCP-фрагментацией. В некоторых случаях это может обмануть системы цензуры, например помочь обойти SNI-блоклисты.
`"length"`, `"delay"` и `"maxSplit"` имеют тип [Int32Range](../../development/intro/guide.md#int32range).
`"packets"`: поддерживаются два режима фрагментации. `"1-3"` разрезает TCP-поток и применяется к 1-й, 2-й и 3-й операциям записи клиента. `"tlshello"` фрагментирует пакет TLS-рукопожатия.
`"length"`: длина фрагмента в байтах. Не может быть `0`.
`"delay"`: интервал между фрагментами в миллисекундах.
Если значение равно `0` и задано `"packets": "tlshello"`, фрагментированный Client Hello будет отправлен в одном TCP-пакете, если его исходный размер не превышает MSS или MTU и система не фрагментирует его автоматически.
`"maxSplit"`: максимальное количество фрагментов. Ограничивает, на сколько частей можно разделить один пакет. `0` означает без ограничений.
### sudoku
```json
@@ -137,62 +163,46 @@ FinalMask добавляет последний слой маскировки п
"password": "",
"ascii": "",
"customTable": "", // в upstream документации поле называется custom_table
"customTables": [""], // в upstream документации поле называется custom_tables
"customTable": "", // в upstream-документации поле называется custom_table
"customTables": [""], // в upstream-документации поле называется custom_tables
"paddingMin": 0, // в upstream документации поле называется padding_min
"paddingMax": 0 // в upstream документации поле называется padding_max
"paddingMin": 0, // в upstream-документации поле называется padding_min
"paddingMax": 0 // в upstream-документации поле называется padding_max
}
```
Смысл этих полей описан в [upstream-документации](https://github.com/SUDOKU-ASCII/sudoku/blob/main/configs/README.md).
Значение этих полей см. в [upstream-документации](https://github.com/SUDOKU-ASCII/sudoku/blob/main/configs/README.md).
> `udp[n].type`: header-custom | header-dns | header-dtls | header-srtp | header-utp | header-wechat | header-wireguard | mkcp-original | mkcp-aes128gcm | noise | salamander | sudoku | xdns | xicmp
## UDPMask
Первый элемент массива является самым внешним слоем маскировки.
Массив для маскировки UDP-трафика, исходящего из ядра. Первый элемент массива является самым внешним слоем маскировки.
Используется вместе с `raw` UDP, `kcp`, `hysteria` и `xhttp` H3.
```json
{
"finalmask": {
// [!code focus:6]
"udp": [
{
"type": "",
"settings": {}
}
]
}
}
```
`header-custom`: всегда добавляется как объединенный заголовок пакета.
> `type`: header-custom | header-dns | header-dtls | header-srtp | header-utp | header-wechat | header-wireguard | mkcp-original | mkcp-aes128gcm | noise | salamander | sudoku | xdns | xicmp
`header-dns`: старая DNS-маскировка mKCP. В некоторых кампусных сетях DNS-запросы разрешены до авторизации, поэтому этот режим добавляет DNS-заголовок к KCP.
Тип этого слоя маскировки.
`header-dtls`: старая DTLS-маскировка mKCP. Имитирует пакеты DTLS 1.2. Дополнительных настроек нет.
> `settings`: header-custom | header-dns | mkcp-aes128gcm | noise | salamander | sudoku | xdns | xicmp
`header-srtp`: старая SRTP-маскировка mKCP. Похожа на трафик видеозвонков вроде FaceTime. Дополнительных настроек нет.
`header-utp`: старая uTP-маскировка mKCP. Похожа на BitTorrent-трафик. Дополнительных настроек нет.
`header-wechat`: старая маскировка под WeChat Video из mKCP. Дополнительных настроек нет.
`header-wireguard`: старая WireGuard-маскировка mKCP. Выглядит как пакеты WireGuard, хотя реальным протоколом WireGuard не является. Дополнительных настроек нет.
`mkcp-original`: простая обфускация, которая раньше была значением по умолчанию в mKCP. Может понадобиться для подключения к старым mKCP-серверам. Дополнительных настроек нет.
`mkcp-aes128gcm`: старый режим `seed` в mKCP. Использует AES-128-GCM для обфускации.
`noise`: шум, отправляемый перед реальной полезной нагрузкой.
`salamander`: обфускация Salamander из Hysteria2.
`sudoku`:
`xdns`: передает данные через DNS-запросы по схеме, похожей на DNSTT. Для переноса полезной нагрузки выполняются обычные DNS TXT-запросы.
Из-за технических ограничений эффективный MTU очень маленький, поэтому QUIC здесь непрактичен. Рекомендуется сочетать режим с mKCP. Рекомендуемые MTU — 130 на клиенте и 900 на сервере.
Так как запросы являются стандартными DNS-запросами, их может пересылать любой UDP DNS-сервер, хотя эффективность будет низкой.
Для использования этого режима сервер должен слушать порт 53, прокси-протокол должен указывать целью DNS-сервер вроде `8.8.8.8:53`, а вы должны владеть доменом `domain` и направить его NS-запись на сервер.
Например, если у вас есть `example.com`, можно создать A-запись вроде `a.example.com`, указывающую на IP сервера, затем NS-запись вроде `t.example.com`, указывающую на `t.example.com`, и использовать `t.example.com` как рабочий домен. A-запись не должна быть поддоменом NS-записи.
`xicmp`: требует как минимум `CAP_NET_RAW`, должен быть самым внешним слоем, то есть первым элементом массива, и несовместим с `udpHop` и `dialerProxy`.
> `udp[n].settings`: header-custom | header-dns | mkcp-aes128gcm | noise | salamander | sudoku | xdns | xicmp
Конкретные настройки для этого типа маскировки. Поля каждого типа приведены ниже.
### header-custom
Всегда объединяется с заголовком пакета.
```json
{
"client": [
@@ -214,24 +224,52 @@ FinalMask добавляет последний слой маскировки п
}
```
`client[n].rand`: добавить заданное число случайных байт. Несовместимо с `packet`.
`client[n].rand`: добавляет указанное количество случайных байтов. Несовместимо с `packet`.
`client[n].randRange`: диапазон значений случайных байт. По умолчанию `0-255`.
`client[n].randRange`: диапазон значений случайных байтов. По умолчанию `0-255`.
`client[n].type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию — `array`.
`client[n].type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию - `array`.
`client[n].packet`: добавить фиксированные данные. Несовместимо с `rand`.
`client[n].packet`: добавляет фиксированные данные. Несовместимо с `rand`.
### header-dns
Старая DNS-маскировка из mKCP. В некоторых кампусных сетях DNS-запросы разрешены до авторизации, поэтому этот режим добавляет DNS-заголовок к KCP.
```json
{
"domain": "www.example.com"
}
```
### header-dtls
Старая DTLS-маскировка из mKCP. Маскирует пакеты под DTLS 1.2. Дополнительных настроек нет.
### header-srtp
Старая SRTP-маскировка из mKCP. Маскирует пакеты под SRTP и может определяться как трафик видеозвонков, например FaceTime. Дополнительных настроек нет.
### header-utp
Старая uTP-маскировка из mKCP. Маскирует пакеты под uTP и может определяться как трафик загрузки BitTorrent. Дополнительных настроек нет.
### header-wechat
Старая маскировка WeChat Video из mKCP. Маскирует пакеты под трафик видеозвонков WeChat. Дополнительных настроек нет.
### header-wireguard
Старая маскировка WireGuard из mKCP. Маскирует пакеты под трафик WireGuard, хотя это не настоящий протокол WireGuard. Дополнительных настроек нет.
### mkcp-original
Простая обфускация, которая раньше применялась в mKCP по умолчанию. Она может понадобиться для подключения к старым серверам mKCP. Дополнительных настроек нет.
### mkcp-aes128gcm
Соответствует старой функции `seed` в mKCP. Использует AES-128-GCM для обфускации.
```json
{
"password": "your-password"
@@ -240,9 +278,11 @@ FinalMask добавляет последний слой маскировки п
### noise
Шум, отправляемый перед реальными данными.
```json
{
"reset": 0,
"reset": "30-60",
"noise": [
{
"rand": "1-8192",
@@ -255,18 +295,22 @@ FinalMask добавляет последний слой маскировки п
}
```
`noise[n].rand`: добавить случайные байты или случайное число байт. Несовместимо с `packet`.
`reset`: значение типа [Int32Range](../../development/intro/guide.md#int32range) в секундах. После отправки шума состояние сбрасывается через указанное время, и шум можно снова отправить на тот же адрес. `0` означает не сбрасывать, то есть отправить только один раз.
`noise[n].randRange`: диапазон значений случайных байт. По умолчанию `0-255`.
`rand`: добавляет случайные байты или случайные байты заданной длины. Несовместимо с `packet`.
`noise[n].type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию — `array`.
`randRange`: диапазон значений случайных байтов. По умолчанию `0-255`.
`noise[n].packet`: добавить фиксированные данные. Несовместимо с `rand`.
`type`: тип `packet`. Поддерживаются `array`, `str`, `hex` и `base64`. Значение по умолчанию - `array`.
`noise[n].delay`: задержка в миллисекундах. После отправки одного элемента шума Xray ждет указанное время перед следующим.
`packet`: добавляет фиксированные данные. Несовместимо с `rand`.
`delay`: задержка в миллисекундах. После отправки одного элемента шума Xray ждёт указанное время перед отправкой следующего.
### salamander
Обфускация Salamander. Используется в Hysteria2.
```json
{
"password": "your-password"
@@ -288,18 +332,37 @@ FinalMask добавляет последний слой маскировки п
}
```
Здесь действуют те же значения, что и в TCP-версии.
Значения те же, что и в TCP-версии.
### xdns
Использует DNS-запросы для передачи данных, подобно DNSTT. Для переноса полезной нагрузки выполняются стандартные DNS-запросы; поддерживаются типы TXT, A и AAAA.
Из-за технических ограничений эффективный MTU очень мал, QUIC использовать нельзя, поэтому рекомендуется сочетать этот режим с mKCP. Рекомендуемые значения MTU: на клиенте 130; на сервере 900 для TXT, который почти передаёт исходные байты, для AAAA разумно уменьшить значение примерно до половины или ниже, а для A - примерно до одной восьмой или ниже. Теоретическая эффективность кодирования различается, а реальные значения зависят от того, сколько AAAA- или A-записей промежуточные форвардеры готовы терпеть в ответах.
Поскольку выполняются стандартные запросы, они могут пересылаться через любой UDP DNS-сервер, хотя эффективность может быть очень низкой.
Чтобы использовать эту функцию, сервер должен слушать порт 53, затем прокси-протокол должен указывать на DNS-сервер, например `8.8.8.8:53`, и у вас должен быть домен из `domains`, после чего его NS-запись нужно направить на сервер.
Например, если у вас есть `example.com`, задайте A-запись `a.example.com`, указывающую на IP сервера, затем задайте NS-запись `t.example.com`, указывающую на `t.example.com`, и используйте `t.example.com`. Хост, используемый в A-записи, не должен быть поддоменом хоста, используемого в NS-записи.
```json
{
"domain": "www.example.com"
"domains": ["t.example.com"],
"resolvers": ["t.example.com+udp://8.8.8.8:53"]
}
```
`domains`: используется на стороне сервера. Список доменов. Поддерживает указание типа запроса в формате `domain:method`, где `method` может быть `txt`, `a` или `aaaa`. Если `method` не указан, тип запроса не ограничивается.
`resolvers`: используется на стороне клиента. Список DNS-резолверов. Формат: `domain[:method]+udp://server:port`, где `method` может быть `txt` по умолчанию, `a` или `aaaa`.
Хотя бы одно из `domains` и `resolvers` должно быть заполнено.
### xicmp
Требует как минимум права `CAP_NET_RAW` и должен быть самым внешним слоем, то есть первым элементом массива. Его нельзя использовать вместе с `udpHop` и `dialerProxy`.
```json
{
"listenIp": "0.0.0.0",
@@ -307,35 +370,38 @@ FinalMask добавляет последний слой маскировки п
}
```
`listenIp`: IP-адрес, на котором выполняется прослушивание. По умолчанию `"0.0.0.0"`.
`listenIp`: IP-адрес для прослушивания. По умолчанию `"0.0.0.0"`.
Обратите внимание, что это отличается от обычного TCP/UDP-прослушивания на `"0.0.0.0"` и `"::"`. Поскольку ICMP на основе IPv4 и ICMPv6 на основе IPv6 не являются взаимозаменяемыми протоколами, указание `"0.0.0.0"` здесь означает прослушивание только ICMP поверх IPv4, и наоборот.
Обратите внимание, что это отличается от обычных адресов прослушивания TCP/UDP `"0.0.0.0"` и `"::"`. Поскольку ICMP по IPv4 и ICMPv6 по IPv6 несовместимы, указание `"0.0.0.0"` здесь означает прослушивание только IPv4 ICMP, и наоборот.
`id`: если несколько клиентов используют один IP, серверу рекомендуется оставлять здесь `0`.
`id`: если один IP используется несколькими клиентами, серверу рекомендуется оставлять это значение равным `0`.
> `quicParams`: [quicParamsObject](#quicParams)
### quicParams
## quicParams
```json
{
"congestion": "force-brutal",
"bbrProfile": "standard",
"debug": false,
"brutalUp": "60 mbps",
"brutalDown": 0,
"udpHop": {
"ports": "20000-50000",
"interval": "5-10"
},
"initStreamReceiveWindow": 8388608,
"maxStreamReceiveWindow": 8388608,
"initConnectionReceiveWindow": 20971520,
"maxConnectionReceiveWindow": 20971520,
"maxIdleTimeout": 30,
"keepAlivePeriod": 0,
"disablePathMTUDiscovery": false,
"maxIncomingStreams": 1024
"finalmask": {
// [!code focus:19]
"quicParams": {
"congestion": "force-brutal",
"bbrProfile": "standard",
"debug": false,
"brutalUp": "60 mbps",
"brutalDown": 0,
"udpHop": {
"ports": "20000-50000",
"interval": "5-10"
},
"initStreamReceiveWindow": 8388608,
"maxStreamReceiveWindow": 8388608,
"initConnectionReceiveWindow": 20971520,
"maxConnectionReceiveWindow": 20971520,
"maxIdleTimeout": 30,
"keepAlivePeriod": 0,
"disablePathMTUDiscovery": false,
"maxIncomingStreams": 1024
}
}
}
```
@@ -343,45 +409,47 @@ FinalMask добавляет последний слой маскировки п
> `congestion`: reno | bbr | brutal | force-brutal
Алгоритм управления перегрузкой. В Hysteria по умолчанию используется `brutal`, в XHTTP H3 — `bbr`.
Алгоритм управления перегрузкой. В Hysteria по умолчанию используется `brutal`, а в XHTTP H3 - `bbr`.
`reno` и `bbr` — обычные известные алгоритмы.
`reno` и `bbr` - известные алгоритмы.
`brutal` согласует фиксированную скорость отправки пакетов с другой стороной или откатывается к BBR. Поддерживается только в Hysteria, потому что у XHTTP нет механизма согласования.
`brutal`: согласует с другой стороной фиксированную скорость отправки пакетов или откатывается к BBR.
`force-brutal` работает так же, как `brutal`, но принудительно использует фиксированную исходящую скорость из `brutalUp`, игнорируя переговоры с другой стороной.
`force-brutal`: то же, что и `brutal`, но принудительно использует для исходящего трафика фиксированную скорость отправки из `brutalUp`, игнорируя согласование с другой стороной.
Обратите внимание: XHTTP H3 не может использовать режим `brutal`, потому что у него нет механизма согласования, но поддерживает `force-brutal`, которому согласование не требуется.
> `bbrProfile`: conservative | standard | aggressive
Управляет пресетом BBR, когда QUIC использует алгоритм BBR. По умолчанию — `standard`. `conservative` — чуть более осторожный, `aggressive` — чуть более агрессивный.
Когда для QUIC выбран алгоритм BBR, этот параметр управляет BBR-профилем. Значение по умолчанию - `standard`. `conservative` немного осторожнее, `aggressive` немного агрессивнее.
> `debug`: false | true
Включает логирование для реализаций `bbr` и `brutal`.
Включает логи для управления перегрузкой `bbr` и `brutal`.
> `brutalUp`: string
> `brutalDown`: string
Ограничения исходящей и входящей скорости. Значение по умолчанию — `0`.
Ограничения скорости загрузки и отдачи. Значение по умолчанию - `0`.
Формат дружелюбный: поддерживаются записи вроде `1000000`, `100kb`, `20 mb`, `100 mbps`, `1g`, `1 tbps`. Регистр неважен, пробелы необязательны. Если единицы измерения не указаны, используется `bps`. Значение не может быть ниже 65535 bps.
Формат удобен для пользователя и поддерживает разные распространённые записи битрейта, включая `1000000`, `100kb`, `20 mb`, `100 mbps`, `1g` и `1 tbps`. Регистр не важен, пробелы между значением и единицей можно ставить или не ставить, а если единица не указана, по умолчанию используется `bps`. Значение не может быть меньше 65535 bps.
Переговоры работают так же, как у Hysteria Brutal:
Поведение согласования такое же, как в Hysteria Brutal:
Серверное значение ограничивает максимальную скорость режима Brutal, которую клиент может выбрать. `0` означает отсутствие ограничения со стороны сервера.
Значение на стороне сервера ограничивает максимальную скорость режима Brutal, которую может выбрать клиент. `0` означает, что сервер не ограничивает клиента.
Если на клиенте указано `0`, используется режим BBR. Если значение не нулевое, используется Brutal-режим, но он все равно ограничивается серверной стороной.
Если на стороне клиента указано `0`, используется режим BBR. Если значение не нулевое, используется режим Brutal и он всё равно ограничивается значением на стороне сервера.
Не забывайте про относительность направлений: серверный upload — это клиентский download, а серверный download — это клиентский upload.
Помните, что направления относительны: исходящая скорость сервера соответствует входящей скорости клиента, а входящая скорость сервера - исходящей скорости клиента.
> `udpHop`: {"ports": string, "interval": number}
Настройка прыжков по UDP-портам.
`ports` задает диапазон портов. Это может быть одиночная строка вроде `"1234"`, диапазон вроде `"1145-1919"` или несколько сегментов через запятую, например `11,13,15-17`.
`ports` задаёт диапазон портов. Это может быть строка с одним числом, например `"1234"`, или диапазон, например `"1145-1919"` для портов с 1145 по 1919. Можно использовать запятые для разбиения на сегменты, например `11,13,15-17`.
`interval` — интервал переключения портов в секундах. Минимум — 5, значение по умолчанию — 30 секунд.
`interval` - интервал прыжков по портам в секундах. Минимум `5`, значение по умолчанию - `30` секунд.
> `initStreamReceiveWindow`: number
@@ -391,22 +459,22 @@ FinalMask добавляет последний слой маскировки п
> `maxConnectionReceiveWindow`: number
Это низкоуровневые параметры QUIC-окон. **Не меняйте их, если не понимаете точно, что делаете.** Если менять их все же нужно, рекомендуется сохранять соотношение окна потока и окна соединения на уровне 2:5.
Это четыре конкретных параметра QUIC-окон. **Не меняйте их, если вы не понимаете, что делаете.** Если менять всё же нужно, рекомендуется сохранять соотношение окна приёма потока и окна приёма соединения как 2:5.
> `maxIdleTimeout`: number
Максимальный таймаут простоя в секундах. Это время, после которого сервер закроет соединение, если не получает данные от клиента. Допустимый диапазон — от 4 до 120 секунд. Значение по умолчанию — 30 секунд.
Максимальный таймаут простоя в секундах. Это время, после которого сервер закроет соединение, если не получает никаких данных от клиента. Допустимый диапазон - от 4 до 120 секунд. Значение по умолчанию - `30` секунд.
> `keepAlivePeriod`: number
Интервал QUIC KeepAlive в секундах. Допустимый диапазон — от 2 до 60 секунд. По умолчанию выключено.
Интервал QUIC KeepAlive в секундах. Допустимый диапазон - от 2 до 60 секунд. По умолчанию отключено.
> `disablePathMTUDiscovery`: bool
Отключать ли Path MTU Discovery.
Во многих других реализациях на системах вне Linux, Windows и Darwin этот режим отключается принудительно, тогда как Xray не делает этого автоматически. Если ваша ОС не входит в эти три, возможно, придется отключить его вручную.
В других реализациях этот режим принудительно отключается на системах, отличных от Linux, Windows и Darwin, тогда как Xray не делает этого автоматически. Если ваша ОС не входит в `linux`, `windows` или `darwin`, возможно, вам придётся отключить его вручную.
> `maxIncomingStreams`: number
Только для сервера. Если параметр задан, он не должен быть меньше `8`.
Параметр стороны сервера. Если задан, он не должен быть меньше `8`.