路由规则
一条规则先匹配流/DNS 查询的事实,再由动作决定出站、拒绝、探测、解析或 DNS 处理。未写 type 或写 type: default 是普通规则;type: logical 用 mode 和子规则组成逻辑表达式。
yaml
outbounds:
direct:
type: direct
proxy:
type: socks
server: proxy.example:1080
route:
rules:
- {domain_suffix: [internal.example], outbound: direct}
- type: logical
mode: or
rules:
- {protocol: tls}
- {port: [80, 443]}
outbound: proxy
final: direct
dns:
servers:
default: {type: udp, address: 127.0.0.1:53}
final: default字段
每个 Many<T> 字段都接受单值或数组;同一普通规则里的字段按 AND 组合,源地址、目的地址、源端口和目的端口组内各自按 OR 组合。
type
- 类型:字符串枚举。
- 默认:省略或
default表示普通规则。 - 取值:
default、logical。
mode
- 类型:字符串枚举。
- 必填:
type: logical时是。 - 取值:
and、or。
rules
- 类型:子规则数组。
- 默认:空。
- 限制:逻辑规则至少一条子规则;普通规则不能靠它表达条件。
invert
- 类型:布尔值。
- 默认:
false。 - 行为:取反整条普通规则或逻辑规则。
network
- 类型:字符串或数组。
- 取值:
tcp、udp、icmp、ip。
query_type
- 类型:DNS 查询类型名或 16 位数字,或数组。
- 名称示例:
A、AAAA、HTTPS、ANY;名称不区分大小写。
domain
- 类型:字符串或数组。
- 行为:目的地/DNS 问题名的完整、不区分大小写匹配。
domain_suffix
- 类型:字符串或数组。
- 行为:域名后缀匹配。
domain_keyword
- 类型:字符串或数组。
- 行为:域名包含任一子串。
domain_regex
- 类型:字符串或数组。
- 行为:Rust 正则匹配名称。
adguard_domain
- 类型:字符串或数组。
- 行为:按 AdGuard domain 语法解析
||example^、|example^、通配符和裸名称。
ip_cidr
- 类型:CIDR 字符串或数组。
- 行为:匹配目的地地址;DNS 规则中不加
match_response时是旧式响应过滤,必须同时route到server。
ip_is_private
- 类型:布尔值。
- 默认:
false。 - 行为:匹配私有目的地地址;DNS 响应过滤规则同
ip_cidr。
no_resolve
- 类型:布尔值。
- 默认:
false。 - 行为:地址项不先把域名解析成地址。
source_ip_cidr
- 类型:CIDR 字符串或数组。
- 行为:匹配来源地址。
source_ip_is_private
- 类型:布尔值。
- 默认:
false。 - 行为:来源地址为私有地址。
port
- 类型:
u16或数组。 - 行为:匹配目的地端口。
port_range
- 类型:
from:to字符串或数组。 - 行为:匹配目的地端口范围。
source_port
- 类型:
u16或数组。 - 行为:匹配来源端口。
source_port_range
- 类型:
from:to字符串或数组。 - 行为:匹配来源端口范围。
in_port
- 类型:
u16或数组。 - 行为:匹配客户端连接的代理监听端口;网关捕获流没有该事实。
in_port_range
- 类型:
from:to字符串或数组。 - 行为:匹配监听端口范围。
process_name
- 类型:字符串或数组。
- 行为:匹配打开本机 socket 的可执行文件名;其他来源未知。
process_path
- 类型:字符串或数组。
- 行为:精确匹配本机进程路径。
process_path_regex
- 类型:Rust 正则或数组。
- 行为:匹配本机进程路径。
user
- 类型:用户名或数组。
- 行为:在配置编译时解析成本机 UID;未知用户不匹配。
user_id
- 类型:32 位无符号整数或数组。
- 行为:匹配本机 socket 所属 UID。
auth_user
- 类型:字符串或数组。
- 行为:匹配代理客户端认证时使用的用户名。
ip_version
- 类型:整数。
- 取值:
4、6。 - 行为:DNS 规则按 A/AAAA 查询判断。
ip_protocol
- 类型:协议名、协议号或数组。
- 已知名称:
icmp、igmp、tcp、udp、gre、esp、ah、icmpv6、ipv6-icmp、ospf、pim、l2tp、sctp、udplite;其他写小于 256 的数字。
dscp
- 类型:0 到 63 的整数或数组。
- 行为:匹配流首个包的 DSCP;来源不提供 DSCP 时未知。
dscp_range
- 类型:
from:to字符串或数组。 - 范围:两端都在 0 到 63,且前不大于后。
protocol
- 类型:字符串或数组。
- 取值:嗅探可以识别的
http、tls、quic、dns、stun、dtls、ssh、bittorrent、ntp、rdp。
inbound
- 类型:入站名或数组。
- 限制:名字必须存在;捕获或 DNS 来源没有对应入站时不匹配。
source_network
- 类型:
networks名字或数组。 - 限制:名字必须存在且该网段允许 capture。
source_tenant
- 类型:
networks[*].tenant名字或数组。 - 限制:租户名必须存在。
source_mac_address
- 类型:Ethernet 地址或数组。
- 写法:六段十六进制,用冒号或连字符分隔,例如
aa:bb:cc:dd:ee:ff、aa-bb-cc-dd-ee-ff。 - 边界:DNS Facts 不提供 MAC,因此 DNS 规则中不匹配。
source_hostname
- 类型:字符串或数组。
- 行为:来自网段自己的租约、
dhcp_lease_files或邻居表;DNS 规则不提供该事实。
rule_set
- 类型:顶层
rule_sets名字或数组。 - 限制:名字必须存在。
rule_set_ip_cidr_match_source
- 类型:布尔值。
- 默认:
false。 - 行为:规则集内的地址项改看来源地址。
clash_mode
- 类型:模式名或数组。
- 行为:只在当前模式命中列出名称时成立。
package_name
- 类型:字符串或数组。
- 行为:字段被接受,但当前没有 Android 包事实,规则永不成立。
package_name_regex
- 类型:Rust 正则或数组。
- 行为:当前永不成立。
wifi_ssid
- 类型:字符串或数组。
- 行为:当前永不成立。
wifi_bssid
- 类型:字符串或数组。
- 行为:当前永不成立。
network_type
- 类型:网络类型或数组。
- 取值:
wifi、cellular、ethernet、other。 - 边界:没有本机网络事实的规则集/DNS 环境不成立。
interface_address
- 类型:接口名到 CIDR 或 CIDR 数组的映射。
- 行为:指名的本机接口持有与任一前缀重叠的地址。
network_interface_address
- 类型:网络类型到 CIDR 或 CIDR 数组的映射。
- 行为:该类型接口持有匹配地址。
default_interface_address
- 类型:CIDR 字符串或数组。
- 行为:承载默认路由的本机接口持有匹配地址。
network_is_expensive
- 类型:布尔值。
- 行为:字段被接受,但当前永不成立。
network_is_constrained
- 类型:布尔值。
- 行为:字段被接受,但当前永不成立。
action
- 类型:字符串枚举。
- 路由动作:
route、reject、hijack-dns、route-options、sniff、resolve。 - DNS 动作另见 DNS 规则动作。
outbound
- 类型:出站名。
- 默认动作:只写
outbound时等价于action: route。 - 特殊值:
PASS、PASS-RULE让规则继续下一条。
method
- 类型:字符串枚举。
- 路由取值:
default、drop、unreachable、prohibited。 - 限制:路由中只用于
reject;DNS 中的含义见 DNS 动作页。
no_drop
- 类型:布尔值。
- 默认:
false。 - 限制:只用于
action: reject,且只能用默认 reset/refused;拒绝洪泛时仍保持回应。
override_address
- 类型:IP 地址。
- 行为:
route-options替换目的地地址。
override_port
- 类型:
u16。 - 行为:
route-options替换目的地端口。
udp_timeout
- 类型:时长。
- 行为:
route-options设置 UDP 会话空闲时间。
udp_disable_domain_unmapping
- 类型:布尔值。
- 默认:
false。 - 行为:UDP 应答按回答地址返回,而不是原域名映射。
tls_fragment
- 类型:布尔值。
- 默认:
false。 - 行为:
route-options把首个 TLS 记录拆成多个等待确认的 TCP 段。
tls_fragment_fallback_delay
- 类型:时长。
- 行为:TLS 分片看不到确认时的回退等待。
tls_record_fragment
- 类型:布尔值。
- 默认:
false。 - 行为:把 ClientHello 拆成多条 TLS 记录。
sniffer
- 类型:协议名或数组。
- 默认:全部嗅探器。
- 限制:只用于
action: sniff。
timeout
- 类型:时长。
- 行为:
sniff的等待时间,或resolve/DNS 上游的等待时间。
strategy
- 类型:字符串枚举。
- 取值:
as_is、prefer_ipv4、prefer_ipv6、ipv4_only、ipv6_only。 - 行为:
resolve或 DNS 查询的地址族顺序。
server
- 类型:DNS 服务器名。
- 行为:DNS 默认
route动作的目标,或路由resolve动作直接询问的服务器。
tag
- 类型:字符串。
- 行为:DNS
evaluate给保存的响应打标签。
match_response
- 类型:
true或已评估响应的标签。 - 默认:不匹配响应。
- 行为:让
ip_cidr、ip_is_private、response_*和ip_accept_any针对 DNS 响应。
ip_accept_any
- 类型:布尔值。
- 默认:
false。 - 行为:DNS 响应至少含一条地址记录即可匹配。
response_rcode
- 类型:RCODE 字符串。
- 取值:
NOERROR、FORMERR、SERVFAIL、NXDOMAIN、NOTIMP、REFUSED。
response_answer
- 类型:记录模式或数组。
- 行为:匹配 DNS answer 区。
response_ns
- 类型:记录模式或数组。
- 行为:匹配 DNS authority 区。
response_extra
- 类型:记录模式或数组。
- 行为:匹配 DNS additional 区。
rcode
- 类型:RCODE 字符串。
- 默认:
NOERROR。 - 行为:DNS
predefined响应码。
answer
- 类型:zone 文件记录字符串或数组。
- 行为:DNS
predefinedanswer 区。
ns
- 类型:zone 文件记录字符串或数组。
- 行为:DNS
predefinedauthority 区。
extra
- 类型:zone 文件记录字符串或数组。
- 行为:DNS
predefinedadditional 区。
rewrite_ttl
- 类型:32 位无符号整数,单位秒。
- 行为:改写 DNS 响应 TTL,也决定缓存保留时间。
disable_cache
- 类型:布尔值。
- 默认:
false。 - 行为:DNS/resolve 不读缓存,也不写缓存。
client_subnet
- 类型:IP 地址或 CIDR。
- 行为:随 DNS 查询发送 EDNS Client Subnet;裸 IPv4 视为
/24,裸 IPv6 视为/56。
remove_client_subnet
- 类型:布尔值。
- 默认:
false。 - 行为:去掉客户端查询已有的 ECS;只用于 DNS 规则。
说明
普通规则中一个字段都没写时是 Match,即直接成立。逻辑规则的 mode、子规则和 invert 仍由同一 RuleSpec 解析。
以下字段虽被 serde 接受,但当前编译成永不成立:package_name、package_name_regex、wifi_ssid、wifi_bssid、network_is_expensive、network_is_constrained。
DNS Facts 不提供进程、用户、DSCP、MAC、主机名和 IN-PORT,所以这些条件在 DNS 规则中不匹配。路由规则与 DNS 规则分别拒绝对自身没有意义的动作字段。