From 11dcb2a755ec4c9eee67da03a532173ad51baa7f Mon Sep 17 00:00:00 2001 From: Nikita Korotaev <104270279+iambabyninja@users.noreply.github.com> Date: Thu, 2 Jan 2025 13:25:48 +0500 Subject: [PATCH] RU transport: recover a lost text partition and remove TCP no delay --- docs/ru/config/transport.md | 154 ++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/docs/ru/config/transport.md b/docs/ru/config/transport.md index 3e4f6f7..b2f0398 100644 --- a/docs/ru/config/transport.md +++ b/docs/ru/config/transport.md @@ -596,3 +596,157 @@ x25519Kyber768Draft00 - Если во встроенном DNS установлен параметр `"queryStrategy"`, то фактическое поведение будет комбинацией с этим параметром, и будут разрешаться только типы IP-адресов, присутствующие в обоих параметрах. Например: `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`. +::: tip TIP +При использовании режимов `"UseIP"` и `"ForceIP"` и если в [конфигурации исходящего подключения](../outbound.md#outboundobject) указан `sendThrough`, ядро автоматически определит необходимый тип IP (IPv4 или IPv6) на основе значения `sendThrough`. Если вручную указан один тип IP (например, UseIPv4), но он не соответствует локальному адресу, указанному в `sendThrough`, подключение завершится неудачно. +::: + +::: danger +Неправильная конфигурация после включения этой функции может привести к бесконечному циклу. + +Кратко: для подключения к серверу необходимо дождаться результата DNS-запроса; для завершения DNS-запроса необходимо подключиться к серверу. + +> Tony: Что было раньше, курица или яйцо? + +Подробное объяснение: + +1. Условие возникновения: прокси-сервер (proxy.com). Встроенный DNS-сервер, режим не Local. +2. Xray пытается установить TCP-соединение с proxy.com **до** того, как запросит proxy.com через встроенный DNS-сервер. +3. Встроенный DNS-сервер устанавливает соединение с dns.com и отправляет запрос для получения IP-адреса proxy.com. +4. **Неправильные** правила маршрутизации приводят к тому, что proxy.com проксирует запрос, отправленный на шаге 3. +5. Xray пытается установить другое TCP-соединение с proxy.com. +6. Перед установкой соединения запрашивает proxy.com через встроенный DNS-сервер. +7. Встроенный DNS-сервер повторно использует соединение с шага 3 и отправляет запрос. +8. Возникает проблема. Установка соединения на шаге 3 требует ожидания результата запроса на шаге 7; завершение запроса на шаге 7 требует полного установления соединения на шаге 3. +9. Игра окончена! + +Решение: + +- Изменить правила маршрутизации для встроенного DNS-сервера. +- Использовать Hosts. +- ~~Если вы все еще не знаете решения, не используйте эту функцию.~~ + +Поэтому **не рекомендуется** неопытным пользователям самостоятельно использовать эту функцию. +::: + +> `dialerProxy`: "" + +Идентификатор исходящего прокси. Если значение не пустое, для установления соединения будет использоваться указанный outbound. Эта опция может быть использована для поддержки цепочной переадресации на уровне транспорта. + +::: danger +Эта опция несовместима с ProxySettingsObject.Tag +::: + +> `acceptProxyProtocol`: true | false + +Только для inbound, указывает, следует ли принимать PROXY protocol. + +[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) предназначен для передачи реального исходного IP-адреса и порта запроса. **Если вы не знакомы с ним, проигнорируйте этот параметр**. + +Распространенное программное обеспечение обратного прокси (например, HAProxy, Nginx) может быть настроено на его отправку, VLESS fallbacks xver также может его отправлять. + +Если установлено значение `true`, после установления TCP-соединения на самом нижнем уровне, запрашивающая сторона должна сначала отправить PROXY protocol v1 или v2, иначе соединение будет закрыто. + +> `tcpKeepAliveInterval`: number + +Интервал отправки пакетов TCP Keep-Alive в секундах. ~~Этот параметр применим только в Linux.~~ + +Это пакет проверки связи, когда соединение не работает нормально (не получен ack). + +Если этот параметр не настроен или установлен в 0, используется значение по умолчанию для Go. + +::: tip +При отрицательном значении, например `-1`, TCP Keep-Alive не включается. +::: + +> `tcpKeepAliveIdle`: number + +Порог времени простоя TCP в секундах. Когда время простоя TCP-соединения достигает этого порога, начинают отправляться Keep-Alive пакеты. + +Это пакет проверки связи, когда соединение работает нормально. + +Если этот параметр не настроен или установлен в 0, используется значение по умолчанию для Go. + +::: 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, macOS и Windows. + + +> `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://en.wikipedia.org/wiki/Multipath_TCP). Необходимо включить как на стороне сервера, так и на стороне клиента. +В настоящее время поддерживается только в Linux, требуется ядро Linux 5.6 и выше. + + +> `tcpNoDelay`: true | false + +Этот параметр удален, так как golang по умолчанию включает TCP no delay. Если вы хотите отключить его, используйте customSockopt. + +> `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, значение должно быть десятичным числом.