Files
XTLS_Xray-docs-next/docs/ru/config/outbounds/freedom.md
T
2026-05-25 18:39:42 +08:00

173 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`, то есть случайное значение в пределах этого диапазона.