Files
XTLS_Xray-docs-next/docs/ru/config/transports/sockopt.md
T

25 KiB
Raw Blame History

Sockopt

Sockopt используется для настройки низкоуровневого сетевого поведения.

С его помощью можно управлять прозрачным проксированием, стратегией DNS-разрешения и различными параметрами socket.

SockoptObject

SockoptObject соответствует полю sockopt в StreamSettingsObject.

{
  // пример для outbound, аналогично применимо к inbound
  "outbounds": [
    {
      // ...
      "streamSettings": {
        // [!code focus:21]
        "sockopt": {
          "mark": 0,
          "tcpMaxSeg": 1440,
          "tcpFastOpen": false,
          "tproxy": "off",
          "domainStrategy": "AsIs",
          "happyEyeballs": {},
          "dialerProxy": "",
          "acceptProxyProtocol": false,
          "trustedXForwardedFor": [],
          "tcpKeepAliveInterval": 0,
          "tcpKeepAliveIdle": 300,
          "tcpUserTimeout": 10000,
          "tcpcongestion": "bbr",
          "interface": "wg0",
          "V6Only": false,
          "tcpWindowClamp": 600,
          "tcpMptcp": false,
          "addressPortStrategy": "",
          "customSockopt": []
        }
      }
    }
  ]
}

mark: number

Целое число. Если значение не равно нулю, исходящие соединения помечаются через SO_MARK.

  • Только Linux.
  • Требуются права CAP_NET_ADMIN.

tcpMaxSeg: number

Используется для задания максимального размера сегмента TCP.

tcpFastOpen: true | false | number

Включает или отключает TCP Fast Open.

Если указано true или положительное число, TFO включается. Если указано false или отрицательное число, TFO принудительно отключается. Если поле отсутствует или равно 0, используется поведение системы по умолчанию. Параметр доступен и для inbound, и для outbound.

  • Работает только на следующих версиях ОС и новее:

    • Linux 3.16: требует настройки net.ipv4.tcp_fastopen. Это bitmap, где 0x1 разрешает клиентскую сторону, а 0x2 — серверную. По умолчанию используется 0x1. Если TFO нужно на сервере, задайте 0x3.
    • Windows 10 (1607), но реализация некорректна
    • Mac OS 10.11 / iOS 9, требуется проверка
    • FreeBSD 10.3 на сервере / 12.0 на клиенте: нужны net.inet.tcp.fastopen.server_enabled=1 и net.inet.tcp.fastopen.client_enabled=1, тоже требуется проверка
  • Для inbound положительное число означает максимальное число ожидающих TFO-соединений. Не все ОС позволяют задавать это здесь:

    • Linux / FreeBSD: положительное число используется как лимит. Максимум — 2147483647. Если задано true, используется 256. В Linux сверху это также ограничивает net.core.somaxconn.
    • Mac OS: true или положительное число лишь включает TFO. Размер очереди задается отдельно через net.inet.tcp.fastopen_backlog.
    • Windows: true или положительное число только включает TFO.
  • Для outbound true или положительное число просто означает включение TFO на поддерживаемой ОС.

tproxy: "redirect" | "tproxy" | "off"

Включать ли прозрачное проксирование. Только Linux.

  • "redirect": режим Redirect, поддерживает все IPv4/IPv6 TCP-соединения
  • "tproxy": режим TProxy, поддерживает все IPv4/IPv6 TCP- и UDP-соединения
  • "off": прозрачное проксирование отключено

Для прозрачного проксирования нужны root или CAP_NET_ADMIN.

::: danger Если в tunnel параметр followRedirect равен true, а tproxy в Sockopt пустой, то значение tproxy будет автоматически установлено в "redirect". :::

domainStrategy: "AsIs"
"UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
"ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"

Значение по умолчанию — "AsIs".

Если адрес, к которому должно подключиться исходящее соединение, является доменным именем, эта настройка управляет способом его разрешения:

  • При "AsIs" Xray передает домен Go, который разрешает его с использованием DNS-настроек операционной системы и устанавливает соединение. Для TCP обычно сначала пробуется IPv6, а при затруднениях с подключением — IPv4; для UDP предпочтителен IPv4.

    ::: details Выбор адреса и переход между семействами при AsIs TCP использует встроенный в Go механизм Happy Eyeballs. Предпочтительным считается семейство первого адреса в результатах разрешения. Если за 300 мс соединение не установлено, начинаются попытки с другим семейством адресов. Если все попытки с предпочтительным семейством завершились ошибкой раньше, другое семейство пробуется немедленно. Настройка Xray sockopt.happyEyeballs на это не влияет. См. реализацию подключения в Go.

    В сборках Xray на чистом Go адреса сортируются по упрощенным правилам RFC 6724: при прочих равных обычно предпочтителен IPv6, а /etc/gai.conf не читается. Большинство официальных релизных сборок Xray используют этот подход; в некоторых операционных системах или сторонних сборках поведение может немного отличаться. См. реализацию сортировки адресов в Go.

    UDP предпочитает IPv4 из результатов разрешения и выбирает IPv6 только при отсутствии IPv4. Ошибка отправки не вызывает автоматического перехода на другое семейство адресов. Это поведение действует и при откате стратегии Use к AsIs. См. реализацию выбора UDP-адреса в Go. :::

  • При любом другом значении используется встроенный модуль DNS Xray. Если DNSObject не настроен, используется системный DNS. Если подходят несколько IP-адресов, по умолчанию один выбирается случайно; при включенном sockopt.happyEyeballs для TCP выбор выполняется с помощью гонки подключений.

  • "IPv4" означает разрешение только IPv4. "IPv4v6" означает, что сначала разрешается IPv4, а IPv6 разрешается только в том случае, если разрешение IPv4 завершилось ошибкой или не вернуло ни одного IP-адреса. Если IPv4-адреса уже получены, последующая ошибка подключения не приводит к переходу на IPv6. Для "IPv6" и "IPv6v4" действует та же логика, но порядок семейств адресов обратный.

  • Если во встроенном модуле DNS задан "queryStrategy", типы разрешаемых IP определяются пересечением двух настроек: разрешаются только типы, допускаемые обеими. Например, "queryStrategy": "UseIPv4" вместе с "domainStrategy": "UseIP" фактически эквивалентно "domainStrategy": "UseIPv4".

  • Варианты с префиксом "Use" возвращаются к AsIs, если разрешение завершилось ошибкой или результаты не соответствуют требованиям, например если домен разрешается только в IPv4, а выбрано UseIPv6.

  • При вариантах с префиксом "Force" соединение не устанавливается, если разрешение завершилось ошибкой или результаты не соответствуют требованиям.

::: tip Если используется "UseIP" или "ForceIP" и в OutboundObject задан sendThrough, ядро автоматически определяет нужное семейство адресов по локальному адресу. Если вручную зафиксировать, например, UseIPv4, а sendThrough указывает на IPv6-адрес, соединение завершится ошибкой. :::

:::: danger Неправильная настройка этой функции может привести к бесконечному циклу! Чтобы подключиться к серверу, нужно дождаться результата DNS-запроса, а чтобы завершить DNS-запрос, нужно подключиться к серверу.

Неопытным пользователям не рекомендуется использовать эту функцию без понимания маршрутизации.

::: details Подробное объяснение

  1. Адрес прокси-сервера — доменное имя (proxy.com), а встроенный DNS-сервер работает в режиме, отличном от Local.
  2. Перед подключением к proxy.com Xray сначала пытается разрешить proxy.com через встроенный DNS.
  3. Встроенный DNS устанавливает соединение с dns.com, чтобы узнать IP-адрес proxy.com.
  4. Неудачные правила маршрутизации отправляют запрос из шага 3 через proxy.com.
  5. Xray снова пытается подключиться к proxy.com.
  6. Перед этим он опять пытается разрешить proxy.com через встроенный DNS.
  7. Встроенный DNS переиспользует соединение из шага 3 и отправляет новый запрос.
  8. Возникает тупик: соединение из шага 3 ждет результат запроса из шага 7, а запрос из шага 7 не завершится, пока соединение из шага 3 не установится полностью.
  9. Game over.

Возможные решения:

  • Исправить маршрутизацию для встроенного DNS.
  • Использовать hosts.
  • Если вы до сих пор не понимаете решение, не включайте эту функцию.

::: ::::

dialerProxy: ""

Идентификатор исходящего подключения. Если поле не пустое, для установления соединения используется указанное исходящее подключение. Обычно применяется для настройки цепочек прокси.

acceptProxyProtocol: true | false

Только для inbound. Определяет, принимать ли PROXY protocol.

PROXY protocol используется для передачи реального IP-адреса и порта источника. Если вы не знаете, что это такое, просто игнорируйте параметр.

Его умеют отправлять обычные reverse proxy, например HAProxy и Nginx, а также VLESS fallback с xver.

Если значение равно true, после установления TCP-соединения удаленная сторона обязана сразу отправить PROXY protocol v1 или v2, иначе соединение будет закрыто.

trustedXForwardedFor: [ string ]

Применяется только к четырем транспортным способам на базе HTTP: XHTTP, WebSocket, HTTPUpgrade и gRPC. Этот параметр определяет, доверять ли заголовку XFF (X-Forwarded-For), то есть считать ли его переданным доверенным обратным прокси.

Xray проверяет, присутствуют ли в запросе заголовки, соответствующие строкам из этого массива. Если найден хотя бы один из них, независимо от его значения, Xray разрешает использовать значение с индексом 0 в заголовке XFF для подмены исходного IP; в противном случае заголовок XFF игнорируется.

tcpKeepAliveIdle: number

Порог простоя TCP в секундах. После такого времени бездействия начинают отправляться Keep-Alive пакеты.

Для outbound Xray использует такие же значения по умолчанию, как Chrome: и idle, и interval равны 45 секундам. Если установить этот параметр или tcpKeepAliveInterval в отрицательное значение, keepalive по умолчанию отключается; положительное значение его переопределяет.

Для inbound Keep-Alive по умолчанию выключен. Он включается, если этот параметр или tcpKeepAliveInterval не равны нулю. Если задан только один из них, второй берется из настроек ОС.

tcpKeepAliveInterval: number

Интервал в секундах между Keep-Alive пакетами после перехода TCP в keepalive-состояние. Остальное поведение описано выше.

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.

V6Only: true | false

Если значение равно true, прослушивание на :: принимает только IPv6-соединения. Только Linux.

tcpWindowClamp: number

Ограничивает объявляемый размер TCP-окна этим значением. Ядро выбирает максимум между ним и SOCK_MIN_RCVBUF / 2.

tcpMptcp: true | false

Значение по умолчанию — false. Если установить true, включается Multipath TCP. Параметр относится только к клиентской стороне, поскольку начиная с Go 1.24 прослушивание уже включает MPTCP по умолчанию. Требуется Linux kernel 5.6 или новее.

addressPortStrategy: "none" | "SrvPortOnly" | "SrvAddressOnly" | "SrvPortAndAddress" | "TxtPortOnly" | "TxtAddressOnly" | "TxtPortAndAddress"

Позволяет использовать SRV- или TXT-записи для задания адреса и или порта цели для outbound. По умолчанию используется none, то есть функция выключена.

Эти запросы идут через системный DNS, а не через встроенный DNS Xray. В качестве имени для запроса берется домен outbound. Если запрос не удался, используется исходный адрес и порт.

Префикс Srv означает стандартный запрос SRV-записи. Префикс Txt означает TXT-запись в формате вроде 127.0.0.1:80.

PortOnly заменяет только порт. AddressOnly — только адрес. PortAndAddress — и адрес, и порт.

Эта настройка применяется до разрешения адреса через sockopt.domainStrategy. После замены адрес по-прежнему разрешается согласно domainStrategy.

Исходящие подключения Freedom не поддерживают эту настройку.

customSockopt: []

Массив для продвинутых пользователей, которым нужно вручную задать произвольные socket options. Теоретически через него можно воспроизвести все связанные с соединением настройки выше, а также выставить параметры, которые существуют на уровне socket, но не вынесены напрямую в ядре. Сейчас поддерживаются Linux, Windows и Darwin. Пример ниже эквивалентен "tcpcongestion": "bbr".

Используйте этот механизм только если понимаете socket programming.

{
  "customSockopt": [
    {
      "system": "linux",
      "network": "tcp",
      "type": "str",
      "level": "6",
      "opt": "13",
      "value": "bbr"
    }
  ]
}

system: ""

Необязательный параметр. Ограничивает применение конкретной ОС (в нижнем регистре). Если текущая система не совпадает, эта настройка пропускается. Если поле пустое, настройка применяется напрямую. Поддерживаются linux, windows, darwin и android (android используется только в специализированных сборках для Android; запуск сборки Linux на Android по-прежнему считается как linux).

network: ""

Необязательный параметр. Ограничивает применение конкретным типом сети. Поддерживаются tcp, tcp4, tcp6, udp, udp4, udp6. Значение без числового суффикса означает, что sockopt применяется к обоим стекам. Обратите внимание: цель IPv4 не означает, что стандартная библиотека передаст network tcp4/udp4 — например, система может использовать IPv6-сокет для подключения к IPv4-адресу. Перед использованием проверьте поведение стандартной библиотеки.

type: ""

Обязательный параметр. Тип значения. Сейчас поддерживаются int и str.

level: ""

Необязательный параметр. Уровень протокола. По умолчанию используется 6, то есть TCP.

opt: ""

Номер socket option в десятичной форме. В примере выше 13 — это десятичная форма значения TCP_CONGESTION, которое в hex записывается как 0xd.

value: ""

Значение, которое нужно установить. В примере выше это bbr.

Если type равно int, значение должно быть задано десятичным числом.

happyEyeballs: HappyEyeballsObject

Реализация Happy Eyeballs по RFC 8305, только для TCP. Когда целью является доменное имя, Xray запускает гонку между разрешенными адресами и выбирает первый успешный. Работает только если sockopt.domainStrategy не равен AsIs.

Значения UseIPv4v6 и ForceIPv4v6 фактически сокращают список доступных IP-адресов до IPv4 и переходят к разрешению IPv6 только в том случае, если разрешение IPv4 завершилось ошибкой или не вернуло ни одного IP-адреса. Ошибка подключения по IPv4 не запускает этот переход. Такое использование не рекомендуется. Лучше использовать UseIP или ForceIP вместе с happyEyeballs.interleave.

::: warning Нельзя использовать эту функцию вместе с dialerProxy, иначе happyEyeballs не сработает. :::

HappyEyeballsObject

{
  "happyEyeballs": {
    "tryDelayMs": 250,
    "prioritizeIPv6": false,
    "interleave": 1,
    "maxConcurrentTry": 4
  }
}

tryDelayMs: number

Задержка между попытками гонки в миллисекундах. Значение по умолчанию — 0, то есть функция выключена. Рекомендуемое значение — 250.

prioritizeIPv6: bool

Определяет, какой тип адреса будет первым после сортировки. По умолчанию false, то есть IPv4 идет первым.

interleave: number

Параметр RFC 8305 First Address Family Count. Значение по умолчанию — 1. Он определяет, как IPv4 и IPv6 адреса чередуются в очереди.

Например, очередь может выглядеть как 46464646, если значение равно 1, или как 44664466, если значение равно 2, где 6 означает IPv6, а 4 — IPv4.

maxConcurrentTry: number

Максимальное количество параллельных попыток. Это не дает ядру открыть слишком много соединений, если домен разрешился в большой список адресов и все они неудачны. Значение по умолчанию — 4. Значение 0 отключает Happy Eyeballs.