用夜莺监控 BIND DNS
通过 BIND 的 statistics channel(XML v3)采集查询计数、响应码、缓存和内存上下文,规则盯 SERVFAIL 升高和服务不可达。
最后校对于
BIND 插件从 Telegraf 移植,读取 named 的 statistics channel(默认 http://localhost:8053/xml/v3):收到的各类查询、按 rcode 分类的响应、递归客户端数、socket 与网络计数、各 view 的缓存状态,以及内存上下文的使用。
在 named.conf 里配置 statistics-channels 并限制访问来源。规则覆盖 SERVFAIL 和 REFUSED 比例升高、递归客户端逼近上限、查询量突降和 named 不可达。
模板里有什么
- 5 条告警规则,每条附处置步骤
- Categraf 采集配置:
input.bind
怎么接入
-
安装 Categraf,把下面的配置放到
conf/input.bind/bind.toml,按实际地址和凭据改好后重启 Categraf。启动日志里出现input: local.bind started就说明插件已加载。[[instances]]urls = [# "http://localhost:8053/xml/v3",]gather_memory_contexts = truegather_views = truetimeout = "5s"# labels={app="bind"} -
在夜莺「集成中心」里找到 Bind,把仪表盘和告警规则导入到业务组。
-
导入的告警规则默认是停用的。先确认指标已经入库,再按自己环境的阈值逐条启用。
内置告警规则
共 5 条。每条给出触发条件(PromQL)和告警后的处置步骤,导入后可以直接改阈值。
BIND 应答 SERVFAIL 占比过高
S2 警告 · 持续 5 分钟 · 触发条件:
sum without (type) (rate(bind_counter_SERVFAIL[5m])) / (sum without (type) (rate(bind_counter_Response[5m])) > 0) * 100 > 5
处置步骤:
- 执行 rndc querylog 打开查询日志(排查完记得再执行一次关闭),从 named 日志里找出集中报错的域名;
- 对该域名执行 dig +trace @127.0.0.1 <域名> 判断是上游权威不可达、DNSSEC 校验失败还是转发器故障;
- DNSSEC 失败可先用 dig +cd 验证,确认后修 trust anchor 或临时对该域配 negative-trust-anchor;
- 若是转发器问题,检查 forwarders 配置的上游可达性并切到备用 DNS。
BIND 递归客户端数逼近上限
S2 警告 · 持续 3 分钟 · 触发条件:
sum without (type) (bind_counter_RecursClients) > 900
处置步骤:
- 执行 rndc status 查看 recursive clients 的实时占用与配置上限;
- 用 dig +trace 抽查几个慢域名,判断是不是某个上游权威变慢导致递归请求堆积;
- 确认后可在 options 里调大 recursive-clients(需同步评估内存)并 rndc reload;
- 若是被恶意查询打满,配置 response-rate-limit 并在 ACL 里收紧 allow-recursion 的来源网段。
BIND 达到递归客户端上限并丢弃查询
S1 紧急 · 持续 1 分钟 · 触发条件:
sum without (type) (increase(bind_counter_RecLimitDropped[5m])) > 0
处置步骤:
- 立即执行 rndc status 确认 recursive clients 占用;
- 执行 rndc recursing 导出当前正在递归的查询列表,找出把配额吃满的域名或客户端;
- 应急先调大 recursive-clients 并 rndc reload 恢复服务;
- 事后针对定位到的域名检查上游权威健康度,或对异常来源 IP 用 allow-recursion / RRL 限制。
BIND 递归查询超时率过高
S2 警告 · 持续 5 分钟 · 触发条件:
sum without (type) (rate(bind_counter_QueryTimeout[5m])) / ((sum without (type) (rate(bind_counter_Queryv4[5m])) + sum without (type) (rate(bind_counter_Queryv6[5m]))) > 0) * 100 > 10
处置步骤:
- 执行 rndc dumpdb -all 后在 dump 文件里查看响应慢的上游服务器;
- 从 BIND 主机对常见权威做 dig @<权威IP> 与 ping/mtr,区分是上游故障还是本机出口网络丢包;
- 若是 IPv6 不通导致的超时,在 named 启动参数加 -4 或关闭 IPv6 出口查询;
- 长期可增配 forwarders 并开启 forward first,减少直接递归到权威的比例。
BIND 查询被丢弃
S2 警告 · 持续 1 分钟 · 触发条件:
sum without (type) (increase(bind_counter_QryDropped[5m])) > 0
处置步骤:
- 查看 named 日志里 client 相关的 dropped 记录,确认被丢的来源 IP 与查询名;
- 若来源是正常业务网段,检查 allow-query / allow-recursion ACL 是否漏配该网段;
- 若来源分散且查询名随机,判断为随机子域攻击,启用 response-rate-limit 并考虑加 fetches-per-zone 限制;
- 配置改完执行 named-checkconf 校验后再 rndc reload。
相关链接
- [Bind 模板源文件](https://github.com/ccfos/nightingale/tree/main/integrations/Bind):仪表盘、规则和采集配置的 JSON 原文,欢迎提 PR。
- Categraf
bind插件文档:完整配置项和指标列表。 - 导入仪表盘和告警规则
- 核对指标是否入库
- 全部集成目录