1. 环境准备与前置条件
- 确认访问权限:需要DNS服务器(如BIND/unbound/powerdns)与站群节点的root或有sudo权限的账号。
- 准备工具:tcpdump、tshark、dnstop、dig、whois、geoiplookup或mmdblookup、awk、jq、grep、sed、chronyc/date。
- 时区与时间同步:
日本站群多在JST(UTC+9),确保NTP/chrony同步,便于跨日志对齐。命令示例:sudo timedatectl set-timezone Asia/Tokyo;sudo chronyc tracking。
2. 开启与采集DNS查询日志(递归/权威)
- BIND(named):在named.conf加入 logging 部分或在options打开 querylog。示例:options { querylog yes; }; 重启服务:sudo systemctl restart bind9。日志路径通常/var/log/syslog或/var/log/named/query.log。
- Unbound:在unbound.conf设置 verbosity: 1 并开启 log-queries: yes。重启:sudo systemctl restart unbound。日志文件同系统日志。
- PowerDNS Recursor:在recursor.conf中设置 log-dns-queries=yes。
- 线上无法修改配置时,用抓包:sudo tcpdump -n -s0 -w dns_jp.pcap port 53 and host
或者抓客户端到递归器的流量。
3. 使用tcpdump/tshark做实时抓包与快速筛选
- 实时查看域名查询:sudo tcpdump -n -s0 -A 'udp port 53 and (src net 0/0 or dst net 0/0)' | grep -i 'example.com'。
- 保存pcap后用tshark解析:tshark -r dns_jp.pcap -Y "dns.qry.name contains \"yourdomain.jp\"" -T fields -e frame.time -e ip.src -e dns.qry.name -e dns.resp.type。
- 统计高频查询IP/域名:tshark -r dns_jp.pcap -Y "dns" -T fields -e ip.src -e dns.qry.name | awk '{print $1}' | sort | uniq -c | sort -nr | head。
4. 日志过滤与快速定位异常模式
- 关键字段:时间戳、客户端IP、查询名、查询类型(TXT/A/AAAA/ANY)、返回码(RCODE)、响应大小、EDNS、DO位。
- 常见异常特征:大量NXDOMAIN(误扫或字典爆破)、大量ANY或TXT(放大攻击探针)、持续同一客户端短时间内高频查询(机器/代理)、伪造源IP(放大)。
- 使用命令示例过滤某域:grep 'yourdomain.jp' /var/log/named/query.log | awk '{print $1,$5,$7,$8}' | sort | uniq -c | sort -nr。
5. 关联DNS日志与站群Web访问日志(实操步骤)
- 步骤1:从DNS日志提取可疑客户端IP时间窗口。示例:awk '/yourdomain.jp/ && /NXDOMAIN/ {print $1,$5}' query.log > suspects.txt。
- 步骤2:在Web服务器(nginx/apache)上按时间和IP查访问:grep "IP" access.log | awk '{print $1,$4,$7,$9}'。用时间窗口交叉比对(可用python/pandas或awk处理时间)。
- 步骤3:若IP未直接访问站点,检查是否为解析到恶意CNAME或第三方托管,使用dig +noall +answer 被查询的域名,确认A记录指向并进一步whois/geoip。
6. 进阶分析:利用geo/whois/ASN与批量脚本自动化
- 批量获取地理和ASN信息:cat ips.txt | xargs -n1 -I{} sh -c "echo {}; mmdblookup --file /usr/share/GeoIP/GeoLite2-City.mmdb --ip {} | grep -E 'country_name|autonomous_system_number'".
- 自动化脚本(示例流程):1) 提取Top N可疑IP;2) whois并判定是否云/托管商;3) 若为云提供商短时间内大量请求考虑放入黑名单或rate-limit。
- 检查EDNS客户端子网(ECS)与CDN影响:dns日志中有EDNS字段时注意真实来源可能被掩盖,需结合recursor日志或上游解析器查看。
7. 处置建议:限流、RPZ、iptables与DNS层阻断实操
- DNS层RPZ(Response Policy Zone):在BIND中配置RPZ,针对恶意域或IP返回NXDOMAIN或重定向到黑洞。示例添加zone "rpz.local" { type master; file "rpz.zone"; }; 并在options中设置 response-policy { zone "rpz.local"; };
- iptables限速:sudo iptables -A INPUT -p udp --dport 53 -m recent --set;sudo iptables -A INPUT -p udp --dport 53 -m recent --rcheck --seconds 1 --hitcount 50 -j DROP。注意影响合法解析需谨慎调整。
- Web层防护:在nginx配置limit_req按IP限速,并在WAF/防火墙中添加异常IP/ASN封禁规则。
8. 常用命令速查清单(可直接复制执行)
- 抓包并筛选域名:sudo tcpdump -s0 -nn -w - port 53 | strings | grep yourdomain.jp。
- pcap解析按时间统计:tshark -r dns_jp.pcap -Y "dns.qry.name contains \"yourdomain.jp\"" -T fields -e frame.time_epoch -e ip.src -e dns.qry.name | awk '{print strftime("%Y-%m-%d %H:%M",$1),$2,$3}'。
- 统计查询类型分布:grep 'yourdomain.jp' query.log | awk '{print $NF}' | sort | uniq -c | sort -nr。
9. 监控与告警:构建持续检测体系
- 指标设定:QPS、独立客户端IP数、NXDOMAIN比率、平均响应时间、EDNS异常比率。
- 告警阈值示例:1分钟内客户端数暴增>5x常态或NXDOMAIN比例>30%触发告警。
- 集成Prometheus+Grafana:使用Exporter定时解析dns日志,将指标上报Prometheus,设置Grafana面板和Alertmanager阈值。
10. 常见问:如何快速判断是否为放大型DDoS?
问:如何从DNS日志快速判断是否为DNS放大攻击?
答:观察短时间内来自大量不同源IP对ANY或TXT/AXFR(若有)查询且返回包明显大于查询包(响应大)、或查询到开放递归且返回大报文时,可怀疑放大。配合网络流量监控(接口流入带宽激增)和tshark抓包确认响应体积即可确认。
11. 常见问:日本节点特有注意事项是什么?
问:针对日本站群有什么特别需要关注的点?
答:注意JST时区对日志对齐(UTC+9),日本本地ISP/云商(如Sakura、IIJ、SoftBank、KDDI)与你站群的常见ASN需建立白名单,关注日语关键词的爬虫/扫描,以及与日本法律合规相关的数据保留与回溯要求。
12. 常见问:若误判封禁如何回滚?
问:万一把正常用户/解析误封了,如何快速回滚?
答:1) DNS层RPZ回滚:注释掉对应rpz条目并rndc reload bind; 2) iptables回滚:sudo iptables -D ... 删除规则;3) 若启用CDN或WAF,立刻解除对应规则并回滚限流,事后通过日志回放分析误封原因并调整阈值与白名单策略。
来源:解析日本站群服务器dns日志定位访问异常的实操方法