Используется, если соединение установлено по IP-адресу.
Если этот параметр не указан, автоматически используется значение из `address` (если это доменное имя).
Это значение также используется для проверки действительности сертификата сервера.
::: tip
Как упомянуто выше, поскольку это значение также используется для проверки действительности сертификата сервера, если по какой-либо причине вам нужно указать значение, отличное от доменного имени в сертификате сервера, необходимо включить параметр `allowInsecure`, иначе проверка сертификата завершится неудачей.
Из соображений безопасности мы не рекомендуем использовать этот метод постоянно.
Если вам нужно безопасно подменить SNI, рассмотрите возможность использования REALITY.
В частности, если на клиенте указан IP-адрес, Xray не будет отправлять SNI.
Чтобы использовать эту функцию, также необходимо включить `allowInsecure`.
:::
> `rejectUnknownSni`: bool
Если значение равно `true`, сервер отклонит рукопожатие TLS, если полученный SNI не совпадает с доменным именем в сертификате.
Значение по умолчанию - `false`.
> `alpn`: \[ string \]
Массив строк, указывающий значения ALPN, используемые при рукопожатии TLS.
Значение по умолчанию - `["h2", "http/1.1"]`.
> `minVersion`: string
Минимальная допустимая версия TLS.
> `maxVersion`: string
Максимальная допустимая версия TLS.
> `cipherSuites`: string
Список поддерживаемых наборов шифров, разделенных двоеточиями.
Список наборов шифров Golang и их описания можно найти [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L500) или [здесь](https://golang.org/src/crypto/tls/cipher_suites.go#L44).
::: danger
Эти два параметра не являются обязательными и обычно не влияют на безопасность.
Если они не настроены, Golang автоматически выбирает их в зависимости от устройства.
Если вы не знакомы с этими параметрами, не настраивайте их.
Вы несете ответственность за любые проблемы, вызванные неправильной настройкой.
:::
> `allowInsecure`: true | false
Разрешить небезопасные соединения (только для клиентов).
Значение по умолчанию - `false`.
Если значение равно `true`, Xray не будет проверять действительность сертификата TLS, предоставленного удаленным хостом.
::: danger
Из соображений безопасности не рекомендуется устанавливать этот параметр в `true` в реальных сценариях, так как это может сделать вас уязвимыми для атак типа "человек посередине".
:::
> `disableSystemRoot`: true | false
Отключить использование корневых сертификатов, предоставляемых операционной системой.
Значение по умолчанию - `false`.
Если значение равно `true`, Xray будет использовать только сертификаты, указанные в `certificates`, для рукопожатия TLS.
Если значение равно `false`, Xray будет использовать только корневые сертификаты, предоставляемые операционной системой, для рукопожатия TLS.
> `enableSessionResumption`: true | false
Если этот параметр установлен в `false`, расширение `session_ticket` не будет включено в ClientHello.
Обычно программы на Golang не используют это расширение в ClientHello, поэтому рекомендуется оставить значение по умолчанию.
Значение по умолчанию - `false`.
> `fingerprint`: string
Этот параметр используется для настройки отпечатка `TLS Client Hello`.
Если значение пустое, эта функция отключена.
Если эта функция включена, Xray будет **эмулировать** отпечаток `TLS`с помощью библиотеки uTLS или генерировать его случайным образом.
Поддерживаются три способа настройки:
1. Отпечатки TLS последних версий популярных браузеров, включая:
-`"chrome"`
-`"firefox"`
-`"safari"`
-`"ios"`
-`"android"`
-`"edge"`
-`"360"`
-`"qq"`
2. Автоматическая генерация отпечатка при запуске Xray:
-`"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).
::: tip
Эта функция только **эмулирует** отпечаток `TLS Client Hello`, поведение и другие отпечатки такие же, как у Golang.
Если вам нужно более полно эмулировать отпечаток `TLS` и поведение браузера, используйте [Browser Dialer](./transports/websocket.md#browser-dialer).
:::
> `pinnedPeerCertificateChainSha256`: \[string\]
SHA256-хэш цепочки сертификатов удаленного сервера в стандартном формате кодировки.
Соединение TLS будет успешно установлено, только если хэш цепочки сертификатов сервера совпадает с одним из значений в этом списке.
Если соединение не удалось установить из-за этой настройки, будет показан хэш цепочки сертификатов удаленного сервера.
::: danger
Не рекомендуется использовать этот способ для получения хэша цепочки сертификатов, так как в этом случае у вас не будет возможности проверить, является ли сертификат, предоставленный сервером, подлинным, и поэтому вы не можете гарантировать, что полученный хэш сертификата будет ожидаемым.
:::
::: tip
Если вам нужно получить хэш сертификата, запустите команду `xray tls certChainHash --cert <cert.pem>` в командной строке, где `<cert.pem>` - это путь к файлу сертификата.
Список сертификатов, каждый элемент которого представляет собой сертификат (рекомендуется использовать fullchain).
::: tip
Если вам нужно получить оценку A/A+ в ssllibs или myssl, см. [здесь](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
:::
> `masterKeyLog` : string
Путь к файлу журнала (pre)-master-secret, который можно использовать для расшифровки TLS-соединений, отправляемых Xray, в таких программах, как Wireshark.
Пока не поддерживается совместное использование с utls.
Для лучшей маскировки Xray **напрямую перенаправляет** трафик, не прошедший аутентификацию Reality (незаконные запросы Reality), на `dest`.
Если IP-адрес сайта `dest` является особенным (например, сайт использует CDN CloudFlare), то ваш сервер будет действовать как переадресатор портов для CloudFlare, что может привести к утечке трафика после сканирования.
Чтобы избежать этого, можно использовать Nginx или другие средства для фильтрации нежелательных SNI.
Обязательный параметр, список допустимых `serverName` для клиентов.
Пока не поддерживаются подстановочные знаки \*.
Обычно это значение совпадает с`dest`.
Фактически допустимыми значениями являются любые SNI, принимаемые сервером (в зависимости от конфигурации `dest`).
В качестве ориентира можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата.
Может содержать пустое значение `""`, что означает прием подключений без SNI.
> `privateKey`: string
Обязательный параметр, сгенерируйте его, выполнив команду `./xray x25519`.
> `minClientVer`: string
Необязательный параметр, минимальная версия Xray на клиенте, формат: `x.y.z`.
> `maxClientVer`: string
Необязательный параметр, максимальная версия Xray на клиенте, формат: `x.y.z`.
> `maxTimeDiff`: number
Необязательный параметр, максимально допустимая разница во времени в миллисекундах.
> `shortIds`: \[string\]
Обязательный параметр, список допустимых `shortId` для клиентов, которые можно использовать для различения разных клиентов.
Состоит из символов от 0 до f, длина должна быть кратна 2, максимальная длина - 16.
Если список содержит пустое значение, `shortId` на клиенте может быть пустым.
::: tip
Настройки для **исходящего** подключения (**клиент**).
:::
> `serverName`: string
Одно из значений `serverNames` на сервере.
Если `serverNames` на сервере содержит пустое значение, на клиенте можно использовать `"serverName": "0.0.0.0"`, как и в TLS, для установления соединения без SNI.
В отличие от TLS, в REALITY для использования этой функции не нужно включать параметр `allowInsecure`.
При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при приеме соединений без SNI.
Если значение равно `true`, функция перезагрузки сертификата и OCSP-стейплинга отключаются.
::: warning
Если значение равно `true`, OCSP-стейплинг будет отключен.
:::
> `usage`: "encipherment" | "verify" | "issue"
Назначение сертификата.
Значение по умолчанию - `"encipherment"`.
-`"encipherment"`: сертификат используется для аутентификации и шифрования TLS.
-`"verify"`: сертификат используется для проверки сертификата удаленного TLS-сервера.
При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
-`"issue"`: сертификат используется для выпуска других сертификатов.
При использовании этого значения текущий сертификат должен быть сертификатом ЦС.
::: tip Совет 1
В Windows можно установить самозаверяющий сертификат ЦС в систему, чтобы проверять сертификаты удаленных TLS-серверов.
:::
::: tip Совет 2
При получении нового запроса от клиента, если указанный `serverName` равен `"xray.com"`, Xray сначала ищет в списке сертификатов сертификат, который можно использовать для `"xray.com"`.
Если подходящий сертификат не найден, Xray использует любой сертификат с`usage` = `"issue"` для выпуска нового сертификата для `"xray.com"`со сроком действия один час.
Новый сертификат добавляется в список сертификатов для последующего использования.
:::
::: tip Совет 3
Если указаны и `certificateFile`, и `certificate`, Xray использует `certificateFile`.
То же самое относится к `keyFile` и `key`.
:::
::: tip Совет 4
Если `usage` равен `"verify"`, `keyFile` и `key` могут быть пустыми.
:::
::: tip Совет 5
Можно сгенерировать самозаверяющий сертификат ЦС с помощью команды `xray tls cert`.
:::
::: tip Совет 6
Если у вас есть доменное имя, вы можете легко получить бесплатный сторонний сертификат с помощью таких инструментов, как [acme.sh](https://github.com/acmesh-official/acme.sh).
:::
> `certificateFile`: string
Путь к файлу сертификата, например, сертификат, сгенерированный OpenSSL, с расширением .crt.
> `certificate`: \[ string \]
Массив строк, представляющий содержимое сертификата, как показано в примере.
`certificate` и `certificateFile` - взаимоисключающие параметры.
> `keyFile`: string
Путь к файлу ключа, например, ключ, сгенерированный OpenSSL, с расширением .key.
В настоящее время не поддерживаются файлы ключей, защищенные паролем.
> `key`: \[ string \]
Массив строк, представляющий содержимое ключа, как показано в примере.
`key` и `keyFile` - взаимоисключающие параметры.
### SockoptObject
```json
{
"mark": 0,
"tcpMaxSeg": 1440,
"tcpFastOpen": false,
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": "",
"acceptProxyProtocol": false,
"tcpKeepAliveInterval": 0,
"tcpKeepAliveIdle": 300,
"tcpUserTimeout": 10000,
"tcpcongestion": "bbr",
"interface": "wg0",
"V6Only": false,
"tcpWindowClamp": 600,
"tcpMptcp": false,
"tcpNoDelay": false,
"customSockopt": []
}
```
> `mark`: number
Целое число.
Если значение не равно нулю, исходящее соединение будет помечено этим значением SO_MARK.
- Работает только в Linux.
- Требуются права CAP_NET_ADMIN.
> `tcpMaxSeg`: number
Устанавливает максимальный размер сегмента TCP (MSS).
> `tcpFastOpen`: true | false | number
Включить [TCP Fast Open](https://ru.wikipedia.org/wiki/TCP_Fast_Open) (TFO).
Если значение равно `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`.
(Требуется тестирование.)
- Для входящих подключений указанное здесь **положительное целое число** представляет собой [максимальное количество ожидающих запросов на подключение 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 включен.
- Для исходящих подключений значение `true` или **положительное целое число** означает только, что TFO включен, во всех операционных системах.
> `tproxy`: "redirect" | "tproxy" | "off"
Включить прозрачное проксирование (только для Linux).
-`"redirect"`: использовать прозрачное проксирование в режиме Redirect.
-`"tproxy"`: использовать прозрачное проксирование в режиме TProxy.
Поддерживаются все TCP- и UDP-соединения на основе IPv4/6.
-`"off"`: отключить прозрачное проксирование.
Для прозрачного проксирования требуются права root или `CAP\_NET\_ADMIN`.
::: danger
Если в [Dokodemo-door](./inbounds/dokodemo.md) параметр `followRedirect` установлен в `true`, а параметр `tproxy` в Sockopt не указан, значение `tproxy` в Sockopt будет установлено в `"redirect"`.
В предыдущих версиях, когда 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`, значение должно быть десятичным числом.