update transport.md

This commit is contained in:
iambabyninja 2024-09-27 22:47:59 +05:00
parent d38231b5fa
commit 9f69f1a5cc

View file

@ -1,14 +1,14 @@
# Транспорт
# Способы передачи (uTLS, REALITY)
Транспорт (transport) - это способ, которым текущий узел Xray взаимодействует с другими узлами.
Способ передачи (transport) — это способ взаимодействия текущего узла Xray с другими узлами.
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено.
## StreamSettingsObject
`StreamSettingsObject` соответствует полю `streamSettings` во входящем или исходящем подключении.
Каждое входящее или исходящее подключение может иметь свои собственные настройки транспорта.
`StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи.
```json
{
@ -38,85 +38,70 @@
"v6only": false,
"tcpWindowClamp": 600,
"tcpMptcp": false,
"tcpNoDelay": false,
"customSockopt": []
"tcpNoDelay": false
}
}
```
> `network`: "tcp" | "ws" | "h2" | "grpc" | "kcp" | "httpupgrade" | "splithttp"
Тип транспорта, используемый для передачи данных.
Значение по умолчанию - `"tcp"`.
Тип способа передачи, используемого потоком данных соединения, по умолчанию `"tcp"`
::: tip
"h2" можно записать как "http", "grpc" - как "gun", "kcp" - как "mkcp".
"h2" можно записать как "http", "grpc" можно записать как "gun", "kcp" можно записать как "mkcp".
:::
> `security`: "none" | "tls" | "reality"
Включить шифрование транспортного уровня.
Доступные значения:
Включено ли шифрование транспортного уровня, поддерживаемые опции:
- `"none"` - без шифрования (значение по умолчанию).
- `"tls"` - использовать [TLS](https://ru.wikipedia.org/wiki/Transport_Layer_Security).
- `"reality"` - использовать REALITY.
- `"none"` означает отсутствие шифрования (значение по умолчанию)
- `"tls"` означает использование [TLS](https://ru.wikipedia.org/wiki/Протокол_защиты_транспортного_уровня).
- `"reality"` означает использование REALITY.
> `tlsSettings`: [TLSObject](#tlsobject)
Настройки TLS.
TLS предоставляется Golang.
Обычно в результате согласования TLS используется TLS 1.3, DTLS не поддерживается.
Конфигурация TLS. TLS предоставляется Golang, обычно результатом согласования TLS является использование TLS 1.3, DTLS не поддерживается.
> `realitySettings`: [RealityObject](#realityobject)
Настройки Reality.
Reality - это оригинальная технология Xray.
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.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация TCP для текущего соединения, действительна только если это соединение использует TCP.
> `kcpSettings`: [KcpObject](./transports/mkcp.md)
Настройки mKCP для текущего подключения, действуют только при использовании mKCP.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация mKCP для текущего соединения, действительна только если это соединение использует mKCP.
> `wsSettings`: [WebSocketObject](./transports/websocket.md)
Настройки WebSocket для текущего подключения, действуют только при использовании WebSocket.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация WebSocket для текущего соединения, действительна только если это соединение использует WebSocket.
> `httpSettings`: [HttpObject](./transports/h2.md)
Настройки HTTP/2 для текущего подключения, действуют только при использовании HTTP/2.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация HTTP/2 для текущего соединения, действительна только если это соединение использует HTTP/2.
> `grpcSettings`: [GRPCObject](./transports/grpc.md)
Настройки gRPC для текущего подключения, действуют только при использовании gRPC.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация gRPC для текущего соединения, действительна только если это соединение использует gRPC.
> `httpupgradeSettings`: [HttpUpgradeObject](./transports/httpupgrade.md)
Настройки HTTPUpgrade для текущего подключения, действуют только при использовании HTTPUpgrade.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация HTTPUpgrade для текущего соединения, действительна только если это соединение использует HTTPUpgrade.
> `splithttpSettings`: [SplitHttpObject](./transports/splithttp.md)
Настройки SplitHTTP для текущего подключения, действуют только при использовании SplitHTTP.
Настройки аналогичны глобальным настройкам, описанным выше.
Конфигурация SplitHTTP для текущего соединения, действительна только если это соединение использует SplitHTTP.
> `sockopt`: [SockoptObject](#sockoptobject)
Настройки прозрачного прокси.
Конкретные настройки, связанные с прозрачным проксированием.
### TLSObject
@ -128,7 +113,7 @@ Reality - это самый безопасный на данный момент
"alpn": ["h2", "http/1.1"],
"minVersion": "1.2",
"maxVersion": "1.3",
"cipherSuites": "список наборов шифров, разделенных двоеточиями",
"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).
Эта функция только **эмулирует** отпечаток `TLS Client Hello`, поведение и другие отпечатки такие же, как у Golang. Если вам нужна более полная эмуляция отпечатка и поведения браузера `TLS`, используйте [Browser Dialer](./transports/websocket.md#browser-dialer).
:::
::: tip
При использовании этой функции некоторые параметры TLS, влияющие на отпечаток TLS, будут переопределены библиотекой utls и не будут действовать, например, ALPN.
Передаваемые параметры:
`"serverName" "allowInsecure" "disableSystemRoot" "pinnedPeerCertificateChainSha256" "masterKeyLog"`
:::
> `pinnedPeerCertificateChainSha256`: \[string\]
SHA256-хэш цепочки сертификатов удаленного сервера в стандартном формате кодировки.
Соединение TLS будет успешно установлено, только если хэш цепочки сертификатов сервера совпадает с одним из значений в этом списке.
Используется для указания хэша SHA256 цепочки сертификатов удаленного сервера с использованием стандартного формата кодировки. Соединение TLS может быть успешно установлено только в том случае, если хэш цепочки сертификатов сервера соответствует одному из значений, указанных в настройке.
Если соединение не удалось установить из-за этой настройки, будет показан хэш цепочки сертификатов удаленного сервера.
Если соединение не удалось установить из-за этой конфигурации, будет отображен хэш сертификата удаленного сервера.
::: danger
Не рекомендуется использовать этот способ для получения хэша цепочки сертификатов, так как в этом случае у вас не будет возможности проверить, является ли сертификат, предоставленный сервером, подлинным, и поэтому вы не можете гарантировать, что полученный хэш сертификата будет ожидаемым.
Не рекомендуется использовать этот способ для получения хэша цепочки сертификатов, так как в этом случае не будет возможности проверить, является ли сертификат, предоставленный сервером в данный момент, подлинным, и, следовательно, не гарантируется, что полученный хэш сертификата является ожидаемым.
:::
::: tip
Если вам нужно получить хэш сертификата, запустите команду `xray tls certChainHash --cert <cert.pem>` в командной строке, где `<cert.pem>` - это путь к файлу сертификата.
Если вам нужно получить хэш сертификата, запустите `xray tls certChainHash --cert <cert.pem>` из командной строки, где `<cert.pem>` следует заменить на фактический путь к файлу сертификата.
:::
> `certificates`: \[ [CertificateObject](#certificateobject) \]
Список сертификатов, каждый элемент которого представляет собой сертификат (рекомендуется использовать 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` сервера.
Состоит из символов от 0 до f, длина должна быть кратна 2, максимальная длина - 16.
Длина — 8 байт, то есть 16 шестнадцатеричных цифр (0-f), может быть меньше 16, ядро автоматически добавит 0 в конец, но количество цифр должно быть **четным** (потому что один байт состоит из 2 шестнадцатеричных цифр).
Если `shordIDs` на сервере содержит пустое значение, этот параметр на клиенте может быть пустым.
Например, `aa1234` будет автоматически дополнено до `aa12340000000000`, а `aaa1234` приведет к ошибке.
> `publicKey`: string
0 также является четным числом, поэтому, если `shordIDs` сервера содержит пустое значение `""`, клиент также может быть пустым.
Обязательный параметр, открытый ключ, соответствующий закрытому ключу сервера.
Сгенерируйте его с помощью команды `./xray x25519 -i "закрытый ключ сервера"`.
> `publicKey` : string
> `spiderX`: string
Обязательный параметр, открытый ключ, соответствующий закрытому ключу сервера. Генерируется с помощью команды `./xray x25519 -i "закрытый_ключ_сервера"`.
Начальный путь и параметры для краулера, рекомендуется использовать разные значения для каждого клиента.
> `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`.
- ~~Windows 10 (1607)~~ (неправильная реализация).
- Mac OS 10.11 / iOS 9 (требуется тестирование).
- 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-хэш цепочки сертификатов удаленного се
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
В предыдущих версиях, когда 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 будет отключен.
:::
> `tcpUserTimeout`: number
Измеряется в миллисекундах.
Подробнее: https://github.com/grpc/proposal/blob/master/A18-tcp-user-timeout.md
> `tcpcongestion`: ""
Алгоритм управления перегрузкой TCP.
Поддерживается только в Linux.
Если этот параметр не указан, используется значение по умолчанию системы.
::: 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