|
|
# Транспорт
|
|
|
|
|
|
Транспорт (transport) - это способ, которым текущий узел Xray взаимодействует с другими узлами.
|
|
|
|
|
|
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
|
|
|
Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено.
|
|
|
|
|
|
## StreamSettingsObject
|
|
|
|
|
|
`StreamSettingsObject` соответствует полю `streamSettings` во входящем или исходящем подключении.
|
|
|
Каждое входящее или исходящее подключение может иметь свои собственные настройки транспорта.
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"network": "tcp",
|
|
|
"security": "none",
|
|
|
"tlsSettings": {},
|
|
|
"tcpSettings": {},
|
|
|
"kcpSettings": {},
|
|
|
"wsSettings": {},
|
|
|
"httpSettings": {},
|
|
|
"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" | "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.
|
|
|
Настройки аналогичны глобальным настройкам, описанным выше.
|
|
|
|
|
|
> `grpcSettings`: [GRPCObject](./transports/grpc.md)
|
|
|
|
|
|
Настройки gRPC для текущего подключения, действуют только при использовании gRPC.
|
|
|
Настройки аналогичны глобальным настройкам, описанным выше.
|
|
|
|
|
|
> `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 <cert.pem>` в командной строке, где `<cert.pem>` - это путь к файлу сертификата.
|
|
|
:::
|
|
|
|
|
|
> `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](./features/fallback.md#fallbackobject).
|
|
|
|
|
|
::: warning
|
|
|
Для лучшей маскировки Xray **напрямую перенаправляет** трафик, не прошедший аутентификацию Reality (незаконные запросы Reality), на `dest`.
|
|
|
Если IP-адрес сайта `dest` является особенным (например, сайт использует CDN CloudFlare), то ваш сервер будет действовать как переадресатор портов для CloudFlare, что может привести к утечке трафика после сканирования.
|
|
|
Чтобы избежать этого, можно использовать Nginx или другие средства для фильтрации нежелательных SNI.
|
|
|
:::
|
|
|
|
|
|
> `xver`: number
|
|
|
|
|
|
Необязательный параметр, формат такой же, как у `xver` в `fallbacks` для VLESS [xver](./features/fallback.md#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](#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-соединения на основе 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"<br>
|
|
|
> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"<br>
|
|
|
> "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`, значение должно быть десятичным числом.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|