diff --git a/docs/ru/config/transport.md b/docs/ru/config/transport.md new file mode 100644 index 0000000..5c86786 --- /dev/null +++ b/docs/ru/config/transport.md @@ -0,0 +1,889 @@ +# Транспорт + +Транспорт (transport) - это способ, которым текущий узел Xray взаимодействует с другими узлами. + +Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт. +Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено. + +Настройка транспорта (transport) состоит из двух частей: + +1. ~~Глобальные настройки ([TransportObject](#transportobject)) (устарело)~~ +2. Локальные настройки ([StreamSettingsObject](#streamsettingsobject)). + +- Локальные настройки позволяют указать способ передачи данных для каждого отдельного входящего или исходящего подключения. +- Обычно клиент и сервер должны использовать одинаковый транспорт для соответствующих входящих и исходящих подключений. + Если в настройках указан тип транспорта, но не указаны конкретные параметры, будут использованы настройки из глобальной конфигурации. + +
+Глобальные настройки + + +## TransportObject (устарело) + +`TransportObject` соответствует полю `transport` в конфигурационном файле. + +```json +{ + "transport": { + "tcpSettings": {}, + "kcpSettings": {}, + "wsSettings": {}, + "httpSettings": {}, + "quicSettings": {}, + "dsSettings": {}, + "grpcSettings": {}, + "httpupgradeSettings": {} + } +} +``` + +> `tcpSettings`: [TcpObject](./transports/tcp.md) + +Настройки TCP-подключений. + +> `kcpSettings`: [KcpObject](./transports/mkcp.md) + +Настройки mKCP-подключений. + +> `wsSettings`: [WebSocketObject](./transports/websocket.md) + +Настройки WebSocket-подключений. + +> `httpSettings`: [HttpObject](./transports/h2.md) + +Настройки HTTP/2-подключений. + +> `quicSettings`: [QuicObject](./transports/quic.md) + +Настройки QUIC-подключений. + +> `grpcSettings`: [GRPCObject](./transports/grpc.md) + +Настройки gRPC-подключений. + +> `httpupgradeSettings`: [HttpUpgradeObject](./transports/httpupgrade.md) + +Настройки HTTPUpgrade-подключений. + +> `splithttpSettings`: [SplitHttpObject](./transports/splithttp.md) + +Настройки SplitHTTP-подключений. + +> `dsSettings`: [DomainSocketObject](./transports/domainsocket.md) + +Настройки Domain Socket-подключений. + +
+ +## StreamSettingsObject + +`StreamSettingsObject` соответствует полю `streamSettings` во входящем или исходящем подключении. +Каждое входящее или исходящее подключение может иметь свои собственные настройки транспорта. + +```json +{ + "network": "tcp", + "security": "none", + "tlsSettings": {}, + "tcpSettings": {}, + "kcpSettings": {}, + "wsSettings": {}, + "httpSettings": {}, + "quicSettings": {}, + "dsSettings": {}, + "grpcSettings": {}, + "httpupgradeSettings": {}, + "splithttpSettings": {}, + "sockopt": { + "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": [] + } +} +``` + +> `network`: "tcp" | "ws" | "h2" | "grpc" | "quic" | "kcp" | "httpupgrade" | "splithttp" + +Тип транспорта, используемый для передачи данных. +Значение по умолчанию - `"tcp"`. + +::: tip +"h2" можно записать как "http", "grpc" - как "gun", "kcp" - как "mkcp". +::: + +> `security`: "none" | "tls" | "reality" + +Включить шифрование транспортного уровня. +Доступные значения: + +- `"none"` - без шифрования (значение по умолчанию). +- `"tls"` - использовать [TLS](https://ru.wikipedia.org/wiki/Transport_Layer_Security). +- `"reality"` - использовать REALITY. + +> `tlsSettings`: [TLSObject](#tlsobject) + +Настройки TLS. +TLS предоставляется Golang. +Обычно в результате согласования TLS используется TLS 1.3, DTLS не поддерживается. + +> `realitySettings`: [RealityObject](#realityobject) + +Настройки Reality. +Reality - это оригинальная технология Xray. +Reality обеспечивает более высокий уровень безопасности, чем TLS, и настраивается аналогично TLS. + +::: tip +Reality - это самый безопасный на данный момент способ шифрования транспорта, и внешний трафик выглядит как обычный интернет-трафик. +Включение Reality и настройка правильного режима управления потоком XTLS Vision может привести к увеличению производительности в несколько раз. +::: + +> `tcpSettings`: [TcpObject](./transports/tcp.md) + +Настройки TCP для текущего подключения, действуют только при использовании TCP. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `kcpSettings`: [KcpObject](./transports/mkcp.md) + +Настройки mKCP для текущего подключения, действуют только при использовании mKCP. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `wsSettings`: [WebSocketObject](./transports/websocket.md) + +Настройки WebSocket для текущего подключения, действуют только при использовании WebSocket. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `httpSettings`: [HttpObject](./transports/h2.md) + +Настройки HTTP/2 для текущего подключения, действуют только при использовании HTTP/2. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `quicSettings`: [QUICObject](./transports/quic.md) + +Настройки QUIC для текущего подключения, действуют только при использовании QUIC. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `grpcSettings`: [GRPCObject](./transports/grpc.md) + +Настройки gRPC для текущего подключения, действуют только при использовании gRPC. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `dsSettings`: [DomainSocketObject](./transports/domainsocket.md) + +Настройки Domain socket для текущего подключения, действуют только при использовании Domain socket. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `httpupgradeSettings`: [HttpUpgradeObject](./transports/httpupgrade.md) + +Настройки HTTPUpgrade для текущего подключения, действуют только при использовании HTTPUpgrade. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `splithttpSettings`: [SplitHttpObject](./transports/splithttp.md) + +Настройки SplitHTTP для текущего подключения, действуют только при использовании SplitHTTP. +Настройки аналогичны глобальным настройкам, описанным выше. + +> `sockopt`: [SockoptObject](#sockoptobject) + +Настройки прозрачного прокси. + +### TLSObject + +```json +{ + "serverName": "xray.com", + "rejectUnknownSni": false, + "allowInsecure": false, + "alpn": ["h2", "http/1.1"], + "minVersion": "1.2", + "maxVersion": "1.3", + "cipherSuites": "список наборов шифров, разделенных двоеточиями", + "certificates": [], + "disableSystemRoot": false, + "enableSessionResumption": false, + "fingerprint": "", + "pinnedPeerCertificateChainSha256": [""], + "masterKeyLog": "" +} +``` + +> `serverName`: string + +Доменное имя сертификата сервера. +Используется, если соединение установлено по 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 ` в командной строке, где `` - это путь к файлу сертификата. +::: + +> `certificates`: \[ [CertificateObject](#certificateobject) \] + +Список сертификатов, каждый элемент которого представляет собой сертификат (рекомендуется использовать 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-Core v1.8.7. + +### RealityObject + +```json +{ + "show": false, + "dest": "example.com:443", + "xver": 0, + "serverNames": ["example.com", "www.example.com"], + "privateKey": "", + "minClientVer": "", + "maxClientVer": "", + "maxTimeDiff": 0, + "shortIds": ["", "0123456789abcdef"], + "fingerprint": "chrome", + "serverName": "", + "publicKey": "", + "shortId": "", + "spiderX": "" +} +``` + +::: tip +Дополнительную информацию см. в проекте [REALITY](https://github.com/XTLS/REALITY). +::: + +> `show`: true | false + +Если значение равно `true`, выводить отладочную информацию. + +::: tip +Настройки для **входящего** подключения (**сервер**). +::: + +> `dest`: string + +Обязательный параметр, формат такой же, как у `dest` в `fallbacks` для VLESS [dest](https://xtls.github.io/config/features/fallback.html#fallbackobject). + +::: warning +Для лучшей маскировки Xray **напрямую перенаправляет** трафик, не прошедший аутентификацию Reality (незаконные запросы Reality), на `dest`. +Если IP-адрес сайта `dest` является особенным (например, сайт использует CDN CloudFlare), то ваш сервер будет действовать как переадресатор портов для CloudFlare, что может привести к утечке трафика после сканирования. +Чтобы избежать этого, можно использовать Nginx или другие средства для фильтрации нежелательных SNI. +::: + +> `xver`: number + +Необязательный параметр, формат такой же, как у `xver` в `fallbacks` для VLESS [xver](https://xtls.github.io/config/features/fallback.html#fallbackobject). + +> `serverNames`: \[string\] + +Обязательный параметр, список допустимых `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. + +> `fingerprint`: string + +Обязательный параметр, такой же, как в [TLSObject](https://xtls.github.io/config/transport.html#tlsobject). + +> `shortId`: string + +Одно из значений `shortIds` на сервере. + +Состоит из символов от 0 до f, длина должна быть кратна 2, максимальная длина - 16. + +Если `shordIDs` на сервере содержит пустое значение, этот параметр на клиенте может быть пустым. + +> `publicKey`: string + +Обязательный параметр, открытый ключ, соответствующий закрытому ключу сервера. +Сгенерируйте его с помощью команды `./xray x25519 -i "закрытый ключ сервера"`. + +> `spiderX`: string + +Начальный путь и параметры для краулера, рекомендуется использовать разные значения для каждого клиента. + +#### CertificateObject + +```json +{ + "ocspStapling": 3600, + "oneTimeLoading": false, + "usage": "encipherment", + "certificateFile": "/path/to/certificate.crt", + "keyFile": "/path/to/key.key", + "certificate": [ + "--BEGIN CERTIFICATE--", + "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw", + "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3", + "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+", + "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw", + "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5", + "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON", + "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp", + "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G", + "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA", + "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU", + "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+", + "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO", + "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8", + "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/", + "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q", + "--END CERTIFICATE--" + ], + "key": [ + "--BEGIN RSA PRIVATE KEY--", + "MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh", + "bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9", + "GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n", + "jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN", + "itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq", + "IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw", + "qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue", + "C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap", + "/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM", + "aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW", + "/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4", + "bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ", + "8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi", + "pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR", + "L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG", + "3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7", + "az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK", + "gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH", + "TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8", + "eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW", + "64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q", + "8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2", + "GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq", + "ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR", + "cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT", + "--END RSA PRIVATE KEY--" + ] +} +``` + +> `ocspStapling`: number + +Интервал обновления OCSP-стейплинга. +Совпадает с интервалом перезагрузки сертификата. +Единица измерения: секунды. +Значение по умолчанию - `3600` (1 час). + +> `oneTimeLoading`: true | false + +Загрузить только один раз. +Если значение равно `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`. + - ~~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`. + (Требуется тестирование.) + +- Для входящих подключений указанное здесь **положительное целое число** представляет собой [максимальное количество ожидающих запросов на подключение 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. + Поддерживаются все TCP- и UDP-соединения на основе 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"`. +::: + +> `domainStrategy`: "AsIs"
+> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
+> "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.
+Для iOS / Mac OS требуется Xray-core v1.8.6 или более поздней версии.
+Для 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.
+Значение по умолчанию - `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`, значение должно быть десятичным числом. + + + + +