DNS_Query 插件
本文介绍监控数据采集器 Categraf 的 dns 采集插件与配置
插件概述
DNS_Query 插件是一个用于监控 DNS 服务器性能和可用性的监控插件。它可以定期向指定的 DNS 服务器发送查询请求,测量响应时间,检测查询结果,并监控域名劫持等安全问题。
工作原理
插件通过以下步骤进行 DNS 监控:
- DNS 查询执行:向配置的 DNS 服务器发送指定类型的域名查询请求
- 响应时间测量:记录 DNS 查询的往返时间(RTT)
- 结果分析:解析 DNS 响应,提取 IP 地址信息
- 状态判断:根据响应码(rcode)判断查询是否成功
- 域名劫持检测:对比实际响应 IP 与期望 IP 列表,检测潜在的域名劫持(企业版v0.4.20及以上版本)
配置
[[instances]]
auto_detect_local_dns_server = false # 是否自动检测本地 DNS 服务器。当设置为 true 时,插件会从 /etc/resolv.conf 文件中读取本地配置的 DNS 服务器
servers = ["114.114.114.114"] # 要查询的 DNS 服务器列表
network = "udp" # 查询使用的协议 udp还是tcp
domains = ["flashcat.cloud"] # 要查询的域名列表
record_type="NS" # DNS 查询的记录类型
port = 53 # DNS 服务器端口号
timeout = 2 DNS 查询超时时间(秒)
expect_query_ips = { "域名" = ["IP1", "IP2", ...] } # 用于域名劫持检测的期望 IP 地址配置
配置文件在 conf/input.dns_query/dns_query.toml。
record_type 支持以下类型:
- A:IPv4 地址记录,返回域名对应的 IPv4 地址
- AAAA:IPv6 地址记录,返回域名对应的 IPv6 地址
- CNAME:别名记录,返回域名的规范名称
- MX:邮件交换记录,返回邮件服务器信息
- NS:名称服务器记录,返回域名的权威 DNS 服务器
- PTR:指针记录,用于反向 DNS 查询(IP 地址到域名)
- TXT:文本记录,返回与域名关联的文本信息
- SOA:起始授权机构记录,返回域名的权威信息
- SPF:发送方策略框架记录,用于邮件防伪
- SRV:服务记录,指定服务的位置信息
- ANY:任意记录类型,返回所有可用的记录
expect_query_ips 需要满足一下条件
- 只有当 record_type 为 A 或 AAAA 时才有效
- IP 列表应该尽可能完整,包含该域名的所有合法 IP 地址
- 建议定期更新 IP 列表以确保准确性
产生的指标示例
dns_query_rcode_value{agent_hostname="localhost",domain="baidu.com",record_type="A",server="114.114.114.114"} 0
dns_query_result_code{agent_hostname="localhost",domain="baidu.com",record_type="A",server="114.114.114.114"} 0
dns_query_query_time_ms{agent_hostname="localhost",domain="baidu.com",record_type="A",server="114.114.114.114"} 19.482583
其中dns_query_time_ms 表示查询的响应时间,单位ms; dns_query_result_value是categraf自定义的查询结果,0表示成功,1表示超时,2表示出错了。
当expect_query_ips配置了对应的域名后, categraf会对比响应的IP列表与配置的IP列表, 此时会产生新的指标 dns_query_status_change, 0 表示响应的IP与期望的IP一致, 1表示响应的IP与期望的IP出现差异。 当出现差异时,会生成新的指标 dns_query_status_change_detail{ips="响应的IP列表", diff="响应IP列表-期望IP列表"} 1
dns_query_status_change{agent_hostname="localhost",domain="baidu.com",record_type="A",server="114.114.114.114"} 1
dns_query_status_change_detail{agent_hostname="localhost",diff="182.61.201.211",domain="baidu.com",ips="182.61.201.211,182.61.244.181",record_type="A",server="114.114.114.114"} 1
dns_query_rcode_value 是 DNS 响应中的状态码,表示查询请求的处理结果:
- 0 (NOERROR):查询成功,没有错误
- 1 (FORMERR):格式错误,DNS 服务器无法理解查询请求
- 2 (SERVFAIL):服务器失败,DNS 服务器遇到内部错误
- 3 (NXDOMAIN):域名不存在
- 4 (NOTIMP):查询类型不被支持
- 5 (REFUSED):查询被拒绝,通常是策略原因 在监控中,RCODE 为 0 表示查询成功,其他值通常表示存在问题需要关注
对于其他RCODE含义,可以参考DNS参数.
DNS RCODE是IANA(Internet Assigned Numbers Authority,互联网号码分配机构) 来定义的。
问题排查参考