Files
XTLS_Xray-docs-next/docs/ru/config/outbounds/freedom.md
T

14 KiB
Raw Blame History

Freedom (fragment, noises)

Freedom — это исходящий протокол, который можно использовать для отправки (обычных) данных TCP или UDP в любую сеть.

::: warning Для этого outbound на стороне сервера и обратного прокси действует политика безопасности по умолчанию, которая может блокировать некоторые цели; способ разрешения см. ниже в finalRules. :::

OutboundConfigurationObject

OutboundConfigurationObject соответствует элементу settings в OutboundObject.

{
  "outbounds": [
    {
      // ...
      "protocol": "freedom",
      "settings": {
        // [!code focus:27]
        "domainStrategy": "AsIs",
        "redirect": "127.0.0.1:3366",
        "userLevel": 0,
        "fragment": {
          "packets": "tlshello",
          "length": "100-200",
          "interval": "10-20" // единица измерения: мс
        },
        "noises": [
          {
            "type": "base64",
            "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
            "delay": "10-16"
          }
        ],
        "proxyProtocol": 0,
        "finalRules": [
          {
            "action": "block",
            "network": "tcp",
            "port": "22,25,465,587"
          },
          {
            "action": "block",
            "ip": ["geoip:cn"]
          }
        ]
      }
    }
  ]
}

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

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

Все параметры по смыслу аналогичны domainStrategy в sockopt.

Только использование AsIs в этом разделе позволяет передать доменное имя в последующий модуль sockopt. Если установить значение, отличное от AsIs, домен будет разрешен в конкретный IP, что сделает последующие настройки sockopt.domainStrategy и связанный с ними механизм happyEyeballs недействительными. (Если вы не изменяли эти настройки, негативного влияния не будет).

По определенным причинам при отправке UDP протокол Freedom игнорирует domainStrategy в sockopt и по умолчанию принудительно отдает предпочтение IPv4.

redirect: address_port

Freedom будет принудительно отправлять все данные на указанный адрес (а не на адрес, указанный во входящем соединении).

Значение — строка, например: "127.0.0.1:80", ":1234".

Если адрес не указан, например ":443", Freedom не будет изменять исходный целевой адрес. Если порт равен 0, например "xray.com: 0", Freedom не будет изменять исходный порт.

userLevel: number

Уровень пользователя. Подключение будет использовать локальную политику, соответствующую этому уровню пользователя.

Значение userLevel соответствует значению level в policy. Если не указано, по умолчанию используется значение 0.

fragment: map

Несколько пар «ключ-значение», используемых для управления исходящей фрагментацией TCP. В некоторых случаях это может обмануть системы цензуры, например, обойти черные списки SNI. "length" и "interval" относятся к типу Int32Range

"packets": поддерживаются два режима фрагментации: "1-3" — фрагментация потока TCP, применяется к первым трем операциям записи данных на стороне клиента; "tlshello" — фрагментация пакета TLS-рукопожатия.

"length": длина фрагмента (в байтах).

"interval": интервал между фрагментами (в мс).

Если значение равно 0 и установлено "packets": "tlshello", фрагментированный пакет Client Hello будет отправлен в одном TCP-пакете (если его исходный размер не превышает MSS или MTU, что приводит к автоматической фрагментации системой).

noises: array

UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS.

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

"type": тип пакета шума. В настоящее время поддерживаются "rand" (случайные данные), "str" (пользовательская строка) и "base64" (пользовательские двоичные данные, закодированные в Base64).

"packet": содержимое пакета данных, основанное на предыдущем значении type.

  • Если type равен rand, здесь указывается длина случайных данных. Это может быть фиксированное значение, например "100", или диапазон значений, например "50-150".
  • Если type равен str, здесь указывается строка для отправки.
  • Если type имеет значение hex, здесь указываются двоичные данные в шестнадцатеричном представлении.
  • Если type равен base64, здесь указываются двоичные данные, закодированные в Base64.

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

proxyProtocol: number

Протокол PROXY обычно используется в сочетании с redirect для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.

proxyProtocol принимает значение номера версии протокола PROXY — 1 или 2. Если не указано, по умолчанию используется значение 0 (протокол не используется).

finalRules: [FinalRuleObject]

Последовательно сопоставляет финальные правила Freedom и разрешает или блокирует целевые соединения.

По сравнению с блокировкой в routing, finalRules применяется на финальном этапе исходящего соединения Freedom: сопоставление выполняется после разрешения конечного IP и до дозвона; кроме того, для UDP сопоставление также выполняется для каждого пакета при отправке и приеме, поэтому работает строже и надежнее. Сопоставление каждого правила занимает около 50-150 нс.

Обратите внимание: всякий раз, когда Freedom должен применять finalRules, если domainStrategy имеет значение AsIs, а целью является домен, Freedom все равно сначала разрешает цель в IP через системный DNS, а затем выполняет сопоставление правил. После этого цель уже не является доменом, поэтому последующий sockopt.domainStrategy и связанный с ним happyEyeballs больше не применяются.

::: warning На стороне сервера и обратного прокси действует резервная политика безопасности по умолчанию:

Если ни одно явное правило не совпало, используется встроенное резервное правило: трафик от обратного прокси VLESS по умолчанию блокирует все цели; трафик от входящих VLESS, VMess, Trojan, Shadowsocks, Hysteria или WireGuard по умолчанию блокирует частные и зарезервированные диапазоны IP; прочий трафик по умолчанию полностью разрешается.

Если серверу нужно разрешить клиентам доступ к некоторым внутренним сервисам, явно настройте правила allow и по возможности разрешайте только необходимые network, ip и port.

Если серверу также нужны возможности, которые зависят от передачи доменного имени в sockopt (например, sockopt.domainStrategy или happyEyeballs), то использовать эту политику безопасности по умолчанию дальше нельзя. Можно задать первым правило allow без каких-либо условий сопоставления, чтобы восстановить прежнее поведение; это также эквивалентно отключению этой политики безопасности по умолчанию, поэтому оцените последствия для безопасности самостоятельно. :::

FinalRuleObject

{
  "action": "block",
  "network": "tcp,udp",
  "port": "53,443",
  "ip": ["10.0.0.0/8", "2001:db8::/32"],
  "blockDelay": "30-90"
}

Все условия сопоставления в правиле объединяются логикой AND. Если условие опущено, оно не ограничивается.

action: "allow" | "block"

Определяет действие при совпадении правила.

  • allow: разрешить цель.
  • block: заблокировать цель.

network: "tcp" | "udp" | "tcp,udp"

Сопоставляет тип сети. Правило вступает в силу, если тип соединения соответствует указанному. Также можно указать массив строк, например ["tcp", "udp"]. Если опущено, совпадают все сети.

port: number | string

Диапазон портов назначения. Синтаксис совпадает с port в правилах маршрутизации. Если опущено, совпадают все порты.

ip: [string]

Массив, каждый элемент которого представляет собой диапазон IP-адресов. Правило вступает в силу, если какой-либо элемент соответствует целевому IP-адресу. Синтаксис совпадает с ip в правилах маршрутизации. Если опущено, совпадают все IP.

blockDelay: string

Задает длительность состояния "черной дыры" после срабатывания правила блокировки.

Когда action правила имеет значение block и цель совпала, Freedom переводит соединение в состояние "черной дыры" и закрывает его после истечения этого времени. Единица измерения — секунды. Можно указать фиксированное значение или диапазон, например 30 или 30-90. Если параметр опущен, по умолчанию используется 30-90, то есть случайное значение в пределах этого диапазона.