mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2026-09-22 22:38:05 +03:00
Direct/Freedom outbound: Add finalRules (matches network, port and ip, then action)
This commit is contained in:
@@ -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
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
# Freedom (fragment, noises)
|
||||
# Freedom (fragment, noises)
|
||||
|
||||
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.
|
||||
:::
|
||||
|
||||
## OutboundConfigurationObject
|
||||
|
||||
```json
|
||||
@@ -22,7 +26,17 @@ Freedom is an outbound protocol used to send (normal) TCP or UDP data to any net
|
||||
}
|
||||
],
|
||||
"proxyProtocol": 0,
|
||||
"ipsBlocked": [] // Set explicitly to empty to disable default private IP blocking
|
||||
"finalRules": [
|
||||
{
|
||||
"action": "block",
|
||||
"network": "tcp",
|
||||
"port": "22,25,465,587"
|
||||
},
|
||||
{
|
||||
"action": "block",
|
||||
"ip": ["geoip:cn"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
@@ -90,12 +104,46 @@ PROXY protocol is usually used with `redirect` to redirect traffic to Nginx or o
|
||||
|
||||
The value of `proxyProtocol` is the PROXY protocol version number. Options are `1` or `2`. If not specified, it defaults to `0` (disabled).
|
||||
|
||||
> `ipsBlocked`: [string]
|
||||
> `finalRules`: \[[FinalRuleObject](#finalruleobject)\]
|
||||
|
||||
Used to specify a list of blocked IP ranges. The format is the same as the IP rules in [Routing](../routing.md#ruleobject).
|
||||
Matches Freedom final outbound rules in order, and allows or blocks connection targets.
|
||||
|
||||
When configured, Freedom blocks connections to these IP ranges. This is commonly used on servers to restrict direct outbound access, such as blocking private networks or preventing traffic from going to China directly through Freedom.
|
||||
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.
|
||||
|
||||
If `ipsBlocked` is not explicitly configured, and the inbound protocol is `VLESS`, `VMess`, `Trojan`, `Shadowsocks`, `Hysteria`, or `WireGuard`, Freedom will block private IPs by default.
|
||||
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.
|
||||
|
||||
Compared to blocking in `routing`, this approach is stricter and more thorough, and for UDP it matches packet by packet, with each match taking only 50 ns; to disable this default behavior, explicitly set `ipsBlocked: []`.
|
||||
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.
|
||||
|
||||
To restore the previous behavior, configure exactly one `allow` rule in `finalRules` without any matching conditions.
|
||||
|
||||
### FinalRuleObject
|
||||
|
||||
```json
|
||||
{
|
||||
"action": "block",
|
||||
"network": "tcp,udp",
|
||||
"port": "53,443",
|
||||
"ip": ["10.0.0.0/8", "2001:db8::/32"]
|
||||
}
|
||||
```
|
||||
|
||||
All matching conditions in a rule are combined with AND logic. If a condition is omitted, that condition is not restricted.
|
||||
|
||||
> `action`: "allow" | "block"
|
||||
|
||||
Defines the action to take when the rule matches.
|
||||
|
||||
- `allow`: Allows the target.
|
||||
- `block`: Blocks the target.
|
||||
|
||||
> `network`: "tcp" | "udp" | "tcp,udp"
|
||||
|
||||
Matches the network type. The rule takes effect when the connection method matches. It can also be written as a string array, such as `["tcp", "udp"]`. If omitted, all networks are matched.
|
||||
|
||||
> `port`: number | string
|
||||
|
||||
Target port range. The syntax is the same as [`port` in routing rules](../routing.md#ruleobject). If omitted, all ports are matched.
|
||||
|
||||
> `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.
|
||||
|
||||
@@ -135,8 +135,18 @@ Outbounds:
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"redirect": "127.0.0.1:80",
|
||||
// Override the default safe policy to allow only 127.0.0.1
|
||||
"ipsBlocked": ["!127.0.0.1/32"]
|
||||
// Allow only TCP 127.0.0.1:80 and block all other targets
|
||||
"finalRules": [
|
||||
{
|
||||
"action": "allow",
|
||||
"network": "tcp",
|
||||
"port": 80,
|
||||
"ip": ["127.0.0.1/32"]
|
||||
},
|
||||
{
|
||||
"action": "block"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user