RU transport: recover a lost text partition and remove TCP no delay

This commit is contained in:
Nikita Korotaev 2025-01-02 13:25:48 +05:00 committed by GitHub
parent d9c37aaadb
commit 11dcb2a755
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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.<br>
Значение по умолчанию — `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, значение должно быть десятичным числом.