# Freedom (fragment, noises) Freedom — это исходящий протокол, который можно использовать для отправки (обычных) данных TCP или UDP в любую сеть. ::: warning Для этого outbound на стороне сервера и обратного прокси действует политика безопасности по умолчанию, которая может блокировать некоторые цели; способ разрешения см. ниже в `finalRules`. ::: ## OutboundConfigurationObject `OutboundConfigurationObject` соответствует элементу `settings` в [`OutboundObject`](../outbound.md). ```json { "outbounds": [ { // ... "protocol": "freedom", // [!code focus:29] "settings": { "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](../transports/sockopt.md#sockoptobject). Только использование `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 Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя. Значение `userLevel` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, по умолчанию используется значение `0`. > `fragment`: map Несколько пар «ключ-значение», используемых для управления исходящей фрагментацией TCP. В некоторых случаях это может обмануть системы цензуры, например, обойти черные списки SNI. `"length"` и `"interval"` относятся к типу [Int32Range](../../development/intro/guide.md#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](../../development/intro/guide.md#int32range) > `proxyProtocol`: number Протокол PROXY обычно используется в сочетании с `redirect` для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано. `proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется). > `finalRules`: \[[FinalRuleObject](#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 ```json { "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` в правилах маршрутизации](../routing.md#ruleobject). Если опущено, совпадают все порты. > `ip`: \[string\] Массив, каждый элемент которого представляет собой диапазон IP-адресов. Правило вступает в силу, если какой-либо элемент соответствует целевому IP-адресу. Синтаксис совпадает с [`ip` в правилах маршрутизации](../routing.md#ruleobject). Если опущено, совпадают все IP. > `blockDelay`: string Задает длительность состояния "черной дыры" после срабатывания правила блокировки. Когда `action` правила имеет значение `block` и цель совпала, Freedom переводит соединение в состояние "черной дыры" и закрывает его после истечения этого времени. Единица измерения — секунды. Можно указать фиксированное значение или диапазон, например `30` или `30-90`. Если параметр опущен, по умолчанию используется `30-90`, то есть случайное значение в пределах этого диапазона.