Встроенный DNS-модуль Xray имеет два основных назначения:
- Разрешение доменных имен в IP-адреса на этапе маршрутизации и сопоставление правил с полученными IP-адресами для разделения трафика.
Разрешение доменных имен и разделение трафика зависят от значения параметра `domainStrategy` в модуле конфигурации маршрутизации.
Встроенный DNS-сервер будет использоваться для DNS-запросов только при следующих значениях:
- На этапе маршрутизации: разрешает доменные имена в IP-адреса и выполняет сопоставление правил на основе полученных IP-адресов для разделения трафика. Разрешение доменных имен и разделение трафика зависят от значения `domainStrategy` в конфигурации модуля маршрутизации. Встроенный DNS-сервер будет использоваться для DNS-запросов только в том случае, если установлено одно из следующих двух значений:
- "IPIfNonMatch": при запросе доменного имени Xray сопоставляет его с доменами, указанными в правилах маршрутизации.
Если совпадение не найдено, встроенный DNS-сервер используется для разрешения доменного имени, а затем полученный IP-адрес снова сопоставляется с правилами маршрутизации на основе IP-адресов.
- "IPOnDemand": при сопоставлении правил, основанных на IP-адресах, доменное имя немедленно разрешается в IP-адрес для сопоставления.
- `"IPIfNonMatch"`: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации.
- `"IPOnDemand"`: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления.
- Разрешение целевого адреса для подключения.
- Например, в исходящем подключении `freedom`, если параметр `domainStrategy` установлен в `UseIP`, исходящие запросы будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение.
- Например, в `sockopt`, если параметр `domainStrategy` установлен в `UseIP`, системные соединения, инициированные этим исходящим подключением, будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение.
- Разрешает целевой адрес для подключения.
- Например, если в исходящем подключении `freedom` установить `domainStrategy` равным `UseIP`, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
- Например, если в `sockopt` установить `domainStrategy` равным `UseIP`, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
::: tip Совет 1
::: tip СОВЕТ 1
DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации.
:::
::: tip Совет 2
Поддерживаются только базовые запросы IP-адресов (записи A и AAAA). Записи CNAME будут запрашиваться повторно до тех пор, пока не будет возвращена запись A/AAAA. Другие запросы не обрабатываются встроенным DNS-сервером.
::: tip СОВЕТ 2
Поддерживаются только основные IP-запросы (записи A и AAAA), записи CNAME будут запрашиваться повторно до тех пор, пока не будет возвращена запись A/AAAA. Другие запросы не будут передаваться на встроенный DNS-сервер.
:::
## Процесс обработки DNS-запросов
## Процесс обработки DNS
Если запрашиваемое доменное имя:
- Соответствует сопоставлению "домен - IP" или "домен - массив IP" в `hosts`, то этот IP-адрес или массив IP-адресов возвращается в качестве результата DNS-разрешения.
- Соответствует сопоставлению "домен - домен" в `hosts`, то значение этого сопоставления (другой домен) используется в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS-запросов продолжается до тех пор, пока не будет разрешен IP-адрес или не будет возвращен пустой результат.
- Не соответствует `hosts`, но соответствует списку доменов `domains` одного (или нескольких) DNS-серверов, то запросы отправляются на соответствующие DNS-серверы в порядке приоритета.
Если запрос к DNS-серверу завершается неудачей или `expectIPs` не совпадает, используется следующий подходящий DNS-сервер.
В противном случае возвращается полученный IP-адрес.
Если запросы ко всем подходящим DNS-серверам завершаются неудачей или `expectIPs` не совпадает, компонент DNS:
- По умолчанию выполняет "резервный (fallback) запрос DNS": запросы отправляются на "DNS-серверы, которые не использовались в предыдущем раунде неудачных запросов и для которых `skipFallback` имеет значение по умолчанию `false`".
Если запрос завершается неудачей или `expectIPs` не совпадает, возвращается пустой результат.
В противном случае возвращается полученный IP-адрес.
- Если `disableFallback` установлен в `true`, "резервный (fallback) запрос DNS" не выполняется.
- Не соответствует `hosts` и не соответствует списку доменов `domains` ни одного DNS-сервера, то:
- По умолчанию запросы отправляются на "DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`".
Если запрос к первому выбранному DNS-серверу завершается неудачей или `expectIPs` не совпадает, используется следующий выбранный DNS-сервер.
В противном случае возвращается полученный IP-адрес.
Если запросы ко всем выбранным DNS-серверам завершаются неудачей или `expectIPs` не совпадает, возвращается пустой результат.
- Если количество "DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`", равно 0 или `disableFallback` установлен в `true`, используется первый DNS-сервер в конфигурации DNS.
Если запрос завершается неудачей или `expectIPs` не совпадает, возвращается пустой результат.
В противном случае возвращается полученный IP-адрес.
- Совпадает с сопоставлением «доменное имя - IP», «доменное имя - массив IP» в `hosts`, то этот IP или массив IP возвращается в качестве результата разрешения DNS.
- Совпадает с сопоставлением «доменное имя - доменное имя» в `hosts`, то значение этого сопоставления (другое доменное имя) будет использоваться в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS будет продолжаться до тех пор, пока не будет разрешен IP-адрес или возвращено пустое разрешение.
- Не совпадает с `hosts`, но совпадает с одним (несколькими) списками доменов `domains` на DNS-серверах, то в соответствии с приоритетом совпадающих правил, DNS-серверы, соответствующие этим правилам, будут использоваться для запроса по очереди. Если запрос к DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем совпадающим DNS-серверам не удался или `expectIPs` не совпадает, то компонент DNS:
- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
- Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет.
- Не совпадает ни с `hosts`, ни со списками доменов `domains` на DNS-серверах, то:
- По умолчанию DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался или `expectIPs` не совпадает, то возвращается пустое разрешение.
- Если количество DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`, равно 0 или `disableFallback` установлен в `true`, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
## DnsObject
`DnsObject` соответствует полю `dns` в конфигурационном файле.
`DnsObject` соответствует элементу `dns` в файле конфигурации.
Статический список IP-адресов, значение которого представляет собой набор сопоставлений "домен": "адрес" или "домен": ["адрес 1", "адрес 2"].
Адрес может быть IP-адресом или доменным именем.
При разрешении доменного имени, если домен соответствует одному из элементов этого списка:
Статический список IP-адресов, значением которого является серия "доменное имя": "адрес" или "доменное имя": ["адрес 1","адрес 2"]. Где адрес может быть IP-адресом или доменным именем. При разрешении доменного имени, если доменное имя соответствует элементу в этом списке:
- Если адрес элемента - это IP-адрес, то результатом разрешения будет IP-адрес элемента.
- Если адрес элемента - это доменное имя, то для разрешения IP-адреса будет использоваться это доменное имя, а не исходное доменное имя.
- Если в адресе указано несколько IP-адресов и доменных имен, то возвращается только первое доменное имя, остальные IP-адреса и доменные имена игнорируются.
- Если адрес элемента является IP-адресом, то результатом разрешения будет IP-адрес этого элемента.
- Если адрес элемента является доменным именем, то для разрешения IP-адреса будет использоваться это доменное имя, а не исходное доменное имя.
- Если в адресе установлено несколько IP-адресов и доменных имен, то будет возвращено только первое доменное имя, остальные IP-адреса и доменные имена будут проигнорированы.
Доменные имена могут быть представлены в следующих форматах:
Формат доменного имени может быть следующим:
- Простая строка: правило применяется, если эта строка полностью совпадает с целевым доменным именем.
Например, "xray.com" соответствует "xray.com", но не соответствует "www.xray.com".
- Регулярное выражение: начинается с `"regexp:"`, а остальная часть - это регулярное выражение.
Правило применяется, если это регулярное выражение соответствует целевому доменному имени.
Например, "regexp:\\\\.goo.\*\\\\.com\$" соответствует "www.google.com", "fonts.googleapis.com", но не соответствует "google.com".
- Поддомен (рекомендуется): начинается с `"domain:"`, а остальная часть - это доменное имя.
Правило применяется, если это доменное имя является целевым доменным именем или его поддоменом.
Например, "domain:xray.com" соответствует "www.xray.com" и "xray.com", но не соответствует "wxray.com".
- Подстрока: начинается с `"keyword:"`, а остальная часть - это строка.
Правило применяется, если эта строка соответствует любой части целевого доменного имени.
Например, "keyword:sina.com" соответствует "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn".
- Предопределенный список доменов: начинается с `"geosite:"`, а остальная часть - это имя, например `geosite:google` или `geosite:cn`.
Список имен и доменов см. в разделе [Предопределенные списки доменов](./routing.md#предопределенные-списки-доменов).
- Простая строка: правило вступает в силу, если эта строка полностью совпадает с целевым доменным именем. Например, "xray.com" соответствует "xray.com", но не соответствует "www.xray.com".
- Регулярное выражение: начинается с `"regexp:"`, остальная часть является регулярным выражением. Правило вступает в силу, если это регулярное выражение соответствует целевому доменному имени. Например, "regexp:\\\\.goo.\*\\\\.com\$" соответствует "www.google.com", "fonts.googleapis.com", но не соответствует "google.com".
- Поддомен (рекомендуется): начинается с `"domain:"`, остальная часть является доменным именем. Правило вступает в силу, если это доменное имя является целевым доменным именем или его поддоменом. Например, "domain:xray.com" соответствует "www.xray.com" и "xray.com", но не соответствует "wxray.com".
- Подстрока: начинается с `"keyword:"`, остальная часть является строкой. Правило вступает в силу, если эта строка соответствует любой части целевого доменного имени. Например, "keyword:sina.com" может соответствовать "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn".
- Предопределенный список доменов: начинается с `"geosite:"`, остальная часть является именем, например, `geosite:google` или `geosite:cn`. Имена и списки доменов см. в разделе [Предопределенные списки доменов](./routing.md#предопределенные-списки-доменов).
Список DNS-серверов, поддерживаются два типа: адрес DNS (в виде строки) и [ServerObject](#serverobject).
Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и [DnsServerObject](#dnsserverobject).
Значение `"localhost"` означает использование локальных настроек DNS.
Значение `"localhost"` означает использование предустановленной конфигурации DNS на локальной машине.
Если значение - это адрес DNS `"IP:Port"`, например `"8.8.8.8:53"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов.
Запрос будет следовать правилам маршрутизации.
Если порт не указан, по умолчанию используется порт 53.
Если значением является DNS-адрес `"IP:Порт"`, например, `"8.8.8.8:53"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. Этот запрос следует правилам маршрутизации. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"tcp://host:port"`, например `"tcp://8.8.8.8:53"`, Xray будет использовать `DNS over TCP` для запросов.
Запрос будет следовать правилам маршрутизации.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"tcp://хост:порт"`, например, `"tcp://8.8.8.8:53"`, Xray будет использовать `DNS over TCP` для запроса. Этот запрос следует правилам маршрутизации. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"tcp+local://host:port"`, например `"tcp+local://8.8.8.8:53"`, Xray будет использовать `локальный режим TCP (TCPL)` для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"tcp+local://хост:порт"`, например, `"tcp+local://8.8.8.8:53"`, Xray будет использовать `локальный режим TCP (TCPL)` для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"https://host:port/dns-query"`, например `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запросов.
Некоторые провайдеры имеют сертификаты с IP-псевдонимами, поэтому можно использовать IP-адрес напрямую, например `https://1.1.1.1/dns-query`.
Также можно использовать нестандартные порты и пути, например `"https://a.b.c.d:8443/my-dns-query"`.
Если значение имеет вид `"https://хост:порт/dns-query"`, например, `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, `https://1.1.1.1/dns-query`. Также можно использовать нестандартные порты и пути, например, `"https://a.b.c.d:8443/my-dns-query"`.
Если значение имеет вид `"https+local://host:port/dns-query"`, например `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запросов.
Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Обычно этот режим подходит для использования на сервере.
Также можно использовать нестандартные порты и пути.
Если значение имеет вид `"https+local://хост:порт/dns-query"`, например, `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути.
Если значение имеет вид `"quic+local://host"`, например `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DNS over QUIC (DOQL)` для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom.
Этот режим требует, чтобы DNS-сервер поддерживал DNS over QUIC.
По умолчанию для запросов используется порт 853, можно использовать нестандартный порт.
Если значение имеет вид `"quic+local://хост"`, например, `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DNS over QUIC (DOQL)` для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom. Этот метод требует, чтобы DNS-сервер поддерживал DNS over QUIC. По умолчанию для запроса используется порт 853, можно использовать нестандартный порт.
Если значение равно `fakedns`, для запросов будет использоваться FakeDNS.
Если значением является `fakedns`, то для запроса будет использоваться функция FakeDNS.
::: tip Совет 1
При использовании `localhost` локальные DNS-запросы не контролируются Xray.
Для того, чтобы DNS-запросы перенаправлялись через Xray, требуется дополнительная настройка.
::: tip СОВЕТ 1
При использовании `localhost` DNS-запросы локальной машины не контролируются Xray, для того чтобы DNS-запросы перенаправлялись Xray, требуется дополнительная настройка.
:::
::: tip Совет 2
Разные DNS-клиенты, инициализированные разными правилами, будут отображаться в журнале запуска Xray с уровнем `info`, например, `local DOH`, `remote DOH`, `udp` и т.д.
::: tip СОВЕТ 2
Инициализированные DNS-клиенты для различных правил отображаются в журнале запуска Xray с уровнем `info`, например, режимы `local DOH`, `remote DOH` и `udp`.
:::
::: tip Совет 3
(v1.4.0+) Можно включить ведение журнала DNS-запросов в [настройках журнала](./log.md).
::: tip СОВЕТ 3
(v1.4.0+) Вы можете включить ведение журнала DNS-запросов в [журнале](./log.md).
:::
> `clientIp`: string
IP-адрес, который будет сообщаться серверу при выполнении DNS-запросов.
Не может быть частным IP-адресом.
Используется для указания IP-адреса клиента при отправке DNS-запросов на сервер. Не может быть приватным адресом.
::: tip Совет 1
::: tip СОВЕТ 1
Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet.
:::
::: tip Совет 2
Можно указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject) или для каждого DNS-сервера в [ServerObject](#serverobject) (настройка в ServerObject имеет приоритет над настройкой в DnsObject).
::: tip СОВЕТ 2
Вы можете указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject), а также указать `clientIp` для каждого DNS-сервера в конфигурации [DnsServerObject](#dnsserverobject) (приоритет выше, чем у конфигурации [DnsObject](#dnsobject)).
Значение по умолчанию - `UseIP`, запрашиваются как записи A, так и записи AAAA.
`UseIPv4` - запрашиваются только записи A; `UseIPv6` - запрашиваются только записи AAAA.
Значение по умолчанию `UseIP` запрашивает как записи A, так и записи AAAA. `UseIPv4` запрашивает только записи A; `UseIPv6` запрашивает только записи AAAA.
Новая функция в Xray-core v1.8.6: `queryStrategy` можно настроить для каждого `DNS`-сервера.
Новая функция в Xray-core v1.8.6: `queryStrategy` можно установить отдельно для каждого `DNS`сервера.
```json
"dns": {
@ -200,7 +160,7 @@ IP-адрес, который будет сообщаться серверу п
"geosite:netflix"
],
"skipFallback": true,
"queryStrategy": "UseIPv4" // Запрос записей A для доменов netflix
"queryStrategy": "UseIPv4" // запрос записей A для домена netflix
},
{
"address": "https://1.1.1.1/dns-query",
@ -208,21 +168,19 @@ IP-адрес, который будет сообщаться серверу п
"geosite:openai"
],
"skipFallback": true,
"queryStrategy": "UseIPv6" // Запрос записей AAAA для доменов openai
"queryStrategy": "UseIPv6" // запрос записей AAAA для домена openai
}
],
"queryStrategy": "UseIP" // Запрос записей A и AAAA для всех доменов
"queryStrategy": "UseIP" // запрос записей A и AAAA для всех остальных доменов
}
```
::: tip Совет 1
Глобальное значение `"queryStrategy"` имеет приоритет.
Если значение `"queryStrategy"` в дочернем элементе конфликтует с глобальным значением `"queryStrategy"`, дочерний запрос вернет пустой ответ.
::: tip СОВЕТ 1
Глобальное значение `"queryStrategy"` имеет приоритет. Если значение `"queryStrategy"` в дочернем элементе конфликтует с глобальным значением `"queryStrategy"`, запрос дочернего элемента вернет пустой ответ.
:::
::: tip Совет 2
Если параметр `"queryStrategy"` не указан в дочернем элементе, используется глобальное значение `"queryStrategy"`.
Поведение такое же, как и в версиях Xray-core до v1.8.6.
::: tip СОВЕТ 2
Если параметр `"queryStrategy"` не указан в дочернем элементе, используется значение глобального параметра `"queryStrategy"`. Поведение аналогично версиям Xray-core до v1.8.6.
:::
Например:<br>
@ -241,33 +199,32 @@ IP-адрес, который будет сообщаться серверу п
"geosite:netflix"
],
"skipFallback": true,
"queryStrategy": "UseIPv6" // Конфликт между глобальным значением "UseIPv4" и дочерним значением "UseIPv6"
"queryStrategy": "UseIPv6" // конфликт между глобальным значением "UseIPv4" и дочерним значением "UseIPv6"
}
],
"queryStrategy": "UseIPv4"
}
```
Дочерний запрос для доменов netflix вернет пустой ответ из-за конфликта значений `"queryStrategy"`.
Домены netflix будут разрешены с помощью `https://1.1.1.1/dns-query`, и будут получены записи A.
Запрос домена netflix вернет пустой ответ из-за конфликта значений `"queryStrategy"`. Запись A для домена netflix будет получена от `https://1.1.1.1/dns-query`.
> `disableCache`: true | false
`true`- отключить кэширование DNS, по умолчанию `false` (кэширование включено).
`true`отключает кэширование DNS, по умолчанию `false`, то есть кэширование включено.
`true`отключает откат DNS-запросов (fallback), по умолчанию `false`, то есть откат включен.
> `disableFallbackIfMatch`: true | false
`true`- отключить резервные (fallback) DNS-запросы, если совпадает приоритетный список доменов DNS-сервера, по умолчанию `false` (резервные запросы включены).
`true`отключает откат DNS-запросов (fallback), если сработал список доменов с приоритетным сопоставлением для DNS-сервера, по умолчанию `false`, то есть откат включен.
> `tag`: string
Трафик запросов, отправляемых встроенным DNS-сервером (кроме режимов `localhost`, `fakedns`, `TCPL`, `DOHL` и `DOQL`), можно сопоставить с помощью этого тега, используя `inboundTag` в правилах маршрутизации.
Трафик запросов, отправляемых встроенным DNS, за исключением режимов `localhost`, `fakedns`, `TCPL`, `DOHL` и `DOQL`, можно сопоставить в маршрутизации с помощью `inboundTag` по этому тегу.
### ServerObject
### DnsServerObject
```json
{
@ -282,63 +239,40 @@ IP-адрес, который будет сообщаться серверу п
> `address`: address
Адрес DNS-сервера.
Поддерживаются два типа: адрес DNS (в виде строки) и ServerObject.
Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и DnsServerObject.
Значение `"localhost"` означает использование локальных настроек DNS.
Значение `"localhost"` означает использование предустановленной конфигурации DNS на локальной машине.
Если значение - это адрес DNS `"IP"`, например `"8.8.8.8"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов.
Запрос будет следовать правилам маршрутизации.
По умолчанию используется порт 53.
Если значением является DNS-адрес `"IP"`, например, `"8.8.8.8"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. Этот запрос следует правилам маршрутизации. По умолчанию используется порт 53.
Если значение имеет вид `"tcp://host"`, например `"tcp://8.8.8.8"`, Xray будет использовать `DNS over TCP` для запросов.
Запрос будет следовать правилам маршрутизации.
По умолчанию используется порт 53.
Если значение имеет вид `"tcp://хост"`, например, `"tcp://8.8.8.8"`, Xray будет использовать `DNS over TCP` для запроса. Этот запрос следует правилам маршрутизации. По умолчанию используется порт 53.
Если значение имеет вид `"tcp+local://host"`, например `"tcp+local://8.8.8.8"`, Xray будет использовать `локальный режим TCP (TCPL)` для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"tcp+local://хост"`, например, `"tcp+local://8.8.8.8"`, Xray будет использовать `локальный режим TCP (TCPL)` для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид `"https://host:port/dns-query"`, например `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запросов.
Некоторые провайдеры имеют сертификаты с IP-псевдонимами, поэтому можно использовать IP-адрес напрямую, например `https://1.1.1.1/dns-query`.
Также можно использовать нестандартные порты и пути, например `"https://a.b.c.d:8443/my-dns-query"`.
Если значение имеет вид `"https://хост:порт/dns-query"`, например, `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, `https://1.1.1.1/dns-query`. Также можно использовать нестандартные порты и пути, например, `"https://a.b.c.d:8443/my-dns-query"`.
Если значение имеет вид `"https+local://host:port/dns-query"`, например `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запросов.
Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Обычно этот режим подходит для использования на сервере.
Также можно использовать нестандартные порты и пути.
Если значение имеет вид `"https+local://хост:порт/dns-query"`, например, `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути.
Если значение имеет вид `"quic+local://host:port"`, например `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DOQ (DOQL)` для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom.
Этот режим требует, чтобы DNS-сервер поддерживал DNS over QUIC.
По умолчанию для запросов используется порт 853, можно использовать нестандартный порт.
Если значение имеет вид `"quic+local://хост:порт"`, например, `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DOQ (DOQL)` для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom. Этот метод требует, чтобы DNS-сервер поддерживал DNS over QUIC. По умолчанию для запроса используется порт 853, можно использовать нестандартный порт.
Если значение равно `fakedns`, для запросов будет использоваться FakeDNS.
Если значением является `fakedns`, то для запроса будет использоваться функция FakeDNS.
> `port`: number
Порт DNS-сервера, например `53`.
По умолчанию используется порт `53`.
Этот параметр не используется в режимах DOH, DOHL, DOQL.
Нестандартный порт должен быть указан в URL.
Порт DNS-сервера, например, `53`. Если этот элемент не указан, по умолчанию используется значение `53`. Этот элемент не используется в режимах DOH, DOHL, DOQL, нестандартный порт должен быть указан в URL.
> `domains`: \[string\]
Список доменов, для которых в первую очередь будет использоваться этот сервер.
Формат доменных имен такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
Список доменов. Домены из этого списка будут в первую очередь запрашиваться через этот сервер. Формат доменного имени такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
> `expectIPs`:\[string\]
> `expectIPs`:\[string\]
Список диапазонов IP-адресов, формат такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
Если этот параметр настроен, DNS Xray будет проверять возвращаемые IP-адреса и возвращать только те, которые входят в список `expectIPs`.
Если этот элемент настроен, Xray DNS будет проверять возвращаемые IP-адреса и возвращать только адреса, входящие в список `expectIPs`.
Если этот параметр не настроен, IP-адреса возвращаются без изменений.
Если этот элемент не настроен, IP-адреса будут возвращены как есть.
> `skipFallback`: true | false
`true` - пропустить этот сервер при выполнении резервных (fallback) DNS-запросов, по умолчанию `false` (не пропускать).
`true` - этот сервер будет пропущен при выполнении отката DNS-запроса (fallback), по умолчанию `false`, то есть сервер не будет пропущен.
Стандартная реализация протокола Socks, совместимая с [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol), [Socks 4a](https://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4A.protocol) и Socks 5.
Реализация стандартного протокола Socks, совместимая с [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol), [Socks 4a](https://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4A.protocol), Socks 5 и **HTTP**.
::: danger
**Протокол Socks не обеспечивает шифрование передачи данных, поэтому он не подходит для передачи данных через общедоступные сети.**
**Протокол Socks не шифрует передаваемые данные и не подходит для передачи по общедоступным сетям.**
:::
Использование входящих соединений `SOCKS` более целесообразно в локальной сети или локальной среде, где он может быть использован для прослушивания входящих подключений и предоставления локальных сервисов другим программам.
Входящее соединение `Socks` более целесообразно использовать для прослушивания в локальной сети или на локальном компьютере, предоставляя локальные сервисы другим программам.
## InboundConfigurationObject
@ -27,35 +27,37 @@
> `auth`: "noauth" | "password"
Метод аутентификации протокола Socks, поддерживаются режимы `"noauth"` (анонимный) и `"password"` (с использованием пароля пользователя).
Метод аутентификации протокола Socks. Поддерживается анонимный метод `"noauth"` и метод с паролем `"password"`.
Значение по умолчанию: `"noauth"`.
При использовании метода `password` для HTTP-запросов, отправляемых на входящее соединение, также потребуется указать те же имя пользователя и пароль.
Массив, каждый элемент которого представляет собой учетную запись пользователя.
Этот параметр действителен только если `auth` установлен в значение `password`.
Этот параметр действителен, только если для параметра`auth` установлено значение `password`.
Значение по умолчанию: пустой массив.
Значение по умолчанию — пустой массив.
> `udp`: true | false
Включает или отключает поддержку протокола UDP.
Включить ли поддержку протокола UDP.
Значение по умолчанию:`false`.
Значение по умолчанию —`false`.
> `ip`: address
Если UDP включен, Xray должен знать IP-адрес локального хоста.
Если включена поддержка UDP, Xray должен знать IP-адрес локального компьютера.
Значение по умолчанию:`"127.0.0.1"`.
Значение по умолчанию —`"127.0.0.1"`.
> `userLevel`: number
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя.
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
Значение `userLevel` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, по умолчанию используется значение `0`.
### AccountObject
@ -68,10 +70,8 @@
> `user`: string
Имя пользователя, тип данных: строка. Обязательный параметр.
Имя пользователя, тип — строка. Обязательный параметр.
> `pass`: string
Пароль, тип данных: строка. Обязательный параметр.
VLESS не предусматривает встроенного шифрования, поэтому обязательным условием для его использования является наличие надежного канала, такого как TLS или REALITY.
Маскировка IP-адресов. При включении автоматически заменяет IP-адреса, встречающиеся в логах, для защиты конфиденциальности при совместном использовании логов. По умолчанию не включено.
В настоящее время доступны следующие уровни маскировки: `quarter`, `half`, `full`. Соответствующие форматы маскировки:
DNS — это исходящий протокол, который в основном используется для перехвата и пересылки DNS-запросов.
Этот исходящий протокол может принимать только DNS-трафик (включая запросы по протоколам UDP и TCP), другие типы трафика будут вызывать ошибки.
Этот исходящий протокол может принимать только DNS-трафик (включая запросы по протоколам UDP и TCP), другие типы трафика вызовут ошибку.
При обработке DNS-запросов этот исходящий протокол перенаправляет IP-запросы (то есть A и AAAA) на встроенный [DNS-сервер](../dns.md). Другие типы запросов будут перенаправлены на их исходные адреса назначения.
При обработке DNS-запросов этот исходящий протокол пересылает запросы IP-адресов (то есть A и AAAA) на встроенный [DNS-сервер](../dns.md). Другие типы запросов см. в разделе `nonIPQuery` ниже.
## OutboundConfigurationObject
@ -13,24 +13,31 @@ DNS — это исходящий протокол, который в основ
"network": "tcp",
"address": "1.1.1.1",
"port": 53,
"nonIPQuery": "drop"
"nonIPQuery": "drop",
"blockTypes": []
}
```
> `network`: "tcp" | "udp"
Изменяет транспортный протокол DNS-трафика, возможные значения: `"tcp"` и `"udp"`. Если не указан, сохраняется исходный транспортный протокол.
Изменяет транспортный протокол DNS-трафика. Допустимые значения: `"tcp"` и `"udp"`. Если не указано, используется исходный транспортный протокол.
> `address`: address
Изменяет адрес DNS-сервера. Если не указан, сохраняется адрес, указанный в источнике.
Изменяет адрес DNS-сервера. Если не указано, используется адрес, указанный в источнике.
> `port`: number
Изменяет порт DNS-сервера. Если не указан, сохраняется порт, указанный в источнике.
Изменяет порт DNS-сервера. Если не указано, используется порт, указанный в источнике.
> `nonIPQuery`: string
Управляет не IP-запросами (не A и AAAA), `"drop"` - отбрасывать или `"skip"` - не обрабатывать встроенным DNS-сервером, а пересылать на целевой сервер. Значение по умолчанию:`"drop"`.
Управляет запросами, не относящимися к IP-адресам (не A и AAAA). `"drop"` — отклонять, `"skip"` — не обрабатывать встроенным DNS-сервером, а пересылать на целевой сервер. Значение по умолчанию —`"drop"`.
## Пример настройки DNS <Badgetext="WIP"type="warning"/>
> `blockTypes`: array
Массив целых чисел, блокирующий типы запросов, указанные в массиве. Например, `"blockTypes":[65,28]` блокирует запросы типа 65 (HTTPS) и 28 (AAAA).
Поскольку `nonIPQuery` по умолчанию отклоняет все запросы, не относящиеся к A и AAAA, необходимо установить для него значение `skip`, чтобы этот параметр заработал. Конечно, можно и не менять, а использовать его только для блокировки запросов A или AAAA, чтобы блокировать запросы IPv4/IPv6, но это крайне не рекомендуется. Рекомендуется настроить соответствующие параметры в `queryStrategy` встроенного DNS-сервера.
## Примеры конфигурации DNS <Badgetext="В РАЗРАБОТКЕ"type="warning"/>
Если целевой адрес является доменным именем, настройте соответствующее значение для режима работы Freedom:
Когда целевым адресом является доменное имя, при настройке соответствующих значений Freedom будет вести себя следующим образом:
- При использовании `"AsIs"` Xray будет напрямую использовать системный стек для установления соединения, приоритет и выбор IP будут зависеть от системных настроек. По некоторым причинам UDP-соединения, использующие доменные имена, будут игнорировать системные настройки и отдавать приоритет IPv4.
- При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если DNSObject отсутствует, будет использоваться системный DNS. Если существует несколько подходящих IP-адресов, ядро случайным образом выберет один IP-адрес в качестве целевого.
- `"IPv4"` означает попытку подключения только с использованием IPv4, `"IPv4v6"`- попытку подключения с использованием IPv4 или IPv6, но с предпочтением IPv4 для доменных имен с поддержкой обоих протоколов. (То же самое относится и к v4v6, но в обратном порядке, поэтому здесь не приводится).
- Если в настройках встроенного DNS указан параметр `"queryStrategy"`, фактическое поведение будет объединено с этой опцией, и будут разрешаться только те типы IP, которые включены в обе опции. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
- При использовании опций, начинающихся с `"Use"`, если результаты разрешения не соответствуют требованиям (например, доменное имя имеет только результат разрешения IPv4, но используется UseIPv6), будет выполнен откат к AsIs.
- При использовании опций, начинающихся с `"Force"`, если результаты разрешения не соответствуют требованиям, соединение не будет установлено.
- При использовании `"AsIs"` Xray будет напрямую использовать системный стек для установления соединения. Приоритет и выбор IP-адреса зависят от системных настроек. По некоторым причинам, UDP-соединения, использующие доменные имена, игнорируют системные настройки и отдают приоритет IPv4.
- При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если `DNSObject` не существует, будет использоваться системный DNS. Если имеется несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса.
- `"IPv4"` означает попытку подключения только по IPv4, `"IPv4v6"`— попытку подключения по IPv4 или IPv6, но для доменных имен с двумя стеками будет использоваться IPv4 (аналогично для v4v6, не будем повторяться).
- Если в настройках встроенного DNS указан `"queryStrategy"`, фактическое поведение будет объединено с этим параметром, и будут разрешаться только те типы IP, которые указаны в обоих параметрах. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
- При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`.
- При использовании параметров, начинающихся с `"Force"`, если результат разрешения не соответствует требованиям, соединение установить не удастся.
::: tip СОВЕТ 1
При использовании режимов `"UseIP"` или `"ForceIP"` и указании `sendThrough` в [конфигурации исходящего соединения](../outbound.md#outboundobject) Freedom будет автоматически определять необходимый тип IP (IPv4 или IPv6) на основе значения `sendThrough`. Если вручную указать один тип IP (например, UseIPv4), но он не совпадает с локальным адресом, указанным в `sendThrough`, соединение не будет установлено.
При использовании режимов `"UseIP"` или `"ForceIP"` и указании `sendThrough` в [конфигурации исходящего соединения](../outbound.md#outboundobject), Freedom будет автоматически определять необходимый тип IP-адреса (IPv4 или IPv6) на основе значения `sendThrough`. Если вручную указан только один тип IP-адреса (например, `UseIPv4`), но он не соответствует локальному адресу, указанному в `sendThrough`, подключение установить не удастся.
:::
> `redirect`: адрес_порт
> `redirect`: address_port
Freedom будет принудительно отправлять все данные на указанный адрес (а не на адрес, указанный во входящем соединении).
Его значение представляет собой строку, например: `"127.0.0.1:80"`, `":1234"`.
Значение — строка, например: `"127.0.0.1:80"`, `":1234"`.
Если адрес не указан, например,`":443"`, Freedom не будет изменять исходный целевой адрес.
Если порт равен `0`, например,`"xray.com: 0"`, Freedom не будет изменять исходный порт.
Если адрес не указан, например `":443"`, Freedom не будет изменять исходный целевой адрес.
Если порт равен `0`, например `"xray.com: 0"`, Freedom не будет изменять исходный порт.
> `userLevel`: number
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя.
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
Значение `userLevel` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, по умолчанию используется значение `0`.
> `fragment`: map
Некоторые пары "ключ-значение" для управления исходящей TCP-фрагментацией, которые в некоторых случаях могут обмануть систему цензуры, например, обойти черный список SNI.
Несколько пар «ключ-значение», используемых для управления исходящей фрагментацией TCP. В некоторых случаях это может обмануть системы цензуры, например, обойти черные списки SNI.
`"packets"`: поддерживаются два режима фрагментации: "1-3" - это фрагментация потока TCP, применяемая к первым трем операциям записи данных на стороне клиента. "tlshello" - это фрагментация пакета TLS-рукопожатия.
`"packets"`: поддерживаются два режима фрагментации: "1-3" — фрагментация потока TCP, применяется к первым трем операциям записи данных на стороне клиента; "tlshello" — фрагментация пакета TLS-рукопожатия.
`"length"`: длина фрагмента пакета (в байтах).
`"length"`: длина фрагмента (в байтах).
`"interval"`: интервал фрагментации (в миллисекундах).
`"interval"`: интервал между фрагментами (в мс).
> `proxyProtocol`: number
Если значение равно `0` и установлено `"packets": "tlshello"`, фрагментированный пакет Client Hello будет отправлен в одном TCP-пакете (если его исходный размер не превышает MSS или MTU, что приводит к автоматической фрагментации системой).
> `noise`: array
UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS.
Протокол PROXY обычно используется в сочетании с `redirect` для перенаправления на Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.
Массив, в котором можно определить несколько пакетов шума для отправки. Отдельный элемент массива определяется следующим образом:
Значение proxyProtocol - это номер версии протокола PROXY, возможные значения: `1` или `2`. Если не указано, используется значение по умолчанию - `0` (протокол не используется).
`"type"`: тип пакета шума. В настоящее время поддерживаются `"rand"` (случайные данные), `"str"` (пользовательская строка) и `"base64"` (пользовательские двоичные данные, закодированные в Base64).
`"packet"`: содержимое пакета данных, основанное на предыдущем значении `type`.
- Если `type` равен `rand`, здесь указывается длина случайных данных. Это может быть фиксированное значение, например `"100"`, или диапазон значений, например `"50-150"`.
- Если `type` равен `str`, здесь указывается строка для отправки.
- Если `type` равен `base64`, здесь указываются двоичные данные, закодированные в Base64.
`"delay"`: задержка в миллисекундах. После отправки этого пакета шума ядро будет ожидать указанное время, прежде чем отправить следующий пакет шума или реальные данные. По умолчанию ожидание отсутствует. Можно установить целое число, например `100`, или строку с диапазоном значений, например `"50-150"`.
> `proxyProtocol`: number
Протокол PROXY обычно используется в сочетании с `redirect` для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.
`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется).
VLESS не предусматривает встроенного шифрования, поэтому обязательным условием для его использования является наличие надежного канала, такого как TLS или REALITY.
Модуль маршрутизации позволяет направлять входящие данные через разные исходящие подключения в соответствии с различными правилами, что позволяет реализовать проксирование по требованию.
Модуль маршрутизации может отправлять входящие данные через разные исходящие соединения в соответствии с разными правилами для достижения цели проксирования по требованию.
Например, распространенным сценарием использования является разделение трафика на внутренний и внешний.
Xray может определять трафик из разных регионов с помощью внутренних механизмов и отправлять его через разные исходящие подключения.
Например, распространенным сценарием использования является разделение внутреннего и внешнего трафика. Xray может использовать внутренние механизмы для определения трафика из разных регионов, а затем отправлять его на разные исходящие прокси.
Более подробное описание функции маршрутизации: [Введение в маршрутизацию (routing)](../document/level-1/routing-lv1-part1.md).
Более подробный анализ функции маршрутизации: [Краткий анализ функции маршрутизации (routing)](../document/level-1/routing-lv1-part1.md).
## RoutingObject
`RoutingObject` соответствует полю `routing` в конфигурационном файле.
`RoutingObject` соответствует элементу `routing` в файле конфигурации.
```json
{
@ -24,40 +23,36 @@ Xray может определять трафик из разных регион
Стратегия разрешения доменных имен. Используются разные стратегии в зависимости от настройки.
- `"AsIs"`: использовать только доменные имена для выбора маршрута.
Значение по умолчанию.
- `"IPIfNonMatch"`: если доменное имя не соответствует ни одному правилу, разрешить доменное имя в IP-адрес (запись A или AAAA) и снова выполнить сопоставление.
- Если у домена есть несколько записей A, Xray попытается сопоставить все записи A, пока одна из них не совпадет с каким-либо правилом.
- Разрешенный IP-адрес используется только для выбора маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя.
- `"IPOnDemand"`: при сопоставлении с любым правилом, основанным на IP-адресе, доменное имя немедленно разрешается в IP-адрес для сопоставления.
- `"AsIs"`: для выбора маршрута используются только доменные имена. Значение по умолчанию.
- `"IPIfNonMatch"`: если доменное имя не соответствует ни одному правилу, доменное имя разрешается в IP-адрес (запись A или запись AAAA) для повторного сопоставления;
- Если у доменного имени несколько записей A, предпринимается попытка сопоставить все записи A, пока одна из них не будет соответствовать какому-либо правилу;
- Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя;
- `"IPOnDemand"`: если при сопоставлении встречается любое правило на основе IP-адреса, доменное имя немедленно разрешается в IP-адрес для сопоставления;
> `domainMatcher`: "hybrid" | "linear"
Алгоритм сопоставления доменных имен.
Этот параметр влияет на все `RuleObject`, для которых не указан алгоритм сопоставления.
Алгоритм сопоставления доменных имен. Используются разные алгоритмы в зависимости от настройки. Этот параметр влияет на все `RuleObject`, для которых не указан отдельный алгоритм сопоставления.
- `"hybrid"`: использовать новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше памяти.
Значение по умолчанию.
- `"linear"`: использовать старый алгоритм сопоставления доменных имен.
- `"hybrid"`: используется новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше места. Значение по умолчанию.
- `"linear"`: используется старый алгоритм сопоставления доменных имен.
> `rules`: \[[RuleObject](#ruleobject)\]
Массив, каждый элемент которого представляет собой правило.
Соответствует массиву, каждый элемент которого является правилом.
Для каждого соединения маршрутизатор проверяет правила сверху вниз.
Когда встречается первое подходящее правило, соединение перенаправляется на исходящее подключение, указанное в его `outboundTag` или `balancerTag`.
Для каждого соединения маршрутизация будет выполняться в соответствии с этими правилами сверху вниз. Когда встречается первое действующее правило, это соединение перенаправляется на указанный им `outboundTag` или `balancerTag`.
::: tip
Если ни одно правило не подходит, трафик отправляется через первое исходящее подключение по умолчанию.
Если ни одно правило не совпадает, трафик по умолчанию отправляется через первый исходящий канал.
Массив, каждый элемент которого представляет собой конфигурацию балансировщика нагрузки.
Массив, каждый элемент которого является конфигурацией балансировщика нагрузки.
Если правило указывает на балансировщик нагрузки, Xray выбирает исходящее подключение через этот балансировщик нагрузки и перенаправляет трафик через него.
Когда правило указывает на балансировщик нагрузки, Xray выбирает исходящий канал через этот балансировщик нагрузки, а затем перенаправляет трафик через него.
### RuleObject
@ -76,162 +71,133 @@ Xray может определять трафик из разных регион
"protocol": ["http", "tls", "bittorrent"],
"attrs": { ":method": "GET" },
"outboundTag": "direct",
"balancerTag": "balancer"
"balancerTag": "balancer",
"ruleTag": "rule name"
}
```
::: danger
Если указано несколько атрибутов, правило применяется только в том случае, если **все** атрибуты совпадают.
Если указано несколько атрибутов, они должны выполняться **одновременно**, чтобы текущее правило вступило в силу.
:::
> `domainMatcher`: "hybrid" | "linear"
Алгоритм сопоставления доменных имен.
Этот параметр имеет приоритет над параметром `domainMatcher` в `RoutingObject`.
Алгоритм сопоставления доменных имен. Используются разные алгоритмы в зависимости от настройки. Этот параметр имеет приоритет над `domainMatcher`, настроенным в `RoutingObject`.
- `"hybrid"`: использовать новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше памяти.
Значение по умолчанию.
- `"linear"`: использовать старый алгоритм сопоставления доменных имен.
- `"hybrid"`: используется новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше места. Значение по умолчанию.
- `"linear"`: используется старый алгоритм сопоставления доменных имен.
> `type`: "field"
В настоящее время поддерживается только значение`"field"`.
В настоящее время поддерживается только опция`"field"`.
::: tip
В Xray-core v1.8.7 и более поздних версиях эту строку можно опустить.
Можно опустить эту строку в Xray-core v1.8.7 или более поздней версии.
:::
> `domain`: \[string\]
Массив, каждый элемент которого представляет собой шаблон доменного имени.
Доступны следующие форматы:
- Простая строка: правило применяется, если эта строка соответствует любой части целевого доменного имени.
Например, "sina.com" соответствует "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn".
- Регулярное выражение: начинается с `"regexp:"`, а остальная часть - это регулярное выражение.
Правило применяется, если это регулярное выражение соответствует целевому доменному имени.
Например, "regexp:\\\\.goo.\*\\\\.com\$" соответствует "www.google.com" или "fonts.googleapis.com", но не соответствует "google.com".
- Поддомен (рекомендуется): начинается с `"domain:"`, а остальная часть - это доменное имя.
Правило применяется, если это доменное имя является целевым доменным именем или его поддоменом.
Например, "domain:xray.com" соответствует "www.xray.com" и "xray.com", но не соответствует "wxray.com".
- Полное совпадение: начинается с `"full:"`, а остальная часть - это доменное имя.
Правило применяется, если это доменное имя полностью совпадает с целевым доменным именем.
Например, "full:xray.com" соответствует "xray.com", но не соответствует "www.xray.com".
- Предопределенный список доменов: начинается с `"geosite:"`, а остальная часть - это имя, например `geosite:google` или `geosite:cn`.
Список имен и доменов см. в разделе [Предопределенные списки доменов](#предопределенные-списки-доменов).
- Загрузка доменов из файла: имеет вид `"ext:file:tag"`, где `ext:` (в нижнем регистре) - префикс, за которым следует имя файла и тег.
Файл должен находиться в [каталоге ресурсов](./features/env.md#пути-к-файлам-ресурсов).
Формат файла такой же, как у `geosite.dat`.
Тег должен присутствовать в файле.
Массив, каждый элемент которого представляет собой сопоставление доменного имени. Возможны следующие форматы:
- Простая строка: правило вступает в силу, если эта строка соответствует любой части целевого доменного имени. Например, "sina.com" может соответствовать "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn".
- Регулярное выражение: начинается с `"regexp:"`, остальная часть является регулярным выражением. Правило вступает в силу, если это регулярное выражение соответствует целевому доменному имени. Например, `"regexp:\\\\.goo.\*\\\\.com\$"` соответствует "www.google.com" или "fonts.googleapis.com", но не соответствует "google.com". (Обратите внимание, что в json обратная косая черта, часто используемая в регулярных выражениях, используется как escape-символ, поэтому обратная косая черта `\` в регулярном выражении должна быть заменена на `\\`)
- Поддомен (рекомендуется): начинается с `"domain:"`, остальная часть является доменным именем. Правило вступает в силу, если это доменное имя является целевым доменным именем или его поддоменом. Например, "domain:xray.com" соответствует "www.xray.com", "xray.com", но не соответствует "wxray.com".
- Полное совпадение: начинается с `"full:"`, остальная часть является доменным именем. Правило вступает в силу, если это доменное имя полностью соответствует целевому доменному имени. Например, "full:xray.com" соответствует "xray.com", но не соответствует "www.xray.com".
- Предопределенный список доменов: начинается с `"geosite:"`, остальная часть является именем, например, `geosite:google` или `geosite:cn`. Имена и списки доменов см. в разделе [Предопределенные списки доменов](#предопределенные-списки-доменов).
- Загрузка доменных имен из файла: имеет вид `"ext:файл:тег"`, должно начинаться с `ext:` (в нижнем регистре), за которым следует имя файла и тег, файл хранится в [каталоге ресурсов](./features/env.md#путь-к-файлу-ресурсов), формат файла такой же, как у `geosite.dat`, тег должен существовать в файле.
::: tip
`"ext:geoip.dat:cn"` эквивалентно `"geoip:cn"`.
`"ext:geoip.dat:cn"` эквивалентно `"geoip:cn"`
:::
> `ip`: \[string\]
Массив, каждый элемент которого представляет собой диапазон IP-адресов.
Правило применяется, если один из элементов соответствует целевому IP-адресу.
Доступны следующие форматы:
Массив, каждый элемент которого представляет собой диапазон IP-адресов. Правило вступает в силу, если какой-либо элемент соответствует целевому IP-адресу. Возможны следующие форматы:
- IP-адрес: например, `"127.0.0.1"`.
- [CIDR](https://ru.wikipedia.org/wiki/Бесклассовая_адресация): например, `"10.0.0.0/8"`.
- Предопределенный список IP-адресов: этот список включен в каждый установочный пакет Xray и называется `geoip.dat`.
Используйте формат `"geoip:cn"`, где `geoip:` (в нижнем регистре) - префикс, за которым следует двухбуквенный код страны.
Поддерживаются практически все страны с доступом в Интернет.
- Специальное значение: `"geoip:private"`, включает все частные IP-адреса, например `127.0.0.1`.
- Инверсия (!): `"geoip:!cn"` означает все IP-адреса, кроме тех, что указаны в `geoip:cn`.
- Загрузка IP-адресов из файла: имеет вид `"ext:file:tag"`, где `ext:` (в нижнем регистре) - префикс, за которым следует имя файла и тег.
Файл должен находиться в [каталоге ресурсов](./features/env.md#пути-к-файлам-ресурсов).
Формат файла такой же, как у `geoip.dat`.
Тег должен присутствовать в файле.
- [CIDR](https://ru.wikipedia.org/wiki/Бесклассовая_междоменная_маршрутизация): например, `"10.0.0.0/8"`, также можно использовать `"0.0.0.0/0"``"::/0"` для указания всех IPv4- или IPv6-адресов.
- Предопределенный список IP-адресов: этот список встроен в каждый установочный пакет Xray, имя файла - `geoip.dat`. Формат использования: `"geoip:код_страны"`, должно начинаться с `geoip:` (в нижнем регистре), за которым следует двухбуквенный код страны, поддерживаются почти все страны с доступом в Интернет.
- Специальное значение: `"geoip:private"`, включает в себя все частные адреса, например, `127.0.0.1`.
- Функция инверсии (!), `"geoip:!cn"` означает результаты, не входящие в `geoip:cn`.
- Загрузка IP-адресов из файла: имеет вид `"ext:файл:тег"`, должно начинаться с `ext:` (в нижнем регистре), за которым следует имя файла и тег, файл хранится в [каталоге ресурсов](./features/env.md#путь-к-файлу-ресурсов), формат файла такой же, как у `geoip.dat`, тег должен существовать в файле.
- Комбинация двух вышеуказанных форматов, разделенных запятыми ",".
Например: `"53,443,1000-2000"`.
- `"a-b"`: a и b являются положительными целыми числами, меньшими 65536. Этот диапазон является замкнутым интервалом, правило вступает в силу, если порт назначения попадает в этот диапазон.
- `a`: a является положительным целым числом, меньшим 65536. Правило вступает в силу, если порт назначения равен a.
- Смесь двух вышеуказанных форматов, разделенных запятой ",". Например: `"53,443,1000-2000"`.
Правило применяется, если порт источника равен `a`.
- Комбинация двух вышеуказанных форматов, разделенных запятыми ",".
Например: `"53,443,1000-2000"`.
- `"a-b"`: a и b являются положительными целыми числами, меньшими 65536. Этот диапазон является замкнутым интервалом, правило вступает в силу, если порт источника попадает в этот диапазон.
- `a`: a является положительным целым числом, меньшим 65536. Правило вступает в силу, если порт источника равен a.
- Смесь двух вышеуказанных форматов, разделенных запятой ",". Например: `"53,443,1000-2000"`.
> `network`: "tcp" | "udp" | "tcp,udp"
Допустимые значения: "tcp", "udp" или "tcp,udp".
Правило применяется, если тип сети соединения соответствует указанному значению.
Допустимые значения: "tcp", "udp" или "tcp,udp". Правило вступает в силу, если тип соединения соответствует указанному.
> `source`: \[string\]
Массив, каждый элемент которого представляет собой диапазон IP-адресов.
Доступны следующие форматы: IP-адрес, CIDR, GeoIP и загрузка IP-адресов из файла.
Правило применяется, если один из элементов соответствует IP-адресу источника.
Массив, каждый элемент которого представляет собой диапазон IP-адресов. Возможные форматы: IP-адрес, CIDR, GeoIP и загрузка IP-адресов из файла. Правило вступает в силу, если какой-либо элемент соответствует IP-адресу источника.
> `user`: \[string\]
Массив, каждый элемент которого представляет собой адрес электронной почты.
Правило применяется, если один из элементов соответствует пользователю источника.
Массив, каждый элемент которого является адресом электронной почты. Правило вступает в силу, если какой-либо элемент соответствует пользователю-источнику.
Аналогично доменному имени, также поддерживается сопоставление с помощью регулярных выражений, начинающихся с `regexp:`. (Также необходимо заменить `\` на `\\`, см. объяснение в разделе `domain`)
> `inboundTag`: \[string\]
Массив, каждый элемент которого представляет собой тег.
Правило применяется, если один из элементов соответствует тегу входящего протокола.
Массив, каждый элемент которого является тегом. Правило вступает в силу, если какой-либо элемент соответствует тегу входящего протокола.
> `protocol`: \[ "http" | "tls" | "bittorrent" \]
Массив, каждый элемент которого представляет собой протокол.
Правило применяется, если один из элементов соответствует типу протокола текущего соединения.
Массив, каждый элемент которого представляет собой протокол. Правило вступает в силу, если какой-либо протокол соответствует типу протокола текущего соединения.
::: tip
Для определения типа протокола соединения необходимо включить параметр `sniffing` во входящем подключении.
Необходимо включить опцию `sniffing` во входящем прокси, чтобы определить тип протокола, используемого соединением.
:::
> `attrs`: object
Объект JSON, где ключи и значения являются строками, используемый для проверки атрибутов трафика.
Правило применяется, если заголовки HTTP содержат все указанные ключи, а значения содержат указанные подстроки.
Ключи нечувствительны к регистру.
Значения могут быть регулярными выражениями.
Объект json, ключи и значения которого являются строками, используется для проверки значений атрибутов трафика. Правило вступает в силу, если HTTP-заголовки содержат все указанные ключи, а значения содержат указанные подстроки. Регистр ключей не учитывается. Значения поддерживают использование регулярных выражений.
Также поддерживаются псевдозаголовки h2, такие как `:method` и `:path`, для сопоставления метода и пути (хотя в HTTP/1.1 эти заголовки отсутствуют)
В настоящее время этот атрибут устанавливается только входящим прокси HTTP.
Для метода, отличного от CONNECT, входящего HTTP-запроса, `attrs` можно получить напрямую, для других входящих запросов необходимо включить `sniffing`, чтобы получить эти значения для сопоставления.
Примеры:
- Проверка метода HTTP GET: `{":method": "GET"}`
- Проверка пути HTTP: `{":path": "/test"}"`
- Проверка типа содержимого: `{"accept": "text/html"}"`
Необходимо указать либо `balancerTag`, либо `outboundTag`.
Если указаны оба параметра, используется `outboundTag`.
Необходимо указать либо `balancerTag`, либо `outboundTag`. Если указаны оба, используется `outboundTag`.
:::
> `ruleTag`: string
Необязательно, не имеет фактического эффекта, используется только для идентификации имени этого правила.
Если установлено, при совпадении с этим правилом в журнал с уровнем Info будет выводиться соответствующая информация, используемая для отладки того, какое правило маршрутизации сработало.
### BalancerObject
Настройки балансировщика нагрузки.
Когда балансировщик нагрузки активируется, он выбирает наиболее подходящее исходящее подключение из указанных и перенаправляет трафик через него.
Конфигурация балансировщика нагрузки. Когда балансировщик нагрузки активен, он выбирает наиболее подходящий исходящий канал из указанных исходящих каналов в соответствии с конфигурацией и перенаправляет трафик через него.
```json
{
@ -244,18 +210,17 @@ Xray может определять трафик из разных регион
> `tag`: string
Тег этого балансировщика нагрузки, используемый для сопоставления с `balancerTag` в `RuleObject`.
Тег этого балансировщика нагрузки, используется для сопоставления с `balancerTag` в `RuleObject`.
> `selector`: \[ string \]
Массив строк, каждый элемент которого будет использоваться для сопоставления с префиксом тега исходящего подключения.
Например, для следующих тегов исходящих подключений: `[ "a", "ab", "c", "ba" ]`, `"selector": ["a"]` будет соответствовать `[ "a", "ab" ]`.
Массив строк, каждая из которых будет использоваться для сопоставления с префиксом тега исходящего канала. Например, для следующих тегов исходящих каналов: `[ "a", "ab", "c", "ba" ]`, `"selector": ["a"]` будет соответствовать `[ "a", "ab" ]`.
Если найдено несколько совпадений, балансировщик нагрузки в настоящее время выбирает одно из них случайным образом.
Если найдено несколько исходящих каналов, балансировщик нагрузки в настоящее время случайным образом выбирает один из них в качестве конечного исходящего канала.
> `fallbackTag`: string
Исходящее подключение, которое будет использоваться, если балансировщик нагрузки не сможет выбрать подходящее исходящее подключение.
Если балансировщик нагрузки не может выбрать подходящий исходящий канал, используется исходящий канал, указанный в этом параметре.
> `strategy`: [StrategyObject](#strategyobject)
@ -268,21 +233,17 @@ Xray может определять трафик из разных регион
- `random` (значение по умолчанию): случайный выбор из подходящих исходящих подключений.
- `roundRobin`: последовательный выбор из подходящих исходящих подключений.
- `leastPing`: выбор исходящего подключения с наименьшей задержкой на основе результатов мониторинга подключений.
Требуется настроить [observatory](./observatory.md#observatoryobject).
- `leastLoad`: выбор наиболее стабильного исходящего подключения на основе результатов мониторинга подключений.
Требуется настроить [burstObservatory](./observatory.md#burstobservatoryobject).
- `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси.
- `roundRobin`: выбирает соответствующие исходящие прокси по очереди.
- `leastPing`: выбирает соответствующий исходящий прокси с наименьшей задержкой на основе результатов наблюдений за соединением. Необходимо добавить параметр конфигурации [observatory](./observatory.md#observatoryobject).
- `leastLoad`: выбирает наиболее стабильный соответствующий исходящий прокси на основе результатов наблюдений за соединением. Необходимо добавить параметр конфигурации [burstObservatory](./observatory.md#burstobservatoryobject).
Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`.
Это необязательный параметр. Формат настройки зависит от стратегии балансировки нагрузки.
В настоящее время этот параметр можно использовать только со стратегией `leastLoad`.
### Пример конфигурации балансировщика нагрузки
### Примеры конфигурации балансировки нагрузки
```json
"routing": {
@ -309,18 +270,15 @@ Xray может определять трафик из разных регион
"inbounds": [
{
// Настройки входящего подключения
"tag": "in"
}
]
"outbounds": [
{
// Настройки исходящего подключения
"tag": "out1"
},
{
// Настройки исходящего подключения
"tag": "out2"
}
]
@ -328,14 +286,12 @@ Xray может определять трафик из разных регион
### Предопределенные списки доменов
Этот список включен в каждый установочный пакет Xray и называется `geosite.dat`.
Этот файл содержит некоторые распространенные доменные имена.
Формат использования: `geosite:filename`, например `geosite:google` означает сопоставление с доменными именами, указанными в файле в разделе `google`, для маршрутизации или фильтрации DNS.
Этот список встроен в каждый установочный пакет Xray, имя файла - `geosite.dat`. Этот файл содержит некоторые распространенные доменные имена. Формат использования: `geosite:имя_файла`, например, `geosite:google` означает фильтрацию маршрутизации или DNS для доменных имен, соответствующих `google` в файле.
Распространенные доменные имена:
- `category-ads`: содержит доменные имена распространенных рекламных сервисов.
- `category-ads-all`: содержит доменные имена распространенных рекламных сервисов, а также доменные имена поставщиков рекламы.
- `category-ads`: содержит распространенные доменные имена рекламы.
- `category-ads-all`: содержит распространенные доменные имена рекламы, а также доменные имена поставщиков рекламы.
- `cn`: эквивалентно объединению `geolocation-cn` и `tld-cn`.
- `apple`: содержит большинство доменных имен Apple.
- `google`: содержит большинство доменных имен Google.
@ -343,15 +299,10 @@ Xray может определять трафик из разных регион
- `facebook`: содержит большинство доменных имен Facebook.
- `twitter`: содержит большинство доменных имен Twitter.
- `telegram`: содержит большинство доменных имен Telegram.
- `geolocation-cn`: содержит доменные имена распространенных сайтов, расположенных в Китае.
- `geolocation-!cn`: содержит доменные имена распространенных сайтов, расположенных за пределами Китая.
- `tld-cn`: содержит доменные имена верхнего уровня, управляемые CNNIC и используемые в Китае, например, домены, оканчивающиеся на `.cn`, `.中国`.
- `tld-!cn`: содержит доменные имена верхнего уровня, не используемые в Китае, например, домены, оканчивающиеся на `.tw` (Тайвань), `.jp` (Япония), `.sg` (Сингапур), `.us` (США), `.ca` (Канада) и т.д.
- `geolocation-cn`: содержит распространенные доменные имена сайтов материкового Китая.
- `geolocation-!cn`: содержит распространенные доменные имена сайтов, не относящихся к материковому Китаю.
- `tld-cn`: содержит домены верхнего уровня, управляемые CNNIC для использования в материковом Китае, например, доменные имена, оканчивающиеся на `.cn`, `.中国`.
- `tld-!cn`: содержит домены верхнего уровня, не используемые в материковом Китае, например, доменные имена, оканчивающиеся на `.tw` (Тайвань), `.jp` (Япония), `.sg` (Сингапур), `.us` (США), `.ca` (Канада) и т.д.
Вы также можете просмотреть полный список доменов здесь: [Domain list community](https://github.com/v2fly/domain-list-community).
Транспорт (transport) - это способ, которым текущий узел Xray взаимодействует с другими узлами.
Способ передачи (transport) — это способ взаимодействия текущего узла Xray с другими узлами.
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено.
## StreamSettingsObject
`StreamSettingsObject` соответствует полю `streamSettings` во входящем или исходящем подключении.
Каждое входящее или исходящее подключение может иметь свои собственные настройки транспорта.
`StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи.
Reality обеспечивает более высокий уровень безопасности, чем TLS, и настраивается аналогично TLS.
Конфигурация Reality. Reality — это оригинальная технология Xray. Reality обеспечивает более высокий уровень безопасности, чем TLS, и настраивается так же, как TLS.
::: tip
Reality - это самый безопасный на данный момент способ шифрования транспорта, и внешний трафик выглядит как обычный интернет-трафик.
Включение Reality и настройка правильного режима управления потоком XTLS Vision может привести к увеличению производительности в несколько раз.
Reality — это самое безопасное на данный момент решение для шифрования передачи данных, и внешний вид трафика такой же, как и при обычном просмотре веб-страниц. Включение Reality и настройка подходящего режима управления потоком XTLS Vision может повысить производительность в несколько раз или даже в десятки раз.
:::
> `tcpSettings`: [TcpObject](./transports/tcp.md)
Настройки TCP для текущего подключения, действуют только при использовании TCP.
"cipherSuites": "Здесь укажите названия необходимых вам наборов шифров, разделяя их двоеточиями",
"certificates": [],
"disableSystemRoot": false,
"enableSessionResumption": false,
@ -140,83 +125,65 @@ Reality - это самый безопасный на данный момент
> `serverName`: string
Доменное имя сертификата сервера.
Используется, если соединение установлено по IP-адресу.
Указывает доменное имя сертификата сервера, полезно, когда соединение устанавливается по IP-адресу.
Если этот параметр не указан, автоматически используется значение из `address` (если это доменное имя).
Это значение также используется для проверки действительности сертификата сервера.
Если оставить пустым, автоматически используется значение из адреса (если это доменное имя), это значение также используется для проверки действительности сертификата сервера.
::: tip
Как упомянуто выше, поскольку это значение также используется для проверки действительности сертификата сервера, если по какой-либо причине вам нужно указать значение, отличное от доменного имени в сертификате сервера, необходимо включить параметр `allowInsecure`, иначе проверка сертификата завершится неудачей.
Из соображений безопасности мы не рекомендуем использовать этот метод постоянно.
Если вам нужно безопасно подменить SNI, рассмотрите возможность использования REALITY.
Как упоминалось выше, поскольку это значение также используется для проверки действительности сертификата сервера, если вы измените его на доменное имя, отличное от доменного имени сертификата сервера, необходимо включить `allowInsecure`, иначе произойдет сбой проверки сертификата. Из соображений безопасности мы не рекомендуем использовать этот метод в течение длительного времени. Если вам нужно безопасно подделать SNI, рассмотрите возможность использования REALITY.
В частности, если на клиенте указан IP-адрес, Xray не будет отправлять SNI.
Чтобы использовать эту функцию, также необходимо включить `allowInsecure`.
В частности, если клиент устанавливает его в IP-адрес, Xray не будет отправлять SNI, и для использования этой функции также необходимо включить `allowInsecure`.
:::
> `rejectUnknownSni`: bool
Если значение равно `true`, сервер отклонит рукопожатие TLS, если полученный SNI не совпадает с доменным именем в сертификате.
Значение по умолчанию - `false`.
Если значение равно `true`, то сервер отклонит рукопожатие TLS, если полученный SNI не соответствует доменному имени сертификата. По умолчанию равно `false`.
> `alpn`: \[ string \]
Массив строк, указывающий значения ALPN, используемые при рукопожатии TLS.
Значение по умолчанию - `["h2", "http/1.1"]`.
Массив строк, указывающий значения ALPN, указанные во время рукопожатия TLS. Значение по умолчанию: `["h2", "http/1.1"]`.
> `minVersion`: string
Минимальная допустимая версия TLS.
`minVersion` — это минимально допустимая версия TLS.
> `maxVersion`: string
Максимальная допустимая версия TLS.
`maxVersion` — это максимально допустимая версия TLS.
> `cipherSuites`: string
Список поддерживаемых наборов шифров, разделенных двоеточиями.
`CipherSuites` используется для настройки списка поддерживаемых наборов шифров, разделенных двоеточиями.
Список наборов шифров Golang и их описания можно найти [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L500) или [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L44).
Вы можете найти список наборов шифров Golang и их описания [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L500) или [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L44).
::: danger
Эти два параметра не являются обязательными и обычно не влияют на безопасность.
Если они не настроены, Golang автоматически выбирает их в зависимости от устройства.
Если вы не знакомы с этими параметрами, не настраивайте их.
Вы несете ответственность за любые проблемы, вызванные неправильной настройкой.
Эти два параметра конфигурации не являются обязательными и обычно не влияют на безопасность. Если они не настроены, Golang автоматически выберет их в зависимости от устройства. Если вы не знакомы с ними, пожалуйста, не настраивайте эти параметры, вы несете ответственность за проблемы, вызванные неправильным заполнением.
:::
> `allowInsecure`: true | false
Разрешить небезопасные соединения (только для клиентов).
Значение по умолчанию - `false`.
Разрешить ли небезопасные соединения (только для клиента). Значение по умолчанию: `false`.
Если значение равно `true`, Xray не будет проверять действительность сертификата TLS, предоставленного удаленным хостом.
Если значение равно `true`, то Xray не будет проверять действительность сертификата TLS, предоставленного удаленным хостом.
::: danger
Из соображений безопасности не рекомендуется устанавливать этот параметр в `true` в реальных сценариях, так как это может сделать вас уязвимыми для атак типа "человек посередине".
Из соображений безопасности этот параметр не следует устанавливать в значение `true` в реальных сценариях, иначе вы можете подвергнуться атаке типа «человек посередине».
:::
> `disableSystemRoot`: true | false
Отключить использование корневых сертификатов, предоставляемых операционной системой.
Значение по умолчанию - `false`.
Отключить ли корневые сертификаты операционной системы. Значение по умолчанию: `false`.
Если значение равно `true`, Xray будет использовать только сертификаты, указанные в `certificates`, для рукопожатия TLS.
Если значение равно `false`, Xray будет использовать только корневые сертификаты, предоставляемые операционной системой, для рукопожатия TLS.
Если значение равно `true`, то Xray будет использовать только сертификаты, указанные в `certificates`, для рукопожатия TLS. Если значение равно `false`, то Xray будет использовать только корневые сертификаты операционной системы для рукопожатия TLS.
> `enableSessionResumption`: true | false
Если этот параметр установлен в `false`, расширение `session_ticket` не будет включено в ClientHello.
Обычно программы на Golang не используют это расширение в ClientHello, поэтому рекомендуется оставить значение по умолчанию.
Значение по умолчанию - `false`.
Если этот параметр установлен в `false`, то в ClientHello не будет расширения `session_ticket`. Как правило, программы на языке Go не используют это расширение в ClientHello, поэтому рекомендуется оставить значение по умолчанию. Значение по умолчанию: `false`.
> `fingerprint`: string
> `fingerprint` : string
Этот параметр используется для настройки отпечатка `TLS Client Hello`.
Если значение пустое, эта функция отключена.
Если эта функция включена, Xray будет **эмулировать** отпечаток `TLS` с помощью библиотеки uTLS или генерировать его случайным образом.
Поддерживаются три способа настройки:
Этот параметр используется для настройки указанного отпечатка `TLS Client Hello`. Если значение пустое, эта функция отключена. При включении Xray будет **эмулировать** отпечаток `TLS` через библиотеку uTLS или генерировать его случайным образом. Поддерживаются три режима настройки:
1. Отпечатки TLS последних версий популярных браузеров, включая:
@ -231,45 +198,47 @@ Reality - это самый безопасный на данный момент
2. Автоматическая генерация отпечатка при запуске Xray:
- `"random"`: случайный выбор из отпечатков последних версий браузеров.
- `"randomized"`: генерация полностью случайного уникального отпечатка (100% поддержка TLS 1.3 с использованием X25519).
- `"random"`: случайный выбор из новых версий браузеров.
- `"randomized"`: полная случайная генерация уникального отпечатка (100% поддержка TLS 1.3 с использованием X25519)
3. Использование имен переменных отпечатков uTLS, например, `"HelloRandomizedNoALPN"`, `"HelloChrome_106_Shuffle"`.
Полный список см. в [библиотеке uTLS](https://github.com/refraction-networking/utls/blob/master/u_common.go#L434).
3. Использование имени переменной отпечатка uTLS, например, `"HelloRandomizedNoALPN"``"HelloChrome_106_Shuffle"`. Полный список см. в [библиотеке uTLS](https://github.com/refraction-networking/utls/blob/master/u_common.go#L434).
::: tip
Эта функция только **эмулирует** отпечаток `TLS Client Hello`, поведение и другие отпечатки такие же, как у Golang. Если вам нужна более полная эмуляция отпечатка и поведения браузера `TLS`, используйте [Browser Dialer](./transports/websocket.md#browser-dialer).
:::
::: tip
Эта функция только **эмулирует** отпечаток `TLS Client Hello`, поведение и другие отпечатки такие же, как у Golang.
Если вам нужно более полно эмулировать отпечаток `TLS` и поведение браузера, используйте [Browser Dialer](./transports/websocket.md#browser-dialer).
При использовании этой функции некоторые параметры TLS, влияющие на отпечаток TLS, будут переопределены библиотекой utls и не будут действовать, например, ALPN.
SHA256-хэш цепочки сертификатов удаленного сервера в стандартном формате кодировки.
Соединение TLS будет успешно установлено, только если хэш цепочки сертификатов сервера совпадает с одним из значений в этом списке.
Используется для указания хэша SHA256 цепочки сертификатов удаленного сервера с использованием стандартного формата кодировки. Соединение TLS может быть успешно установлено только в том случае, если хэш цепочки сертификатов сервера соответствует одному из значений, указанных в настройке.
Если соединение не удалось установить из-за этой настройки, будет показан хэш цепочки сертификатов удаленного сервера.
Если соединение не удалось установить из-за этой конфигурации, будет отображен хэш сертификата удаленного сервера.
::: danger
Не рекомендуется использовать этот способ для получения хэша цепочки сертификатов, так как в этом случае у вас не будет возможности проверить, является ли сертификат, предоставленный сервером, подлинным, и поэтому вы не можете гарантировать, что полученный хэш сертификата будет ожидаемым.
Не рекомендуется использовать этот способ для получения хэша цепочки сертификатов, так как в этом случае не будет возможности проверить, является ли сертификат, предоставленный сервером в данный момент, подлинным, и, следовательно, не гарантируется, что полученный хэш сертификата является ожидаемым.
:::
::: tip
Если вам нужно получить хэш сертификата, запустите команду `xray tls certChainHash --cert <cert.pem>`в командной строке, где `<cert.pem>` - это путь к файлу сертификата.
Если вам нужно получить хэш сертификата, запустите `xray tls certChainHash --cert <cert.pem>`из командной строки, где `<cert.pem>` следует заменить на фактический путь к файлу сертификата.
Список сертификатов, каждый элемент которого представляет собой сертификат (рекомендуется использовать fullchain).
Список сертификатов, каждый элемент которого представляет собой сертификат (рекомендуется fullchain).
::: tip
Если вам нужно получить оценку A/A+ в ssllibs или myssl, см. [здесь](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
Если вам нужно получить оценку A/A+ в ssllibs или myssl,
пожалуйста, обратитесь к [этому](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
:::
> `masterKeyLog` : string
Путь к файлу журнала (pre)-master-secret, который можно использовать для расшифровки TLS-соединений, отправляемых Xray, в таких программах, как Wireshark.
Пока не поддерживается совместное использование с utls.
Требуется Xray-Core v1.8.7.
Путь к файлу журнала (Pre)-Master-Secret, который можно использовать для расшифровки TLS-соединений, отправляемых Xray, с помощью Wireshark и других программ, пока не поддерживается для использования с utls.
### RealityObject
@ -296,95 +265,91 @@ SHA256-хэш цепочки сертификатов удаленного се
Дополнительную информацию см. в проекте [REALITY](https://github.com/XTLS/REALITY).
:::
> `show`: true | false
> `show`: true | false
Если значение равно `true`, выводить отладочную информацию.
::: tip
Настройки для **входящего** подключения (**сервер**).
Ниже приведена конфигурация для **входящего** подключения (**сервера**).
:::
> `dest`: string
> `dest`: string
Обязательный параметр, формат такой же, как у `dest` в `fallbacks` для VLESS [dest](./features/fallback.md#fallbackobject).
Обязательный параметр, формат такой же, как у [dest](./features/fallback.md#fallbackobject) в VLESS `fallbacks`.
::: warning
Для лучшей маскировки Xray **напрямую перенаправляет** трафик, не прошедший аутентификацию Reality (незаконные запросы Reality), на `dest`.
Если IP-адрес сайта `dest`является особенным (например, сайт использует CDN CloudFlare), то ваш сервер будет действовать как переадресатор портов для CloudFlare, что может привести к утечке трафика после сканирования.
Чтобы избежать этого, можно использовать Nginx или другие средства для фильтрации нежелательных SNI.
Из соображений маскировки Xray будет **непосредственно перенаправлять** трафик с неудачной аутентификацией (недопустимый запрос REALITY) на `dest`.
Если IP-адрес сайта `dest`особый (например, сайт использует CloudFlare CDN), это равносильно тому, что ваш сервер действует как port forward для CloudFlare, что может привести к злоупотреблению.
Чтобы этого избежать, можно рассмотреть возможность использования Nginx и других методов для фильтрации нежелательных SNI.
:::
> `xver`: number
> `xver`: number
Необязательный параметр, формат такой же, как у `xver` в `fallbacks` для VLESS [xver](./features/fallback.md#fallbackobject).
Необязательный параметр, формат такой же, как у [xver](./features/fallback.md#fallbackobject) в VLESS `fallbacks`.
> `serverNames`: \[string\]
> `serverNames`: \[string\]
Обязательный параметр, список допустимых `serverName` для клиентов.
Пока не поддерживаются подстановочные знаки \*.
Обязательный параметр, список доступных `serverName` для клиента, подстановочные знаки \* пока не поддерживаются.
Обычно это значение совпадает с `dest`.
Фактически допустимыми значениями являются любые SNI, принимаемые сервером (в зависимости от конфигурации `dest`).
В качестве ориентира можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата.
Обычно он совпадает с `dest`, фактическое допустимое значение — это любой SNI, принимаемый сервером (в зависимости от конфигурации `dest`), в качестве справки можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата.
Может содержать пустое значение `""`, что означает прием подключений без SNI.
Может содержать пустое значение ```""```, что означает принятие соединений без SNI.
> `privateKey`: string
> `privateKey`: string
Обязательный параметр, сгенерируйте его, выполнив команду`./xray x25519`.
Обязательный параметр, генерируется с помощью команды`./xray x25519`.
> `minClientVer`: string
> `minClientVer`: string
Необязательный параметр, минимальная версия Xray на клиенте, формат: `x.y.z`.
Необязательный параметр, минимальная версия Xray клиента, формат: `x.y.z`.
> `maxClientVer`: string
> `maxClientVer`: string
Необязательный параметр, максимальная версия Xray на клиенте, формат: `x.y.z`.
Необязательный параметр, максимальная версия Xray клиента, формат: `x.y.z`.
> `maxTimeDiff`: number
> `maxTimeDiff`: number
Необязательный параметр, максимально допустимая разница во времени в миллисекундах.
> `shortIds`: \[string\]
> `shortIds`: \[string\]
Обязательный параметр, список допустимых `shortId` для клиентов, которые можно использовать для различения разных клиентов.
Обязательный параметр, список доступных `shortId` для клиента, можно использовать для различения разных клиентов.
Состоит из символов от 0 до f, длина должна быть кратна 2, максимальная длина - 16.
Требования к формату см. в `shortId`.
Если список содержит пустое значение, `shortId`на клиенте может быть пустым.
Если содержит пустое значение, `shortId`клиента может быть пустым.
::: tip
Настройки для **исходящего** подключения (**клиент**).
Ниже приведена конфигурация для **исходящего** подключения (**клиента**).
:::
> `serverName`: string
> `serverName`: string
Одно из значений `serverNames` на сервере.
Один из `serverNames` сервера.
Если `serverNames` на сервере содержит пустое значение, на клиенте можно использовать `"serverName": "0.0.0.0"`, как и в TLS, для установления соединения без SNI.
В отличие от TLS, в REALITY для использования этой функции не нужно включать параметр `allowInsecure`.
При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при приеме соединений без SNI.
Если `serverNames` сервера содержит пустое значение, то, как и в случае с TLS, клиент может использовать ```"serverName": "0.0.0.0"``` для установления соединения без SNI. В отличие от TLS, REALITY не требует и не имеет опции разрешения небезопасных соединений для этой функции. При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при принятии соединений без SNI.
> `fingerprint`: string
> `fingerprint` : string
Обязательный параметр, такой же, как в [TLSObject](#tlsobject).
> `shortId`: string
> `shortId` : string
Один из `shortIds` сервера.
Одно из значений `shortIds` на сервере.
Длина — 8 байт, то есть 16 шестнадцатеричных цифр (0-f), может быть меньше 16, ядро автоматически добавит 0 в конец, но количество цифр должно быть **четным** (потому что один байт состоит из 2 шестнадцатеричных цифр).
Состоит из символов от 0 до f, длина должна быть кратна 2, максимальная длина - 16.
Например, `aa1234` будет автоматически дополнено до `aa12340000000000`, а `aaa1234` приведет к ошибке.
Если `shordIDs` на сервере содержит пустое значение, этот параметр на клиенте может быть пустым.
0 также является четным числом, поэтому, если `shordIDs` сервера содержит пустое значение `""`, клиент также может быть пустым.
> `publicKey`: string
> `publicKey`: string
Обязательный параметр, открытый ключ, соответствующий закрытому ключу сервера.
Сгенерируйте его с помощью команды `./xray x25519 -i "закрытый ключ сервера"`.
Обязательный параметр, открытый ключ, соответствующий закрытому ключу сервера. Генерируется с помощью команды `./xray x25519 -i "закрытый_ключ_сервера"`.
> `spiderX`: string
> `spiderX`: string
Начальный путь и параметры для краулера, рекомендуется использовать разные значения для каждого клиента.
Начальный путь и параметры для краулера, рекомендуется использовать разные для каждого клиента.
#### CertificateObject
@ -393,6 +358,7 @@ SHA256-хэш цепочки сертификатов удаленного се
"ocspStapling": 3600,
"oneTimeLoading": false,
"usage": "encipherment",
"buildChain": false,
"certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key",
"certificate": [
@ -448,76 +414,70 @@ SHA256-хэш цепочки сертификатов удаленного се
> `ocspStapling`: number
Интервал обновления OCSP-стейплинга.
Совпадает с интервалом перезагрузки сертификата.
Единица измерения: секунды.
Значение по умолчанию - `3600` (1 час).
Интервал обновления OCSP-скрепления, совпадает с интервалом перезагрузки сертификата. Единица измерения: секунды. Значение по умолчанию: `3600`, то есть один час.
> `oneTimeLoading`: true | false
Загрузить только один раз.
Если значение равно `true`, функция перезагрузки сертификата и OCSP-стейплинга отключаются.
Загружать только один раз. Если значение равно `true`, то функция горячей перезагрузки сертификата и функция OCSP-скрепления будут отключены.
::: warning
Если значение равно `true`, OCSP-стейплинг будет отключен.
Если значение равно `true`, то OCSP-скрепление будет отключено.
:::
> `usage`: "encipherment" | "verify" | "issue"
Назначение сертификата.
Значение по умолчанию - `"encipherment"`.
Использование сертификата, значение по умолчанию: `"encipherment"`.
- `"encipherment"`: сертификат используется для аутентификации и шифрования TLS.
- `"verify"`: сертификат используется для проверки сертификата удаленного TLS-сервера.
При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
- `"issue"`: сертификат используется для выпуска других сертификатов.
При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
- `"verify"`: сертификат используется для проверки сертификата удаленного TLS. При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
- `"issue"`: сертификат используется для выпуска других сертификатов. При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
::: tip Совет 1
В Windows можно установить самозаверяющий сертификат ЦС в систему, чтобы проверять сертификаты удаленных TLS-серверов.
::: tip СОВЕТ 1
В Windows вы можете установить самоподписанный сертификат ЦС в систему, чтобы проверить сертификат удаленного TLS.
:::
::: tip Совет 2
При получении нового запроса от клиента, если указанный `serverName` равен `"xray.com"`, Xray сначала ищет в списке сертификатов сертификат, который можно использовать для `"xray.com"`.
Если подходящий сертификат не найден, Xray использует любой сертификат с `usage` = `"issue"` для выпуска нового сертификата для `"xray.com"` со сроком действия один час.
Новый сертификат добавляется в список сертификатов для последующего использования.
::: tip СОВЕТ 2
Когда поступает новый запрос от клиента, предполагая, что указанный `serverName` равен `"xray.com"`, Xray сначала ищет в списке сертификатов сертификат, который можно использовать для `"xray.com"`, и, если он не найден, использует любой сертификат с `usage`, равным `"issue"`, для выпуска сертификата, подходящего для `"xray.com"`, со сроком действия один час. Новый сертификат будет добавлен в список сертификатов для последующего использования.
:::
::: tip Совет 3
Если указаны и `certificateFile`, и `certificate`, Xray использует `certificateFile`.
То же самое относится к `keyFile` и `key`.
::: tip СОВЕТ 3
Если одновременно указаны `certificateFile` и `certificate`, Xray отдает приоритет `certificateFile`. То же самое касается `keyFile` и `key`.
:::
::: tip Совет 4
Если `usage` равен `"verify"`,`keyFile` и `key` могут быть пустыми.
::: tip СОВЕТ 4
Когда `usage` равно `"verify"`, то`keyFile` и `key` могут быть пустыми.
:::
::: tip Совет 5
Можно сгенерировать самозаверяющий сертификат ЦС с помощью команды `xray tls cert`.
::: tip СОВЕТ 5
Используйте `xray tls cert` для генерации самоподписанного сертификата ЦС.
:::
::: tip Совет 6
Если у вас есть доменное имя, вы можете легко получить бесплатный сторонний сертификат с помощью таких инструментов, как [acme.sh](https://github.com/acmesh-official/acme.sh).
::: tip СОВЕТ 6
Если у вас уже есть доменное имя, вы можете использовать инструменты для удобного получения бесплатных сторонних сертификатов, например, [acme.sh](https://github.com/acmesh-official/acme.sh).
:::
> `buildChain`: true | false
Вступает в силу только при использовании сертификата `"issue"`, если значение равно `true`, то сертификат ЦС будет встроен в цепочку сертификатов при выпуске сертификата.
::: tip СОВЕТ 1
Не следует встраивать корневой сертификат в цепочку сертификатов. Этот параметр следует включать только при подписании сертификата ЦС в качестве промежуточного сертификата.
:::
> `certificateFile`: string
Путь к файлу сертификата, например, сертификат, сгенерированный OpenSSL, с расширением .crt.
Путь к файлу сертификата, например, сгенерированному с помощью OpenSSL, с расширением .crt.
> `certificate`: \[ string \]
Массив строк, представляющий содержимое сертификата, как показано в примере.
`certificate` и `certificateFile` - взаимоисключающие параметры.
Массив строк, представляющий содержимое сертификата, формат см. в примере. Используйте либо `certificate`, либо `certificateFile`.
> `keyFile`: string
Путь к файлу ключа, например, ключ, сгенерированный OpenSSL, с расширением .key.
В настоящее время не поддерживаются файлы ключей, защищенные паролем.
Путь к файлу ключа, например, сгенерированному с помощью OpenSSL, с расширением .key. В настоящее время не поддерживаются файлы ключей, защищенные паролем.
> `key`: \[ string \]
Массив строк, представляющий содержимое ключа, как показано в примере.
`key` и `keyFile` - взаимоисключающие параметры.
Массив строк, представляющий содержимое ключа, формат см. в примере. Используйте либо `key`, либо `keyFile`.
### SockoptObject
@ -536,7 +496,7 @@ SHA256-хэш цепочки сертификатов удаленного се
"tcpcongestion": "bbr",
"interface": "wg0",
"V6Only": false,
"tcpWindowClamp": 600,
"tcpWindowClamp": 600
"tcpMptcp": false,
"tcpNoDelay": false,
"customSockopt": []
@ -545,63 +505,48 @@ SHA256-хэш цепочки сертификатов удаленного се
> `mark`: number
Целое число.
Если значение не равно нулю, исходящее соединение будет помечено этим значением SO_MARK.
Целое число. Если значение не равно нулю, то исходящее соединение помечается этим значением с помощью SO_MARK.
- Работает только в Linux.
- Требуются права CAP_NET_ADMIN.
> `tcpMaxSeg`: number
Устанавливает максимальный размер сегмента TCP (MSS).
Используется для установки максимального сегмента TCP-пакета (Maximum Segment Size).
> `tcpFastOpen`: true | false | number
Включить [TCP Fast Open](https://ru.wikipedia.org/wiki/TCP_Fast_Open) (TFO).
Включить [TCP Fast Open](https://ru.wikipedia.org/wiki/TCP_Fast_Open).
Если значение равно `true` или **положительному целому числу**, TFO включен.
Если значение равно `false` или **отрицательному числу**, TFO принудительно отключен.
Если этот параметр не указан или равен `0`, используются настройки системы по умолчанию.
Может использоваться как для входящих, так и для исходящих подключений.
Если значение равно `true` или **положительному целому числу**, то TFO включается; если значение равно `false` или **отрицательному числу**, то TFO принудительно отключается; если параметр отсутствует или равен `0`, то используются настройки системы по умолчанию. Можно использовать как для входящих, так и для исходящих подключений.
- Доступно только в следующих (или более поздних) версиях операционных систем:
- Доступно только в следующих (или более новых) версиях операционных систем:
- Linux 3.16: требуется настроить параметр ядра `net.ipv4.tcp_fastopen`.
Этот параметр представляет собой битовую маску, где `0x1` означает, что TFO разрешен для клиентов, а `0x2` - для серверов.
Значение по умолчанию - `0x1`.
Если вы хотите включить TFO на сервере, установите значение этого параметра ядра в `0x3`.
- FreeBSD 10.3 (сервер) / 12.0 (клиент): необходимо установить параметры ядра `net.inet.tcp.fastopen.server_enabled` и `net.inet.tcp.fastopen.client_enabled` в `1`.
(Требуется тестирование.)
- Linux 3.16: требуется настройка параметра ядра `net.ipv4.tcp_fastopen`, который представляет собой битовую маску, где `0x1` означает, что клиент может включать TFO, а `0x2` означает, что сервер может включать TFO; значение по умолчанию — `0x1`, если серверу необходимо включить TFO, установите значение этого параметра ядра в `0x3`.
- ~~Windows 10 (1607)~~ (реализовано неправильно)
- Mac OS 10.11 / iOS 9 (требуется тестирование)
- FreeBSD 10.3 (Server) / 12.0 (Client): необходимо установить параметры ядра `net.inet.tcp.fastopen.server_enabled` и `net.inet.tcp.fastopen.client_enabled` в значение `1`. (Требуется тестирование)
- Для входящих подключений указанное здесь **положительное целое число** представляет собой [максимальное количество ожидающих запросов на подключение TFO](https://tools.ietf.org/html/rfc7413#section-5.1).
**Обратите внимание, что не все операционные системы поддерживают эту настройку:**
- Для входящих подключений установленное здесь **положительное целое число** представляет собой [максимальное количество ожидающих запросов на подключение TFO](https://tools.ietf.org/html/rfc7413#section-5.1), **обратите внимание, что не все операционные системы поддерживают эту настройку**:
- Linux / FreeBSD: указанное здесь **положительное целое число** представляет собой максимальное значение, максимальное допустимое значение - 2147483647.
Если значение равно `true`, используется значение `256`.
Обратите внимание, что в Linux параметр `net.core.somaxconn` ограничивает максимальное значение этого параметра.
Если значение превышает `somaxconn`, увеличьте `somaxconn`.
- Mac OS: если значение равно `true` или **положительному целому числу**, это означает только, что TFO включен.
Максимальное значение нужно настроить отдельно с помощью параметра ядра `net.inet.tcp.fastopen_backlog`.
- Windows: если значение равно `true` или **положительному целому числу**, это означает только, что TFO включен.
- Linux / FreeBSD: установленное здесь **положительное целое число** представляет собой максимальное значение, максимально допустимое значение — 2147483647, если установлено значение `true`, то используется значение `256`; обратите внимание, что в Linux `net.core.somaxconn` ограничивает максимальное значение, если оно превышает `somaxconn`, то необходимо также увеличить `somaxconn`.
- Mac OS: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO, максимальное значение необходимо установить отдельно с помощью параметра ядра `net.inet.tcp.fastopen_backlog`.
- Windows: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO.
- Для исходящих подключений значение `true` или **положительное целое число** означает только, что TFO включен, во всех операционных системах.
- Для исходящих подключений установка значения `true` или **положительного целого числа** в любой операционной системе означает только включение TFO.
> `tproxy`: "redirect" | "tproxy" | "off"
Включить прозрачное проксирование (только для Linux).
Включить ли прозрачное проксирование (только для Linux).
- `"redirect"`: использовать прозрачное проксирование в режиме Redirect.
Поддерживаются все TCP-соединения на основе IPv4/6.
- `"tproxy"`: использовать прозрачное проксирование в режиме TProxy.
Поддерживаются все TCP- и UDP-соединения на основе IPv4/6.
- `"redirect"`: использовать прозрачное проксирование в режиме перенаправления. Поддерживаются все TCP-соединения на основе IPv4/6.
- `"tproxy"`: использовать прозрачное проксирование в режиме TProxy. Поддерживаются все TCP- и UDP-соединения на основе IPv4/6.
- `"off"`: отключить прозрачное проксирование.
Для прозрачного проксирования требуются права root или `CAP\_NET\_ADMIN`.
::: danger
Если в [Dokodemo-door](./inbounds/dokodemo.md) параметр `followRedirect` установлен в `true`, а параметр `tproxy` в Sockopt не указан, значение `tproxy` в Sockopt будет установлено в `"redirect"`.
Если в [Dokodemo-door](./inbounds/dokodemo.md) указано `followRedirect: true` и `tproxy` в настройках Sockopt пуст, то значение `tproxy` в настройках Sockopt будет установлено в `"redirect"`.
:::
> `domainStrategy`: "AsIs"<br>
@ -609,199 +554,4 @@ SHA256-хэш цепочки сертификатов удаленного се
В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray.
Это приводило к таким проблемам, как [невозможность разрешения доменных имен в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909).
Чтобы решить эту проблему, в Xray 1.3.1 был добавлен параметр `domainStrategy` в Sockopt, аналогичный параметру в Freedom.
Значение по умолчанию - `"AsIs"`.
При использовании доменного имени в качестве целевого адреса поведение Freedom зависит от значения этого параметра:
- `"AsIs"`: Xray будет использовать системный стек для установления соединения, приоритет и выбор IP-адреса зависят от настроек системы.
- При указании других значений будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core для разрешения доменного имени.
Если `DnsObject` не настроен, будет использоваться системный DNS.
Если для домена найдено несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса.
- `"IPv4"` - попытаться использовать только IPv4 для подключения, `"IPv4v6"` - попытаться использовать IPv4 или IPv6, но для доменов с двумя стеками отдать предпочтение IPv4.
(То же самое относится к `IPv6v4`, не будем повторяться.)
- Если в настройках встроенного DNS указан параметр `"queryStrategy"`, фактическое поведение будет определяться пересечением этих двух параметров, будут разрешены только IP-адреса тех типов, которые указаны в обоих параметрах.
Например, если `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"`, это фактически эквивалентно `"domainStrategy": "UseIPv4"`.
- Если используется значение, начинающееся с `"Use"`, и результат разрешения не соответствует требованиям (например, у домена есть только IPv4-адрес, но используется `UseIPv6`), Xray переключится на `AsIs`.
- Если используется значение, начинающееся с `"Force"`, и результат разрешения не соответствует требованиям, соединение не будет установлено.
::: tip Совет
При использовании режимов `"UseIP"` и `"ForceIP"` и указании `sendThrough` в [настройках исходящего подключения](../outbound.md#outboundobject) Freedom автоматически определит необходимый тип IP-адреса (IPv4 или IPv6) на основе значения `sendThrough`.
Если вручную указан один тип IP-адреса (например, `UseIPv4`), но он не совпадает с локальным адресом, указанным в `sendThrough`, соединение не будет установлено.
:::
::: danger
Неправильная настройка этой функции может привести к бесконечному циклу.
Коротко говоря: для подключения к серверу нужно дождаться результата DNS-запроса, а для завершения DNS-запроса нужно подключиться к серверу.
> Тони: Что было раньше, курица или яйцо?
Подробное объяснение:
1. Условия возникновения: прокси-сервер (proxy.com), встроенный DNS-сервер, не локальный режим.
2. **Перед** установлением TCP-соединения с proxy.com Xray пытается разрешить proxy.com с помощью встроенного DNS-сервера.
3. Встроенный DNS-сервер устанавливает соединение с dns.com и отправляет запрос для получения IP-адреса proxy.com.
4. **Неправильные** правила маршрутизации приводят к тому, что proxy.com проксирует запрос, отправленный на шаге 3.
5. Xray пытается установить еще одно TCP-соединение с proxy.com.
6. Перед установлением соединения Xray пытается разрешить proxy.com с помощью встроенного DNS-сервера.
7. Встроенный DNS-сервер повторно использует соединение, установленное на шаге 3, и отправляет запрос.
8. Возникает проблема: установление соединения на шаге 3 ожидает результата запроса на шаге 7, а завершение запроса на шаге 7 ожидает полного установления соединения на шаге 3.
9. Игра окончена!
Решения:
- Изменить правила разделения трафика для встроенного DNS-сервера.
- Использовать Hosts.
- ~~Если вы все еще не знаете, как решить эту проблему, не используйте эту функцию.~~
Поэтому **не рекомендуется** неопытным пользователям использовать эту функцию без необходимости.
:::
> `dialerProxy`: ""
Тег исходящего прокси.
Если значение не пустое, исходящие соединения будут устанавливаться через указанное исходящее подключение.
Этот параметр можно использовать для цепочечной пересылки с поддержкой транспорта.
::: danger
Этот параметр несовместим с `ProxySettingsObject.Tag`.
:::
> `acceptProxyProtocol`: true | false
Только для входящих подключений.
Указывает, следует ли принимать PROXY protocol.
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) используется для передачи реального IP-адреса и порта источника запроса.
**Если вы не знакомы с ним, пропустите этот параметр.**
Распространенные обратные прокси (например, HAProxy, Nginx) можно настроить на отправку PROXY protocol, VLESS fallbacks xver также может отправлять его.
Если значение равно `true`, то после установления TCP-соединения на самом нижнем уровне отправитель запроса должен сначала отправить PROXY protocol v1 или v2, иначе соединение будет разорвано.
> `tcpKeepAliveInterval`: number
Интервал между отправкой пакетов TCP keep-alive в секундах. ~~Работает только в Linux.~~
Это keep-alive-пакеты, отправляемые при ненормальном состоянии соединения (не получен ACK).
Если этот параметр не указан или равен 0, используется значение по умолчанию Golang.
::: tip
Если указать отрицательное значение, например `-1`, TCP keep-alive будет отключен.
:::
> `tcpKeepAliveIdle`: number
Порог простоя TCP-соединения в секундах.
Keep-alive-пакеты будут отправляться, когда время простоя TCP-соединения достигнет этого порога.
Это keep-alive-пакеты, отправляемые при нормальном состоянии соединения.
Если этот параметр не указан или равен 0, используется значение по умолчанию Golang.
::: tip
Если указать отрицательное значение, например `-1`, TCP keep-alive будет отключен.
Если этот параметр не указан, используется значение по умолчанию системы.
::: tip Распространенные алгоритмы
- bbr (рекомендуется)
- cubic
- reno
:::
::: tip
Выполните команду `sysctl net.ipv4.tcp_congestion_control`, чтобы узнать значение по умолчанию системы.
:::
> `interface`: ""
Имя сетевого интерфейса, к которому нужно привязаться.
Поддерживается в Linux / iOS / Mac OS / Windows.<br>
Для iOS / Mac OS требуется Xray-core v1.8.6 или более поздней версии.<br>
Для Windows требуется Xray-core v1.8.7 или более поздней версии.
> `V6Only`: true | false
Если значение равно `true`, адрес `::` будет принимать только IPv6-соединения.
Поддерживается только в Linux.
> `tcpWindowClamp`: number
Привязать размер рекламируемого окна к этому значению.
Ядро выберет максимальное значение между этим значением и SOCK_MIN_RCVBUF/2.
> `tcpMptcp`: true | false
Новый параметр в Xray-core v1.8.6.<br>
Значение по умолчанию - `false`.
Если значение равно `true`, включить [Multipath TCP](https://ru.wikipedia.org/wiki/Multipath_TCP).
Этот параметр нужно включить как на сервере, так и на клиенте.
В настоящее время поддерживается только в Linux, требуется ядро Linux версии 5.6 или выше.
> `tcpNoDelay`: true | false
Значение по умолчанию - `false`.
Рекомендуется включать вместе с `"tcpMptcp": true`.
> `customSockopt`: []
Массив, позволяющий опытным пользователям указать любые необходимые параметры sockopt.
Теоретически все настройки, связанные с подключением, описанные выше, можно настроить с помощью этого параметра.
Вы также можете настроить другие параметры, доступные в Linux, но не добавленные в ядро, например, следующий пример эквивалентен `"tcpcongestion": "bbr"` в ядре.
Перед использованием убедитесь, что вы понимаете принципы программирования сокетов в Linux.
```json
"customSockopt": [
{
"type": "str",
"level":"6",
"opt": "13",
"value": "bbr"
}
]
```
> `type`: ""
Обязательный параметр, тип настройки, в настоящее время доступны `int` и `str`.
> `level`: ""
Необязательный параметр, уровень протокола, используемый для указания области действия.
Значение по умолчанию - `6` (TCP).
> `opt`: ""
Название настраиваемого параметра в десятичном формате (в этом примере используется значение TCP_CONGESTION, которое равно 0xd в шестнадцатеричном формате и 13 в десятичном формате).
> `value`: ""
Значение, которое нужно установить.
В этом примере используется значение `bbr`.
Если `type` равен `int`, значение должно быть десятичным числом.
В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray. Это приводило к таким проблемам, как [невозможность разрешить доменные имена в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909). Для решения этой проблемы в X
Может использоваться через CDN, не поддерживающие WebSocket, но есть несколько требований:
- CDN должен поддерживать HTTP-фрагментированную передачу и потоковые ответы без буферизации. Ядро будет отправлять `X-Accel-Buffering: no` и `Content-Type: text/event-stream`, чтобы сообщить CDN об этом, но CDN должен соблюдать этот заголовок. Если промежуточный сервер не поддерживает потоковые ответы и зависает, передача, скорее всего, не будет работать.
- CDN должен поддерживать HTTP-фрагментированную передачу и потоковые ответы без буферизации. Ядро будет отправлять различную информацию, чтобы сообщить CDN об этом, но CDN должна ее соблюдать. Если промежуточный узел не поддерживает потоковые ответы и зависает, этот транспорт, скорее всего, не будет работать.
Цель та же, что и у V2fly Meek, но благодаря использованию фрагментированной загрузки скорость загрузки выше, а скорость отдачи оптимизирована, но все еще очень ограничена, поэтому к HTTP-прокси предъявляются более высокие требования (см. выше).
`SplitHTTP` также принимает заголовок `X-Forwarded-For`.
## SplitHttpObject
@ -23,65 +25,156 @@
"headers": {
"key": "value"
},
"maxUploadSize": 1000000,
"maxConcurrentUploads": 10
"scMaxEachPostBytes": 1000000,
"scMaxConcurrentPosts": 100,
"scMinPostsIntervalMs": 30,
"noSSEHeader": false,
"xPaddingBytes": "100-1000",
"xmux": {
"maxConcurrency": 0,
"maxConnections": 0,
"cMaxReuseTimes": 0,
"cMaxLifetimeMs": 0
}
}
```
> `path`: string
Путь HTTP-протокола, используемый SplitHTTP, значение по умолчанию — `"/"`.
Путь HTTP-протокола, используемый SplitHTTP. Значение по умолчанию — `"/"`.
> `host`: string
Хост, отправляемый в HTTP-запросе SplitHTTP, по умолчанию пуст. Если значение на стороне сервера пустое, значение хоста, отправленное клиентом, не проверяется.
Хост, отправляемый в HTTP-запросе SplitHTTP. Значение по умолчанию пустое. Если значение на сервере пустое, значение хоста, отправляемое клиентом, не проверяется.
Если это значение указано на стороне сервера или `host` указан в `headers`, то проверяется соответствие хоста запроса клиента.
Если значение указано на сервере или в `headers`, оно будет сравниваться со значением хоста в запросе клиента.
Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой.
Только для клиента. Пользовательские HTTP-заголовки. Пара «ключ-значение», где каждый ключ представляет собой имя HTTP-заголовка, а соответствующее значение — строка.
> `maxUploadSize`: int
> `scMaxEachPostBytes`: int | string
Максимальный размер фрагмента загрузки в байтах, по умолчанию 1 МБ.
Максимальный размер блока выгрузки в байтах. Значение по умолчанию — 1000000 (1 МБ).
Это значение должно быть меньше максимального размера тела запроса, разрешенного CDN или другим обратным HTTP-прокси, иначе будет выдаваться ошибка HTTP 413.
Размер, установленный на клиенте, должен быть меньше этого значения, иначе запрос POST, размер которого превышает значение, установленное на сервере, будет отклонен.
Увеличение этого значения может увеличить скорость загрузки.
Это значение должно быть меньше максимального размера тела запроса, разрешенного CDN или другим обратным прокси-сервером HTTP, иначе будет выдаваться ошибка HTTP 413.
> `maxConcurrentUploads`: int
Также может быть строкой в формате "500000-1000000", и ядро будет случайным образом выбирать значение из этого диапазона для уменьшения цифрового следа.
Максимальное количество одновременных загрузок, по умолчанию 10, соединения будут использоваться повторно, насколько это возможно.
> `scMaxConcurrentPosts`: int | string
Если соединение нестабильно или потребление памяти на сервере слишком велико, попробуйте уменьшить это значение.
Максимальное количество одновременных запросов POST на одно соединение. Значение по умолчанию — 100.
Значение, установленное клиентом, должно быть меньше, чем на сервере, иначе это может привести к проблемам с подключением.
Параллельная выгрузка также (и в основном) контролируется параметром `scMinPostsIntervalMs`, поэтому это значение является лишь страховкой.
## Детали протокола
Фактическое количество запросов, отправляемых клиентом, должно быть меньше, чем на сервере. (На практике, поскольку указанного выше ограничения трудно достичь, клиент может фактически установить значение, превышающее значение на сервере, но это не рекомендуется).
Подробное обсуждение см. [#3412](https://github.com/XTLS/Xray-core/pull/3412) и [#3462](https://github.com/XTLS/Xray-core/pull/3462). Ниже приведено краткое описание и требования к совместимой реализации:
Также может быть строкой в формате "50-100", и ядро будет случайным образом выбирать значение из этого диапазона для уменьшения цифрового следа.
1. Загрузка начинается с `GET /<UUID>`. Сервер немедленно отвечает `200 OK` и `Transfer Encoding:chunked` и немедленно отправляет двухбайтовую полезную нагрузку, чтобы принудительно обновить заголовки HTTP-прокси.
> `scMinPostsIntervalMs`: int | string
2. Отправка данных начинается с `POST /<UUID>/<seq>`. `seq` действует как порядковый номер TCP, начиная с 0, пакеты данных могут отправляться одновременно, сервер должен пересобрать данные по порядковому номеру. Порядковый номер не следует сбрасывать.
Только для клиента. Минимальный интервал между запросами POST на выгрузку. Значение по умолчанию — 30.
Клиент может свободно выбирать порядок открытия исходящих и нисходящих запросов, любой из них может инициировать сеанс, но соединение `GET` должно быть открыто в течение 30 секунд, иначе сеанс будет разорван.
Также может быть строкой в формате "10-50", и ядро будет случайным образом выбирать значение из этого диапазона для уменьшения цифрового следа.
4. Запрос `GET` будет оставаться открытым до тех пор, пока соединение не будет разорвано, и сервер, и клиент могут закрыть соединение. Конкретное поведение зависит от версии HTTP.
> `noSSEHeader`: bool
Рекомендации:
Только для сервера. Не отправлять заголовок ответа `Content-Type: text/event-stream`. Значение по умолчанию — `false` (то есть заголовок будет отправлен).
> `xPaddingBytes`: int | string
Задает размер заполнения для запросов (исходящих) и ответов (входящих), чтобы уменьшить цифровой след запроса. Единица измерения — байты. Значение по умолчанию — `"100-1000"`, каждый раз будет выбираться случайное число из этого диапазона. Также может быть одним числом, например `"200"` или `200`.
Значение `-1` полностью отключает заполнение.
> `xmux`: [XmuxObject](#xmuxobject)
## XmuxObject
<Badgetext="v24.9.19+"type="warning"/>
Позволяет пользователям контролировать поведение мультиплексирования SplitHTTP в h2 и h3. Если не настроено, по умолчанию все запросы мультиплексируются в одно TCP/QUIC-соединение.
```json
{
"maxConcurrency": 0,
"maxConnections": 0,
"cMaxReuseTimes": 0,
"cMaxLifetimeMs": 0
}
```
Поскольку по умолчанию используется неограниченное мультиплексирование, `xmux` фактически ограничивает его. Кроме того, не включайте mux.cool.
Объяснение терминов:
- Потоки будут мультиплексироваться в физические соединения, например: Соединение 1 (Поток 1, Поток 2, Поток 3) Соединение 2 (Поток 4, Поток 5, Поток 6) ... и так далее. В других источниках вы можете встретить описание "соединение-подключение", это то же самое.
- Все поля, описанные ниже, имеют тип int/string и поддерживают как фиксированные значения (например, `16`), так и диапазоны значений (например, `"8-32"`).
> `maxConcurrency`: int/string
Значение по умолчанию — 0 (неограниченно). Максимальное количество потоков, мультиплексируемых в одном соединении. Когда количество потоков в соединении достигает этого значения, ядро создает дополнительные соединения для размещения новых потоков, аналогично параметру `concurrency` в mux.cool.
> `maxConnections`: int/string
Значение по умолчанию — 0 (неограниченно). Максимальное количество открытых соединений. Ядро будет активно открывать новые соединения для каждого потока до тех пор, пока не будет достигнуто это значение. Затем ядро начнет мультиплексировать потоки в уже установленные соединения. Конфликтует с `maxConcurrency`.
> `cMaxReuseTimes`: int/string
* Не ожидайте, что CDN будет правильно передавать все заголовки, цель этого протокола — обойти CDN, не поддерживающие WS, а поведение этих CDN обычно не очень дружелюбное.
Значение по умолчанию — 0 (неограниченно). Максимальное количество раз, которое соединение может быть использовано повторно. По достижении этого значения ядро больше не будет назначать потоки этому соединению, и оно будет разорвано после закрытия последнего внутреннего потока.
* Следует предполагать, что все HTTP-соединения не поддерживают потоковые запросы, поэтому размер каждого пакета, отправляемого исходящим соединением, должен определяться с учетом задержки, пропускной способности и ограничений самого промежуточного сервера (аналогично MTU TCP и алгоритму Нейгла).
> `cMaxLifetimeMs`: int/string
* Что касается версий HTTP, ядро временно не поддерживает h2c, поэтому при отсутствии HTTPS Xray отправляет только запросы http/1.1.
Значение по умолчанию — 0 (неограниченно). Максимальное время "жизни" соединения. По истечении этого времени ядро больше не будет назначать потоки этому соединению, и оно будет разорвано после закрытия последнего внутреннего потока.
Во избежание дополнительных сложностей, связанных с согласованием ALPN, клиент Xray использует h2 при использовании HTTPS. Вы также можете вручную указать alpn как http/1.1 или h3 в настройках TLS клиента, чтобы использовать соответствующую версию HTTP для отправки запросов. Сервер Xray, с другой стороны, совместим со всеми типами входящих соединений, включая h2c (h3 пока не поддерживается), поскольку входящие соединения могут использовать различные типы запросов из-за перенаправления через промежуточные узлы.
## Версия HTTP
### Поведение клиента
По умолчанию клиент будет использовать http/1.1, если TLS не включен, и h2, если TLS включен.
Если TLS включен, можно указать конкретную версию HTTP (http/1.1, h2, h3) в массиве `alpn` в настройках TLS (работает только в том случае, если массив содержит только один элемент, если указано несколько элементов, будет использоваться поведение по умолчанию).
### Поведение сервера
По умолчанию сервер будет прослушивать TCP-порт и обрабатывать трафик http/1.1 и h2.
Если TLS включен, можно указать `h3` в массиве `alpn` в настройках TLS. В этом случае сервер будет прослушивать UDP-порт и обрабатывать трафик h3.
### Советы
Поскольку этот протокол основан на стандартных HTTP-запросах, он нечувствителен к преобразованию версий HTTP, и различные промежуточные узлы могут преобразовывать версии HTTP.
Например, если вы хотите использовать h3 для подключения к Cloudflare, но Cloudflare не будет использовать h3 для обратного подключения, а будет использовать http/1.1 или h2, то на клиенте `alpn` должен быть установлен в `h3`, а на сервере — нет, поскольку запросы, отправляемые на сервер, не будут использовать h3.
## Browser Dialer
При использовании HTTPS этот транспорт также поддерживает [Browser Dialer](../features/browser_dialer.md).
## Подробности протокола
Подробное обсуждение см. в [#3412](https://github.com/XTLS/Xray-core/pull/3412) и [#3462](https://github.com/XTLS/Xray-core/pull/3462). Ниже приведено краткое описание и требования к совместимости реализации:
1. Загрузка начинается с запроса `GET /<UUID>`. Сервер немедленно отвечает `200 OK` и `Transfer Encoding:chunked` и сразу же отправляет двухбайтовую полезную нагрузку, чтобы заставить HTTP-промежуточные узлы сбросить заголовки.
На данный момент сервер отправляет следующие заголовки:
2. Выгрузка начинается с запроса `POST /<UUID>/<seq>`. `seq` работает аналогично порядковому номеру TCP, начиная с 0. Пакеты данных могут отправляться одновременно, сервер должен пересобрать данные в соответствии с порядковым номером. Порядковый номер не должен сбрасываться.
Клиент может открывать запросы на выгрузку и загрузку в любом порядке, любой из них может инициировать сеанс, но соединение `GET` должно быть открыто в течение 30 секунд, иначе сеанс будет разорван.
3. Запрос `GET` будет оставаться открытым до тех пор, пока соединение не будет разорвано. Как сервер, так и клиент могут закрыть соединение. Конкретное поведение зависит от версии HTTP.
Рекомендации:
## BrowserDialer
* Не ожидайте, что CDN будет правильно передавать все заголовки. Цель этого протокола — обойти CDN, которые не поддерживают WS, а такие CDN обычно ведут себя не очень хорошо.
При использовании HTTPS этот транспорт также поддерживает [BrowserDialer](../features/browser_dialer.md).
* Следует предполагать, что все HTTP-соединения не поддерживают потоковые запросы, поэтому размер каждого пакета, отправляемого по исходящему соединению, должен основываться на задержке, пропускной способности и ограничениях самого промежуточного узла (аналогично MTU и алгоритму Нейгла в TCP).