Linux DNS 监控与日志分析

5次阅读

linux dns监控与日志分析核心是构建“查询可观测→日志可追溯→行为可研判”闭环,涵盖实时抓包、详细日志启用、结构化分析、动态基线告警及真实ip识别。

Linux DNS 监控与日志分析

Linux 系统中 DNS 监控与日志分析的核心目标是快速识别解析异常、定位故障源头、发现潜在攻击(如 DNS 劫持、放大攻击、域名扫描),并保障业务连续性。关键不在于砌工具,而在于建立“查询可观测 → 日志可追溯 → 行为可研判”的闭环。

DNS 查询实时监控:看清谁在查、查什么、查得是否成功

使用 tcpdumpdnstop 可捕获本地或上游 DNS 流量。对生产服务器,推荐轻量级、低开销方式:

  • tcpdump -i any port 53 -w dns.pcap -G 300 每5分钟滚动抓包,避免磁盘撑爆;配合 dig @127.0.0.1 example.com +short 验证本机解析路径是否正常
  • dnstop -l 4 eth0 实时查看 TOP 域名、TOP 客户端 IP、响应码分布(如大量 NXDOMAIN 可能是恶意扫描)
  • 若使用 systemd-resolved,可通过 resolvectl statistics 查看缓存命中率、平均响应延迟,命中率持续低于 60% 需检查缓存配置或上游稳定性

DNS 服务日志采集:确保关键字段不丢失

bind、unbound、coredns 等服务默认日志较简略,需显式启用详细查询日志(Query Log),并规范输出格式:

  • Bind9:在 named.conf 中添加 channel query_log { file "/var/log/named/query.log" versions 3 size 100m; severity info; print-time yes; print-category yes; }; category queries { query_log; };
  • Unbound:启用 log-queries: yeslog-replies: yes,日志含客户端 IP、查询域名、类型(A/AAAA)、响应码(NOERROR/NXDOMAIN/REFUSED)
  • 务必关闭日志中的敏感信息(如完整客户端子网),用 log-servfail: no 或过滤规则避免泄露内部结构

日志结构化分析:从原始文本到有效洞察

原始日志难以人工排查,应通过脚本或轻量工具完成归类与聚合:

  • awk '{print $NF}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -20 快速找出高频查询域名(突增可能意味爬虫或配置错误)
  • 统计异常响应:如 grep "NXDOMAIN" /var/log/named/query.log | awk '{print $3}' | sort | uniq -c | sort -nr 找出反复查不存在域名的客户端 IP
  • 结合时间窗口分析:用 journalctl -u named --since "2 hours ago" | grep -E "(SERVFAIL|REFUSED)" 判断是否集中发生,辅助判断是上游故障还是本地策略拦截

自动化告警与基线对比:让监控真正起作用

仅看日志不够,需设定动态基线并触发动作:

  • 每10分钟统计 servfail 数量,若超过过去24小时均值的3倍且持续2个周期,发企业微信/钉钉告警
  • 对特定高危行为建规则:如单 IP 1分钟内发起 >50 次不同子域名 A 记录查询(疑似域名爆破),自动加入防火墙临时黑名单
  • logrotate 配合 postrotate 脚本,在日志轮转后自动触发一次简单聚合,生成摘要邮件(如“今日 NXDOMAIN 上升40%,主要来自 192.168.10.5”)

不复杂但容易忽略:DNS 日志默认不记录客户端真实 IP(尤其经代理或 NAT 后),需确认服务配置了 edns-client-subnet 或前端已透传 X-forwarded-For;另外,加密 DNS(DoH/DoT)流量不会出现在传统端口 53 日志中,需单独部署拦截或终端侧采集。

text=ZqhQzanResources