---
url: /configuration/route/rule.md
description: 路由与 DNS 共用的规则匹配字段
---

# 路由规则

一条规则先匹配流/DNS 查询的事实，再由动作决定出站、拒绝、探测、解析或 DNS 处理。未写 `type` 或写 `type: default` 是普通规则；`type: logical` 用 `mode` 和子规则组成逻辑表达式。

```yaml check
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 规则动作](/configuration/dns/rule-action)。

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

## 相关

* [路由总览](/configuration/route/)
* [路由规则动作](/configuration/route/rule-action)
* [DNS 规则](/configuration/dns/rule)
* [DNS 规则动作](/configuration/dns/rule-action)
