14 KiB
Freedom (fragment, noises)
Freedom — это протокол прямого исходящего подключения, обычно являющийся конечной точкой обработки трафика: он принимает поступающий трафик TCP или UDP, напрямую устанавливает соединение с конечным адресом назначения и передает и принимает данные.
::: warning
Для этого outbound на стороне сервера и обратного прокси действует политика безопасности по умолчанию, которая может блокировать некоторые цели; способ разрешения см. ниже в finalRules.
:::
OutboundConfigurationObject
OutboundConfigurationObject соответствует элементу settings в OutboundObject.
{
"outbounds": [
{
// ...
"protocol": "freedom",
// [!code focus:28]
"settings": {
"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"]
}
]
}
}
]
}
::: tip Стратегия разрешения целевого доменного имени в Freedom задается параметром sockopt.domainStrategy. :::
redirect: address_port
Freedom заменяет текущие адрес и порт назначения соединения на адрес и порт, указанные в redirect.
Значение — строка, например: "127.0.0.1:80", ":1234".
Если адрес не указан, например ":443", Freedom не будет изменять исходный целевой адрес.
Если порт равен 0, например "xray.com:0", Freedom не будет изменять исходный порт.
userLevel: number
Уровень пользователя. Подключение будет использовать локальную политику, соответствующую этому уровню пользователя.
Значение userLevel соответствует значению level в policy. Если не указано, по умолчанию используется значение 0.
fragment: FragmentObject
Несколько пар «ключ-значение», используемых для управления исходящей фрагментацией TCP. В некоторых случаях это может обмануть системы цензуры, например, обойти черные списки SNI.
noises: [ NoiseObject ]
UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS.
Массив, в котором можно определить несколько пакетов шума для отправки. Каждый элемент — это NoiseObject.
proxyProtocol: number
Протокол PROXY обычно используется в сочетании с redirect для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.
proxyProtocol принимает значение номера версии протокола PROXY — 1 или 2. Если не указано, по умолчанию используется значение 0 (протокол не используется).
finalRules: [ FinalRuleObject ]
Последовательно сопоставляет финальные правила Freedom и разрешает или блокирует целевые соединения.
По сравнению с блокировкой в routing, finalRules применяется на финальном этапе исходящего соединения Freedom, до и после установления соединения. Кроме того, для UDP проверяется каждый пакет при отправке и приеме, что делает проверку более строгой и полной. Сопоставление с каждым правилом занимает около 50-150 нс, поэтому беспокоиться о производительности не стоит.
::: details Если цель — доменное имя
Если цель задана доменным именем и требуется применить правила, Freedom перед установлением соединения разрешает домен согласно sockopt.domainStrategy, затем проверяет каждый полученный IP по правилам в указанном порядке. Если заблокирован хотя бы один IP, блокируется весь запрос.
После успешного установления соединения Freedom повторно проверяет по правилам фактический IP удаленной стороны. Поэтому, если предварительное разрешение не удалось или результаты двух разрешений различаются, пакеты TCP-рукопожатия все же могут быть отправлены до перехода соединения в состояние черной дыры.
При отправке каждого UDP-пакета, адресованного доменному имени, домен также разрешается. Однако проверка отдельного пакета сопоставляет с правилами по порядку только выбранный для этого пакета IP назначения и решает, нужно ли его блокировать; все полученные при разрешении IP при этом не проверяются. :::
::: tip
Если для этого исходящего подключения настроен sockopt.dialerProxy, Freedom больше не является конечным исходящим подключением, поэтому finalRules и описанная ниже политика безопасности по умолчанию не применяются.
:::
::: warning На стороне сервера и обратного прокси действует резервная политика безопасности по умолчанию:
Если ни одно явное правило не совпало, используется встроенное резервное правило: трафик от обратного прокси VLESS по умолчанию блокирует все цели; трафик от входящих VLESS, VMess, Trojan, Shadowsocks, Hysteria или WireGuard по умолчанию блокирует частные и зарезервированные диапазоны IP; прочий трафик по умолчанию полностью разрешается.
Если серверу нужно разрешить клиентам доступ к некоторым внутренним сервисам, явно настройте правила allow и по возможности разрешайте только необходимые network, ip и port.
:::
FragmentObject
{
"packets": "tlshello",
"length": "100-200",
"interval": "10-20"
}
packets: string
Поддерживаются два режима фрагментации: "1-3" — фрагментация потока TCP, применяется к первым трем операциям записи данных на стороне клиента; "tlshello" — фрагментация пакета TLS-рукопожатия.
length: Int32Range
Длина фрагмента (в байтах).
interval: Int32Range
Интервал между фрагментами (в мс).
Если значение равно 0 и установлено "packets": "tlshello", фрагментированный пакет Client Hello будет отправлен в одном TCP-пакете (если его исходный размер не превышает MSS или MTU, что приводит к автоматической фрагментации системой).
NoiseObject
{
"type": "base64",
"packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
"delay": "10-16"
}
type: string
Тип пакета шума. В настоящее время поддерживаются "rand" (случайные данные), "str" (пользовательская строка) и "base64" (пользовательские двоичные данные, закодированные в Base64).
packet: string
Содержимое пакета данных, основанное на предыдущем значении type.
- Если
typeравенrand, здесь указывается длина случайных данных. Это может быть фиксированное значение, например"100", или диапазон значений, например"50-150". - Если
typeравенstr, здесь указывается строка для отправки. - Если
typeимеет значениеhex, здесь указываются двоичные данные в шестнадцатеричном представлении. - Если
typeравенbase64, здесь указываются двоичные данные, закодированные в Base64.
delay: Int32Range
Задержка в миллисекундах. После отправки этого пакета шума ядро ждет указанное время, прежде чем отправить следующий пакет шума или реальные данные. По умолчанию ожидание отсутствует.
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, то есть случайное значение в пределах этого диапазона.