Skip to content

路由规则 ​

一条规则先匹配流/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 predefined answer 区。

ns ​

  • 类型:zone 文件记录字符串或数组。
  • 行为:DNS predefined authority 区。

extra ​

  • 类型:zone 文件记录字符串或数组。
  • 行为:DNS predefined additional 区。

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 规则分别拒绝对自身没有意义的动作字段。

相关 ​

页面历史

开发者设计、代码地图和验证记录保留在仓库 manual/。