Direct/Freedom outbound: Add finalRules (matches network, port and ip, then action)

This commit is contained in:
Meow
2026-04-29 00:57:08 +08:00
parent 09e8463c74
commit 122a055eb4
6 changed files with 201 additions and 27 deletions
+55 -7
View File
@@ -1,7 +1,11 @@
# Freedom (fragment, noises)
# Freedom (fragment, noises)
Freedom — это исходящий протокол, который можно использовать для отправки (обычных) данных TCP или UDP в любую сеть.
::: warning
Политика безопасности этого outbound может по умолчанию блокировать некоторые цели. Подробности см. ниже в `finalRules`.
:::
## OutboundConfigurationObject
```json
@@ -22,7 +26,17 @@ Freedom — это исходящий протокол, который можн
}
],
"proxyProtocol": 0,
"ipsBlocked": [] // Явно укажите пустой список, чтобы отключить блокировку частных IP по умолчанию
"finalRules": [
{
"action": "block",
"network": "tcp",
"port": "22,25,465,587"
},
{
"action": "block",
"ip": ["geoip:cn"]
}
]
}
```
@@ -89,12 +103,46 @@ UDP-шум, используемый для отправки случайных
`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется).
> `ipsBlocked`: [string]
> `finalRules`: \[[FinalRuleObject](#finalruleobject)\]
Используется для указания списка запрещенных диапазонов IP. Формат совпадает с IP-правилами в [Routing](../routing.md#ruleobject).
Последовательно сопоставляет финальные правила Freedom и разрешает или блокирует целевые соединения.
Если этот параметр задан, Freedom будет блокировать соединения с этими диапазонами IP. Обычно это используется на сервере для ограничения прямого исходящего трафика, например для блокировки внутренних сетей или запрета трафика в Китай напрямую через Freedom.
По сравнению с блокировкой в `routing`, `finalRules` применяется на финальном этапе исходящего соединения Freedom: TCP сопоставляется после разрешения конечного IP, но до дозвона, а UDP сопоставляется для каждого пакета как при отправке, так и при приеме, поэтому работает строже и надежнее. Сопоставление каждого правила занимает около 50-150 нс.
Если `ipsBlocked` не задан явно, а входящий протокол — `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria` или `WireGuard`, Freedom по умолчанию блокирует частные IP.
Если ни одно правило не совпало, используется встроенное резервное правило: трафик от обратного прокси VLESS по умолчанию блокирует все цели; трафик от входящих `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria` или `WireGuard` по умолчанию блокирует частные и зарезервированные диапазоны IP; прочий трафик по умолчанию разрешается.
По сравнению с блокировкой в `routing`, этот способ строже и надежнее, а для UDP проверка выполняется для каждого пакета, при этом каждая проверка занимает всего 50 нс; чтобы отключить это поведение по умолчанию, явно укажите `ipsBlocked: []`.
Для семи типов входящих соединений выше или при явной настройке `finalRules`: если `domainStrategy` Freedom имеет значение `AsIs`, а цель является доменом, Freedom сначала разрешает цель в IP, а затем применяет `finalRules`. После этого цель уже не является доменом, поэтому последующий `sockopt.domainStrategy` и связанный с ним `happyEyeballs` больше не применяются.
Чтобы восстановить прежнее поведение, задайте ровно одно правило `allow` в `finalRules` без каких-либо условий сопоставления.
### FinalRuleObject
```json
{
"action": "block",
"network": "tcp,udp",
"port": "53,443",
"ip": ["10.0.0.0/8", "2001:db8::/32"]
}
```
Все условия сопоставления в правиле объединяются логикой 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.
+12 -2
View File
@@ -135,8 +135,18 @@ outbound:
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:80",
// Переопределить политику безопасности по умолчанию и разрешить только 127.0.0.1
"ipsBlocked": ["!127.0.0.1/32"]
// Разрешить только TCP 127.0.0.1:80 и заблокировать все остальные цели
"finalRules": [
{
"action": "allow",
"network": "tcp",
"port": 80,
"ip": ["127.0.0.1/32"]
},
{
"action": "block"
}
]
}
}
```