本页目录

DNS 操作手册

dig

dig example.com                                     # 基础 A 记录查询
dig example.com +short                              # 只输出 IP
dig example.com A                                   # 指定类型
dig example.com AAAA                                # IPv6
dig example.com MX                                  # 邮件服务器
dig example.com NS                                  # 权威 DNS 服务器
dig example.com ANY                                 # 所有记录 (某些服务器忽略)
dig @8.8.8.8 example.com                            # 指定 DNS server

dig +trace example.com                              # 从 Root 开始递归 (看整条解析链)
dig -x 8.8.8.8                                      # PTR: IP → hostname
dig example.com +dnssec                             # 含 DNSSEC RRSIG

# 输出解读:
# ;; ANSWER SECTION:     实际回答
# ;; AUTHORITY SECTION:  NS records (谁有权回答)
# ;; ADDITIONAL SECTION: NS 的 IP (glue records)
# ;; Query time: 12 msec
# ;; SERVER: 127.0.0.1#53

记录类型速查

A:      IPv4
AAAA:   IPv6
CNAME:  别名 (canonical name) — 注意: CNAME 不能与其他类型共存
MX:     邮件服务器 (priority + hostname)
NS:     权威 DNS 服务器
SOA:    权威起始 (zone serial, refresh/retry/expire, admin email)
TXT:    文本 (SPF, DKIM, DMARC, 验证 token)
SRV:    服务定位 (_service._proto.name → host:port)
PTR:    反向查询 (IP → name)
CAA:    限制 CA 签发 (0 issue "letsencrypt.org")

云 API 操作

# 阿里云 (aliyun CLI)
aliyun alidns DescribeDomainRecords --DomainName example.com
aliyun alidns AddDomainRecord --DomainName example.com --RR www --Type A --Value 1.2.3.4
aliyun alidns UpdateDomainRecord --RecordId <id> --RR www --Value 2.3.4.5
aliyun alidns DeleteDomainRecord --RecordId <id>

# Cloudflare (API)
curl -X GET "https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records?type=A" \
  -H "Authorization: Bearer <api_token>"

DNSSEC

# 查看 DNSSEC 信任链
delv @8.8.8.8 example.com                          # 完整验证 (含失败原因)
dig +dnssec example.com | grep RRSIG               # 看签名记录
# 检查 DS record (parent zone 中)
dig DS example.com

加密 DNS 测试

# DoT (DNS over TLS, port 853)
kdig @1.1.1.1 +tls-ca example.com

# DoH (DNS over HTTPS, port 443)
kdig @1.1.1.1 +https example.com
curl -H 'Accept: application/dns-json' 'https://1.1.1.1/dns-query?name=example.com&type=A'

# DoQ (DNS over QUIC, port 853)
kdig @1.1.1.1 +quic example.com

故障排查

# 解析不到 / 解析到错误的 IP
dig example.com +short                              # 先看返回了什么
dig +trace example.com                              # 哪一步断了?
dig @8.8.8.8 example.com vs dig @223.5.5.5 example.com  # 对比国内外

# DNS 污染 (GFW 投毒)
# → 对比不同 resolver 的应答
# → 如果 @8.8.8.8 返回正常, 但本地返回假 IP → 本地 DNS 被劫持

# 本地缓存
systemd-resolve --statistics                       # systemd-resolved 缓存
systemd-resolve --flush-caches                      # 清缓存

# 检查本机 DNS 配置
cat /etc/resolv.conf
resolvectl status