Direct/Freedom outbound: Add blockDelay to finalRules (30~90s by default)

This commit is contained in:
Meow
2026-05-03 09:09:55 +08:00
parent a1f2913bad
commit 9827ddf708
3 changed files with 57 additions and 18 deletions
+19 -6
View File
@@ -3,7 +3,7 @@
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
::: warning
该出站默认安全策略可能会默认阻止一些目标,需配置 `finalRules` 来放行,详见下文
该出站在服务器端和反向代理端存在默认安全策略可能会阻止一些目标,放行方式见下文 `finalRules`
:::
## OutboundConfigurationObject
@@ -108,13 +108,19 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
按顺序匹配 Freedom 最终出站规则,用于放行或阻止连接目标。
相比在 `routing` 中封锁,`finalRules` 位于 Freedom 最终出站阶段:TCP 在解析出最终 IP 后、拨号前匹配UDP 收发逐包匹配,因此更严谨、更彻底;每条规则匹配耗时约 50~150ns。
相比在 `routing` 中封锁,`finalRules` 位于 Freedom 最终出站阶段:在解析出最终 IP 后、拨号前匹配;此外 UDP 收发时还会逐包匹配,因此更严谨、更彻底;每条规则匹配耗时约 50~150ns。
若未命中任何规则,则使用内置兜底规则:来自 VLESS 反向代理的流量默认阻止所有目标;来自 `VLESS``VMess``Trojan``Shadowsocks``Hysteria` `WireGuard` 入站的流量默认阻止私有及保留 IP;其它情况默认放行
注意:只要 Freedom 需要执行 `finalRules`,当 `domainStrategy``AsIs` 且目标为域名时,Freedom 仍会先通过操作系统 DNS 将目标解析为 IP,再执行规则匹配。此时目标已不再是域名,后续的 `sockopt.domainStrategy` 及其 `happyEyeballs` 不再生效
对上述七种入站,或显式配置了 `finalRules` 时:当 Freedom 的 `domainStrategy``AsIs` 且目标为域名时,Freedom 会先将目标解析为 IP,再执行 `finalRules`。此时目标已不再是域名,后续的 `sockopt.domainStrategy` 及其 `happyEyeballs` 不再生效。
::: warning
服务器端和反向代理端存在默认兜底安全策略:
需恢复此前的行为,可仅配置一条不带任何匹配条件的 `allow` finalRules
未命中任何显式规则,则使用内置兜底规则:来自 VLESS 反向代理的流量默认阻止所有目标;来自 `VLESS``VMess``Trojan``Shadowsocks``Hysteria``WireGuard` 入站的流量默认阻止私有及保留 IP;其它流量默认全部放行
若服务器端需要允许客户端访问某些内网服务,应显式配置 `allow` 规则,并尽量只放行必要的 `network``ip``port`
若服务器端还需要依赖域名传递给 `sockopt` 的特性(例如 `sockopt.domainStrategy``happyEyeballs`),则不能继续依赖这套默认安全策略。可将第一条规则配置为不带任何匹配条件的 `allow`,以恢复此前行为;这样也等同于关闭这套默认安全策略,应自行评估安全影响。
:::
### FinalRuleObject
@@ -123,7 +129,8 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
"action": "block",
"network": "tcp,udp",
"port": "53,443",
"ip": ["10.0.0.0/8", "2001:db8::/32"]
"ip": ["10.0.0.0/8", "2001:db8::/32"],
"blockDelay": "30-90"
}
```
@@ -147,3 +154,9 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
> `ip`: \[string\]
一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。写法与 [路由规则中的 `ip`](../routing.md#ruleobject) 一致。省略时匹配所有 IP。
> `blockDelay`: string
设置阻止规则命中后的黑洞持续时间。
当规则的 `action``block` 且命中目标时,Freedom 会让连接进入黑洞状态,并在这段时间结束后关闭连接。单位为秒,可以写成固定值或范围,例如 `30``30-90`。省略时默认为 `30-90` 即此范围内随机一个值。
+19 -6
View File
@@ -3,7 +3,7 @@
Freedom is an outbound protocol used to send (normal) TCP or UDP data to any network.
::: warning
This outbound's safety policy may block some targets by default. See `finalRules` below for details.
This outbound has a default safety policy in server-side and reverse-proxy scenarios, which may block some targets. See `finalRules` below for how to allow them.
:::
## OutboundConfigurationObject
@@ -108,13 +108,19 @@ The value of `proxyProtocol` is the PROXY protocol version number. Options are `
Matches Freedom final outbound rules in order, and allows or blocks connection targets.
Compared with blocking in `routing`, `finalRules` applies at Freedom's final outbound stage: TCP is matched after the final IP is resolved and before dialing, and UDP is matched packet by packet on both send and receive, making it stricter and more thorough. Each rule match takes about 50-150 ns.
Compared with blocking in `routing`, `finalRules` applies at Freedom's final outbound stage: matching happens after the final IP is resolved and before dialing; in addition, UDP is also matched packet by packet during send and receive, making it stricter and more thorough. Each rule match takes about 50-150 ns.
If no rule is matched, the built-in fallback rule is used: traffic from the VLESS reverse proxy blocks all targets by default; traffic from `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria`, or `WireGuard` inbounds blocks private and reserved IP ranges by default; other traffic is allowed by default.
Note: whenever Freedom needs to apply `finalRules`, if `domainStrategy` is `AsIs` and the target is a domain, Freedom still resolves the target to an IP through the operating system DNS before matching rules. At that point the target is no longer a domain, so the later `sockopt.domainStrategy` and its `happyEyeballs` no longer take effect.
For the seven inbound types above, or when `finalRules` is explicitly configured: if Freedom `domainStrategy` is `AsIs` and the target is a domain, Freedom resolves the target to an IP before applying `finalRules`. At that point the target is no longer a domain, so the later `sockopt.domainStrategy` and its `happyEyeballs` no longer take effect.
::: warning
There is a default fallback safety policy for server-side and reverse-proxy scenarios:
To restore the previous behavior, configure exactly one `allow` rule in `finalRules` without any matching conditions.
If no explicit rule matches, the built-in fallback rule is used: traffic from the VLESS reverse proxy blocks all targets by default; traffic from `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria`, or `WireGuard` inbounds blocks private and reserved IP ranges by default; other traffic is fully allowed by default.
If the server needs to allow clients to access some internal services, explicitly configure `allow` rules and limit them to the necessary `network`, `ip`, and `port` whenever possible.
If the server also needs features that rely on passing the domain to `sockopt` (such as `sockopt.domainStrategy` or `happyEyeballs`), it cannot continue relying on this default safety policy. You can configure the first rule as an `allow` rule without any matching conditions to restore the previous behavior; this is also equivalent to disabling this default safety policy, so evaluate the security impact yourself.
:::
### FinalRuleObject
@@ -123,7 +129,8 @@ To restore the previous behavior, configure exactly one `allow` rule in `finalRu
"action": "block",
"network": "tcp,udp",
"port": "53,443",
"ip": ["10.0.0.0/8", "2001:db8::/32"]
"ip": ["10.0.0.0/8", "2001:db8::/32"],
"blockDelay": "30-90"
}
```
@@ -147,3 +154,9 @@ Target port range. The syntax is the same as [`port` in routing rules](../routin
> `ip`: \[string\]
An array where each item represents an IP range. The rule takes effect when an item matches the target IP. The syntax is the same as [`ip` in routing rules](../routing.md#ruleobject). If omitted, all IPs are matched.
> `blockDelay`: string
Sets how long the blackhole state lasts after a blocking rule matches.
When a rule's `action` is `block` and the target matches, Freedom puts the connection into a blackhole state and closes it after this duration expires. The unit is seconds. It can be written as a fixed value or a range, for example `30` or `30-90`. If omitted, it defaults to `30-90`, which means a random value within that range.
+19 -6
View File
@@ -3,7 +3,7 @@
Freedom — это исходящий протокол, который можно использовать для отправки (обычных) данных TCP или UDP в любую сеть.
::: warning
Политика безопасности этого outbound может по умолчанию блокировать некоторые цели. Подробности см. ниже в `finalRules`.
Для этого outbound на стороне сервера и обратного прокси действует политика безопасности по умолчанию, которая может блокировать некоторые цели; способ разрешения см. ниже в `finalRules`.
:::
## OutboundConfigurationObject
@@ -107,13 +107,19 @@ UDP-шум, используемый для отправки случайных
Последовательно сопоставляет финальные правила Freedom и разрешает или блокирует целевые соединения.
По сравнению с блокировкой в `routing`, `finalRules` применяется на финальном этапе исходящего соединения Freedom: TCP сопоставляется после разрешения конечного IP, но до дозвона, а UDP сопоставляется для каждого пакета как при отправке, так и при приеме, поэтому работает строже и надежнее. Сопоставление каждого правила занимает около 50-150 нс.
По сравнению с блокировкой в `routing`, `finalRules` применяется на финальном этапе исходящего соединения Freedom: сопоставление выполняется после разрешения конечного IP и до дозвона; кроме того, для UDP сопоставление также выполняется для каждого пакета при отправке и приеме, поэтому работает строже и надежнее. Сопоставление каждого правила занимает около 50-150 нс.
Если ни одно правило не совпало, используется встроенное резервное правило: трафик от обратного прокси VLESS по умолчанию блокирует все цели; трафик от входящих `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria` или `WireGuard` по умолчанию блокирует частные и зарезервированные диапазоны IP; прочий трафик по умолчанию разрешается.
Обратите внимание: всякий раз, когда Freedom должен применять `finalRules`, если `domainStrategy` имеет значение `AsIs`, а целью является домен, Freedom все равно сначала разрешает цель в IP через системный DNS, а затем выполняет сопоставление правил. После этого цель уже не является доменом, поэтому последующий `sockopt.domainStrategy` и связанный с ним `happyEyeballs` больше не применяются.
Для семи типов входящих соединений выше или при явной настройке `finalRules`: если `domainStrategy` Freedom имеет значение `AsIs`, а цель является доменом, Freedom сначала разрешает цель в IP, а затем применяет `finalRules`. После этого цель уже не является доменом, поэтому последующий `sockopt.domainStrategy` и связанный с ним `happyEyeballs` больше не применяются.
::: warning
На стороне сервера и обратного прокси действует резервная политика безопасности по умолчанию:
Чтобы восстановить прежнее поведение, задайте ровно одно правило `allow` в `finalRules` без каких-либо условий сопоставления.
Если ни одно явное правило не совпало, используется встроенное резервное правило: трафик от обратного прокси VLESS по умолчанию блокирует все цели; трафик от входящих `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria` или `WireGuard` по умолчанию блокирует частные и зарезервированные диапазоны IP; прочий трафик по умолчанию полностью разрешается.
Если серверу нужно разрешить клиентам доступ к некоторым внутренним сервисам, явно настройте правила `allow` и по возможности разрешайте только необходимые `network`, `ip` и `port`.
Если серверу также нужны возможности, которые зависят от передачи доменного имени в `sockopt` (например, `sockopt.domainStrategy` или `happyEyeballs`), то использовать эту политику безопасности по умолчанию дальше нельзя. Можно задать первым правило `allow` без каких-либо условий сопоставления, чтобы восстановить прежнее поведение; это также эквивалентно отключению этой политики безопасности по умолчанию, поэтому оцените последствия для безопасности самостоятельно.
:::
### FinalRuleObject
@@ -122,7 +128,8 @@ UDP-шум, используемый для отправки случайных
"action": "block",
"network": "tcp,udp",
"port": "53,443",
"ip": ["10.0.0.0/8", "2001:db8::/32"]
"ip": ["10.0.0.0/8", "2001:db8::/32"],
"blockDelay": "30-90"
}
```
@@ -146,3 +153,9 @@ UDP-шум, используемый для отправки случайных
> `ip`: \[string\]
Массив, каждый элемент которого представляет собой диапазон IP-адресов. Правило вступает в силу, если какой-либо элемент соответствует целевому IP-адресу. Синтаксис совпадает с [`ip` в правилах маршрутизации](../routing.md#ruleobject). Если опущено, совпадают все IP.
> `blockDelay`: string
Задает длительность состояния "черной дыры" после срабатывания правила блокировки.
Когда `action` правила имеет значение `block` и цель совпала, Freedom переводит соединение в состояние "черной дыры" и закрывает его после истечения этого времени. Единица измерения — секунды. Можно указать фиксированное значение или диапазон, например `30` или `30-90`. Если параметр опущен, по умолчанию используется `30-90`, то есть случайное значение в пределах этого диапазона.