Freedom
Freedom — это протокол прямого исходящего подключения, обычно являющийся конечной точкой обработки трафика: он принимает поступающий трафик TCP или UDP, напрямую устанавливает соединение с конечным адресом назначения и передает и принимает данные.
WARNING
Для этого outbound на стороне сервера и обратного прокси действует политика безопасности по умолчанию, которая может блокировать некоторые цели; способ разрешения см. ниже в finalRules.
OutboundConfigurationObject
OutboundConfigurationObject соответствует элементу settings в OutboundObject.
{
"outbounds": [
{
// ...
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:3366",
"userLevel": 0,
"proxyProtocol": 0,
"finalRules": [
{
"action": "block",
"network": "tcp",
"port": "22,25,465,587"
},
{
"action": "block",
"ip": ["geoip:cn"]
}
]
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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.
proxyProtocol: number
Протокол PROXY обычно используется в сочетании с redirect для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.
proxyProtocol принимает значение номера версии протокола PROXY — 1 или 2. Если не указано, по умолчанию используется значение 0 (протокол не используется).
finalRules: [ FinalRuleObject ]
Последовательно сопоставляет финальные правила Freedom и разрешает или блокирует целевые соединения.
По сравнению с блокировкой в routing, finalRules применяется на финальном этапе исходящего соединения Freedom, до и после установления соединения. Кроме того, для UDP проверяется каждый пакет при отправке и приеме, что делает проверку более строгой и полной. Сопоставление с каждым правилом занимает около 50-150 нс, поэтому беспокоиться о производительности не стоит.
Если цель — доменное имя
Если цель задана доменным именем и требуется применить правила, 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.
FinalRuleObject
{
"action": "block",
"network": "tcp,udp",
"port": "53,443",
"ip": ["10.0.0.0/8", "2001:db8::/32"],
"blockDelay": "30-90"
}2
3
4
5
6
7
Все условия сопоставления в правиле объединяются логикой 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, то есть случайное значение в пределах этого диапазона.