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

Linux 系统中 DNS 监控与日志分析的核心目标是快速识别解析异常、定位故障源头、发现潜在攻击(如 DNS 劫持、放大攻击、域名扫描),并保障业务连续性。关键不在于堆砌工具,而在于建立“查询可观测 → 日志可追溯 → 行为可研判”的闭环。
DNS 查询实时监控:看清谁在查、查什么、查得是否成功
使用 tcpdump 或 dnstop 可捕获本地或上游 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: yes和log-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 日志中,需单独部署拦截或终端侧采集。










