# DNS Checker

`type: dns` 支持两种解析模式：本机解析器检查和指定 DNS server 协议级检查。

## resolver 模式

| 模式     | 说明                                                                          |
| -------- | ----------------------------------------------------------------------------- |
| `system` | 使用本机 DNS 解析器检查域名是否能解析到预期地址                               |
| `server` | 直接向指定 DNS server 发起 UDP/TCP 深度拨测，检查 RCODE、TTL、flags、记录值等 |

## `dns.resolver: system` 配置项

| 字段           | 说明                          | 必填 | 默认值   |
| -------------- | ----------------------------- | ---- | -------- |
| `dns.resolver` | 解析模式                      | 是   | `system` |
| `dns.name`     | 待解析域名                    | 是   | 无       |
| `dns.family`   | 地址族：`any`、`ipv4`、`ipv6` | 否   | `any`    |

### system 模式 expect

| 字段         | 说明                 | 断言模型                          |
| ------------ | -------------------- | --------------------------------- |
| `values`     | 解析结果地址集合断言 | DNS 集合（include/exclude/exact） |
| `valueCount` | 解析结果数量         | ValueMatcher                      |
| `durationMs` | 解析耗时             | ValueMatcher                      |

```yaml
- id: "dns-system-api"
  name: "本机 DNS 解析"
  type: dns
  dns:
    resolver: system
    name: "api.example.com"
    family: any
  expect:
    values:
      exact:
        - "203.0.113.10"
    durationMs:
      lte: 500
```

## `dns.resolver: server` 配置项

| 字段                   | 说明                              | 必填 | 默认值   |
| ---------------------- | --------------------------------- | ---- | -------- |
| `dns.resolver`         | 解析模式                          | 是   | `server` |
| `dns.server`           | DNS server 地址                   | 是   | 无       |
| `dns.name`             | 查询域名                          | 是   | 无       |
| `dns.port`             | DNS server 端口                   | 否   | `53`     |
| `dns.protocol`         | 传输协议：`udp`、`tcp`            | 否   | `udp`    |
| `dns.recordType`       | DNS 记录类型                      | 否   | `A`      |
| `dns.recursionDesired` | 是否设置 RD flag                  | 否   | `true`   |
| `dns.tcpFallback`      | UDP 响应 TC=1 时是否 TCP fallback | 否   | `true`   |
| `dns.maxResponseBytes` | 响应最大字节数                    | 否   | `4KB`    |

`recordType` 可选值：`A`、`AAAA`、`CNAME`、`NS`、`MX`、`TXT`、`SOA`、`SRV`、`CAA`、`PTR`。

### server 模式 expect

| 字段                 | 说明                               | 断言模型                          |
| -------------------- | ---------------------------------- | --------------------------------- |
| `responded`          | 是否收到 DNS response              | boolean                           |
| `rcode`              | 期望 RCODE 列表，如 `NOERROR`      | string[]                          |
| `values`             | 目标类型记录值集合断言             | DNS 集合（include/exclude/exact） |
| `valueCount`         | 目标类型记录数量                   | ValueMatcher                      |
| `answerCount`        | answer section 总记录数            | ValueMatcher                      |
| `ttlMin`             | answer 中最小 TTL                  | ValueMatcher                      |
| `ttlMax`             | answer 中最大 TTL                  | ValueMatcher                      |
| `authoritative`      | AA flag                            | boolean                           |
| `recursionAvailable` | RA flag                            | boolean                           |
| `truncated`          | TC flag                            | boolean                           |
| `authenticatedData`  | AD flag                            | boolean                           |
| `result`             | 完整结构化响应的 JSONPath 兜底断言 | ContentExpectations               |
| `durationMs`         | 完整查询耗时                       | ValueMatcher                      |

```yaml
- id: "dns-server-api"
  name: "Cloudflare DNS A 记录"
  type: dns
  dns:
    resolver: server
    server: "1.1.1.1"
    name: "api.example.com"
    recordType: A
  expect:
    rcode: ["NOERROR"]
    values:
      include:
        - "203.0.113.10"
    ttlMin:
      gte: 60
    durationMs:
      lte: 200
```

## 注意事项

- 未配置 expect 时，`system` 模式默认要求解析成功且 `valueCount > 0`，`server` 模式默认要求 `NOERROR + valueCount > 0`。
- 显式配置非 `NOERROR` rcode（如 `NXDOMAIN`）时，不自动要求 `valueCount > 0`。
- `values.exact` 忽略返回顺序。
- 对 A/AAAA 查询，CNAME 链不计入 `values`，单独放入 `cnameChain`。
- `values` 按记录类型规范化为字符串，例如 MX 为 `"10 mail.example.com"`，SRV 为 `"10 60 443 server.example.com"`。
