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
该出站的默认安全策略可能会默认阻止一些目标,需配置 `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"]
}
]
}
```
@@ -90,12 +104,46 @@ PROXY protocol 通常配合 `redirect` 重定向到开启了 PROXY protocol 协
proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不指定,默认为 `0` 不启用。
> `ipsBlocked`: [string]
> `finalRules`: \[[FinalRuleObject](#finalruleobject)\]
用于指定一组禁止连接的 IP 范围,格式与 [路由配置](../routing.md#ruleobject) 中的 IP 规则相同。
按顺序匹配 Freedom 最终出站规则,用于放行或阻止连接目标。
配置后,Freedom 会阻止连接到这些 IP 范围。常用于服务端限制直连出站,例如封锁内网地址,或阻止流量经 Freedom 直接回国。
相比在 `routing` 中封锁,`finalRules` 位于 Freedom 最终出站阶段:TCP 在解析出最终 IP 后、拨号前匹配,UDP 收发均逐包匹配,因此更严谨、更彻底;每条规则匹配耗时约 50~150ns。
如果未显式配置 `ipsBlocked`,且入站协议为 `VLESS`、`VMess`、`Trojan`、`Shadowsocks`、`Hysteria` 或 `WireGuard`,Freedom 会默认阻止私有 IP。
若未命中任何规则,则使用内置兜底规则:来自 VLESS 反向代理的流量默认阻止所有目标;来自 `VLESS`、`VMess`、`Trojan`、`Shadowsocks`、`Hysteria` 或 `WireGuard` 入站的流量默认阻止私有及保留 IP;其它情况默认放行。
相比在 `routing` 中封锁,这种方式更严谨、更彻底,且对于 UDP 会逐包匹配,每个仅耗时 50ns;如需关闭此默认策略,可显式设置 `ipsBlocked: []`。
对上述七种入站,或显式配置了 `finalRules` 时:当 Freedom 的 `domainStrategy` 为 `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"]
}
```
规则中的各匹配条件为与关系;省略某个条件时,表示对此条件不作限制。
> `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"
}
]
}
}
```