---
url: /configuration/dns/rule.md
description: DNS 查询与响应匹配，以及 DNS 动作字段
---

# DNS 规则

DNS 规则与路由规则共用域名、地址、来源、模式等匹配字段，并额外可以匹配已评估响应。匹配字段的完整语义见[路由规则](/configuration/route/rule)。

```yaml check
dns:
  servers:
    local:
      type: hosts
      hosts:
        nas.lan: 192.0.2.10
    real:
      type: udp
      address: 127.0.0.1:53
  rules:
    - {domain_suffix: [nas.lan], server: local}
    - {query_type: AAAA, action: reject}
  final: real
```

## 字段

### action

* 类型：字符串枚举。
* 默认：`route`。
* 取值：`route`、`evaluate`、`respond`、`route-options`、`reject`、`predefined`。

### server

* 类型：DNS 服务器名。
* 必填：`route`、`evaluate` 时是。
* 限制：名字必须存在。

### tag

* 类型：字符串。
* 行为：`evaluate` 保存响应时使用的标签，供后续 `match_response` 引用。

### method

* 类型：字符串枚举。
* 取值：`default`、`drop`。
* 限制：只用于 `reject`；`default` 答 `REFUSED`，`drop` 不回应。

### match_response

* 类型：`true` 或 `evaluate` 的标签。
* 默认：不匹配已评估响应。
* 行为：启用响应条件；`true` 看最近一次未打标签的响应。

### ip_accept_any

* 类型：布尔值。
* 默认：`false`。
* 行为：响应至少含一条地址记录即可匹配。

### response_rcode

* 类型：字符串枚举。
* 取值：`NOERROR`、`FORMERR`、`SERVFAIL`、`NXDOMAIN`、`NOTIMP`、`REFUSED`。

### response_answer

* 类型：记录模式或数组。
* 行为：匹配 DNS answer 区。

### response_ns

* 类型：记录模式或数组。
* 行为：匹配 DNS authority 区。

### response_extra

* 类型：记录模式或数组。
* 行为：匹配 DNS additional 区。

### rcode

* 类型：字符串枚举。
* 默认：`NOERROR`。
* 行为：`predefined` 响应的 RCODE。

### answer

* 类型：zone 文件记录字符串或数组。
* 行为：`predefined` 的 answer 区记录。

### ns

* 类型：zone 文件记录字符串或数组。
* 行为：`predefined` 的 authority 区记录。

### extra

* 类型：zone 文件记录字符串或数组。
* 行为：`predefined` 的 additional 区记录。

### rewrite_ttl

* 类型：32 位无符号整数，单位秒。
* 行为：改写响应 TTL，也决定缓存保留时间。

### disable_cache

* 类型：布尔值。
* 默认：`false`。
* 行为：不读也不写 DNS 缓存。

### strategy

* 类型：字符串枚举。
* 取值：`as_is`、`prefer_ipv4`、`prefer_ipv6`、`ipv4_only`、`ipv6_only`。
* 行为：本次查询的地址族策略，覆盖 `dns.strategy`。

### client_subnet

* 类型：IP 地址或 CIDR。
* 行为：覆盖默认 EDNS Client Subnet。

### remove_client_subnet

* 类型：布尔值。
* 默认：`false`。
* 行为：删除客户端查询自带的 ECS，不向上游透露。

### timeout

* 类型：时长。
* 行为：本次上游等待时间，覆盖 `dns.timeout`。

## 说明

`ip_cidr` 或 `ip_is_private` 没有写 `match_response` 时使用旧式响应过滤：规则必须同时 `route` 到 `server`，先问该服务器，只有响应地址满足条件才返回，否则继续后续规则。

DNS Facts 不提供 MAC、主机名、进程、用户、DSCP 和 IN-PORT，所以对应的共享匹配字段在 DNS 规则中不匹配。

## 相关

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