DNS被污染了怎么排查是哪个节点出的问题
DNS被污染了,别急着改解析,先把链路拆开看
DNS问题最麻烦的地方在于,表面现象都很像:域名打不开、解析到奇怪IP、部分地区访问正常、部分地区访问异常、换个DNS又好了。实际排查时不能只盯着控制台里的解析记录,因为用户拿到的结果不一定来自权威DNS,中间可能经过了本机缓存、运营商Local DNS、公共递归DNS、EDNS Client Subnet、DNS劫持设备,甚至还有应用自己的DNS缓存。
现场处理这类问题,一般先把“谁给了错误答案”找出来。不要一上来就把A记录删了重加,也不要马上切CDN。DNS链路拆开后,大概是这样:
客户端应用 → 系统DNS缓存 → 本地配置的Resolver → 运营商/公共递归DNS → 权威DNS → 返回结果 → 应用连接目标IP。
污染可能发生在任何一段。所谓“污染”,在排障里不要只理解成被解析到黑洞IP,有时候表现为NXDOMAIN,有时候是返回旧记录,有时候是只污染UDP 53,有时候TCP 53正常,有时候DoH正常但传统DNS异常。
先确认是不是DNS问题,而不是网络或应用问题
用IP直连把DNS从链路里拿掉
如果业务是HTTP/HTTPS,先拿到一个确认可用的源站IP或CDN节点IP,用curl指定Host测试。
命令可以这样看:curl -v --resolve example.com:443:1.2.3.4 https://example.com/
如果指定IP后访问正常,而直接访问域名异常,DNS嫌疑就很大。如果指定IP也不通,那就先别纠结DNS,去查路由、端口、防火墙、源站服务、SNI证书、WAF策略。
这里补充一点,HTTPS站点不要简单用浏览器访问IP判断,因为证书和SNI会影响结果。curl的--resolve比直接访问IP更接近真实业务请求。
看异常返回到底是什么类型
DNS异常不要只说“解析错了”,要记录具体返回。常见几种:
返回了陌生A记录:例如权威DNS配置是203.0.113.10,用户解析到198.51.100.8。这种更像递归DNS缓存异常、运营商污染、劫持或某个CDN调度异常。
返回NXDOMAIN:域名明明存在,但某些DNS说不存在。可能是递归DNS污染,也可能是权威DNS链路不可达后被错误缓存。
返回SERVFAIL:常见于DNSSEC、权威DNS不可达、递归DNS校验失败。
超时:可能是UDP 53被拦、权威DNS被打、递归DNS到权威的链路异常,也可能是本地网络策略问题。
TTL异常:权威设置TTL 60秒,但递归侧返回TTL 86400,这种要特别留意缓存污染或中间设备伪造响应。
从用户机器开始查,不要跳过本地缓存
本机DNS缓存经常背锅,也经常真有问题
实际使用中发现,很多“DNS污染”最后是在用户侧机器解决的。Windows有DNS Client缓存,macOS有mDNSResponder,Linux上可能有systemd-resolved、nscd、dnsmasq,容器里还可能走CoreDNS。
Windows查看缓存:ipconfig /displaydns
Windows清缓存:ipconfig /flushdns
macOS清缓存:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Linux如果是systemd-resolved:resolvectl flush-caches,然后用resolvectl statistics看缓存情况。
如果清缓存后立刻恢复,说明问题可能不在本机缓存。如果清缓存后短时间正常,过一会又异常,要看本机使用的上游Resolver是谁,以及是否有代理软件、杀毒软件、网关DNS劫持。
确认机器实际用的是哪个DNS
不要只看网络面板里配置的DNS,很多环境会被VPN、代理、DHCP、容器网络改掉。
Linux看:cat /etc/resolv.conf,另外再看 resolvectl status。
Windows看:ipconfig /all。
macOS看:scutil --dns。
如果发现DNS指向192.168.1.1、10.x.x.x这类网关地址,真正发起递归查询的可能是路由器或企业网关,不是用户机器。这个时候在用户机器上dig出来的结果,只能说明“网关给了这个答案”,还不能说明公网递归DNS有问题。
用dig指定DNS,定位是哪个Resolver返回脏数据
同一个域名,对比多个递归DNS
排查时常用这种方式:
dig example.com A @223.5.5.5 +short
dig example.com A @119.29.29.29 +short
dig example.com A @8.8.8.8 +short
dig example.com A @1.1.1.1 +short
dig example.com A @114.114.114.114 +short
如果只有某一个Resolver返回异常,大概率是该递归DNS缓存或策略问题。如果国内多个运营商DNS都异常,而海外公共DNS正常,要考虑运营商链路污染、域名在部分区域被干扰、权威DNS到国内递归的链路异常。
对比时要加上完整输出,不要只看+short。完整输出里有SERVER、status、ANSWER SECTION、AUTHORITY SECTION、TTL,这些字段能帮你判断答案从哪来、是否走了缓存。
看TTL能判断是不是老缓存
比如权威DNS里A记录TTL是300秒,但某个递归DNS返回的TTL还有7200秒,说明它手里拿的不是当前权威记录,或者中间有非标准缓存。
如果TTL每查一次正常递减,说明这是一个缓存答案。如果TTL每次查询都重新变成固定大值,可能每次都被同一个设备伪造或改写。
多说一句,TTL不是绝对证据,但在排查污染时很好用。尤其是遇到“我已经改解析半小时了,用户还是访问旧IP”这种情况,TTL能快速判断是不是递归缓存还没过期。
直接问权威DNS,看源头有没有错
查NS记录,找到权威DNS
先看域名的权威NS:
dig example.com NS +short
然后直接指定权威DNS查询:
dig @ns1.example-dns.com example.com A
如果权威DNS返回就是错的,那问题在DNS服务商控制台、区域文件、解析记录、DNS服务商的同步节点上。这个时候没必要继续怀疑运营商。
如果权威DNS返回正确,但某些递归DNS返回错误,问题就在递归DNS到权威DNS之间,或者递归DNS自身缓存/策略。
用+trace看递归路径,但不要迷信它
dig example.com A +trace
+trace会从根开始一路查到权威,适合确认委派链路是否正常,比如根、TLD、NS是否能返回正确结果。
不过+trace是本机直接迭代查询,它不等于用户使用运营商Local DNS时的真实路径。它能证明权威链路是否通,不能证明某个运营商递归DNS没有污染。
判断污染发生在UDP 53还是更上游
UDP和TCP都查一遍
很多DNS污染只针对UDP 53,因为传统DNS默认走UDP。可以同一个Resolver查两次:
dig example.com A @8.8.8.8
dig example.com A @8.8.8.8 +tcp
如果UDP返回异常,TCP返回正常,说明中间链路对UDP 53做了干扰或注入。这个场景在跨境链路、公共DNS直连、某些企业出口里都见过。
如果UDP和TCP都异常,再看DoH/DoT结果。如果DoH正常,传统DNS异常,说明污染更可能发生在明文DNS链路。
抓包看是不是有两个DNS响应
在Linux上可以抓:
tcpdump -ni any port 53
污染注入比较典型的现象是:客户端发出一个DNS query,很快收到一个错误answer,随后又收到一个正确answer,但客户端已经采用了先到的那个错误answer。
这类问题肉眼看dig结果不一定看得出来,抓包能看到响应源IP、到达时间、Transaction ID是否一致、Answer内容是否异常。
如果错误响应的源IP伪装成你查询的DNS服务器,但TTL、MAC路径、到达延迟明显异常,就要怀疑链路中间注入。
按地域和运营商拆样本,别只用自己电脑测
同城正常不代表全国正常
DNS污染经常是区域性的。北京联通正常,不代表广州电信正常;移动正常,不代表教育网正常;国内正常,不代表海外用户正常。
建议至少覆盖这些维度:电信、联通、移动、海外节点、办公网络、手机4G/5G。业务如果面向跨境用户,还要测香港、日本、韩国、美国西海岸、欧洲。
这里如果自己没有足够多节点,可以用云服务器做探针。比如需要韩国回国优化线路,可以看129云的韩国 B型,带傲盾防火墙和精品线路,适合放一个轻量探测脚本;如果要美国方向跑大流量压测或DNS监控,美国精品大宽带-E型有1Gbps峰值和三网精品线路;欧洲侧只做解析探测、业务可达性监控,德国双ISP-特惠这种小规格机器就够用。选节点时不要只看CPU,DNS排查更看网络位置、运营商路径和是否方便长期留探针。需要确认线路也可以直接打客服热线400-9177118问。
记录样本时要带上Resolver和出口IP
不要让用户只发一句“打不开”。至少要拿到这些信息:
用户所在地区和运营商,例如上海电信、深圳移动、北京联通。
用户实际DNS服务器,例如192.168.1.1、223.5.5.5、运营商下发DNS。
dig完整输出,包含status、ANSWER、TTL、SERVER。
用户出口IP,可以访问 ifconfig.me 或 ipinfo.io 看。
访问目标域名解析到的IP。
如果有条件,再加一份mtr到解析出来的IP。因为有时候用户说DNS错了,其实DNS解析到了正确IP,只是那条路由被DDoS清洗、BGP绕路或防火墙策略影响。
CDN场景要特别看ECS和调度结果
同一个域名解析到不同IP不一定是污染
CDN和Anycast DNS环境里,不同地区解析到不同IP很正常。比如上海电信拿到华东节点,北京联通拿到华北节点,海外拿到新加坡或洛杉矶节点,这不是污染。
判断是否异常,要看解析结果是不是属于CDN厂商节点、是否在预期调度范围、访问是否命中正确证书和Host。
可以用whois、IP归属库、CDN控制台节点信息对比。不要看到IP不同就直接判定DNS被污染。
EDNS Client Subnet会影响结果
很多公共DNS支持ECS,也就是递归DNS会把客户端网段信息带给权威DNS或CDN调度系统。这样同样查询8.8.8.8,不同用户可能得到不同结果。
排查时可以用支持subnet参数的dig版本:
dig example.com A @8.8.8.8 +subnet=1.2.3.0/24
用不同subnet模拟不同地区用户,看CDN调度是否符合预期。
如果不带ECS时正常,带某个地区subnet时返回异常,就要查CDN调度规则、区域封禁、节点健康状态,而不是只盯着DNS污染。
权威DNS也可能是“某个节点”坏了
DNS服务商的多个NS节点结果不一致
权威DNS通常有多个NS,例如ns1、ns2、ns3。如果其中一个节点同步失败,就会出现部分递归DNS拿到新记录,部分递归DNS拿到旧记录。
可以逐个查:
dig @ns1.dnsprovider.com example.com A
dig @ns2.dnsprovider.com example.com A
dig @ns3.dnsprovider.com example.com A
如果ns1返回新IP,ns2返回旧IP,问题就很明确了:权威DNS集群同步不一致。
这个场景在刚迁移DNS服务商、刚改NS、刚批量导入记录时比较常见。尤其是域名注册商处的NS变更,还会叠加TLD缓存时间,看起来像污染,实际上是委派链路还没完全切干净。
Glue记录错误会让问题变得很隐蔽
如果权威NS使用的是域名自身的子域,例如ns1.example.com,那么注册局里会有Glue记录。Glue记录错了,递归DNS可能连权威DNS都找错地方。
查Glue可以看:
dig example.com NS +trace
关注TLD返回的NS和对应A记录是否正确。
如果TLD层返回的ns1.example.com地址还是旧IP,而你只在自己的DNS控制台改了ns1.example.com的A记录,递归DNS可能仍然去旧的权威服务器查。这种问题很容易被误判成运营商污染。
把“哪个节点出问题”缩小到具体层级
本机层
现象:同一网络下其他设备正常,只有某台机器异常;清DNS缓存后恢复;浏览器和命令行结果不一致。
重点查:系统DNS缓存、浏览器DNS缓存、代理软件、VPN、hosts文件、杀毒软件、容器内部DNS。
Chrome可以看 chrome://net-internals/#dns,部分新版本入口变了,但浏览器确实有自己的DNS和Socket缓存。hosts文件也别忘了,Windows在 C:\Windows\System32\drivers\etc\hosts,Linux/macOS在 /etc/hosts。
网关层
现象:同一个办公室、同一个Wi-Fi下都异常,换手机流量正常;机器配置的DNS是路由器IP。
重点查:路由器DNS代理、企业网关策略、旁路安全设备、DHCP下发的DNS、透明DNS劫持。
可以在客户端直接指定公共DNS测试。如果指定8.8.8.8仍然返回网关伪造结果,说明网络里可能有透明代理或DNS重定向。
递归DNS层
现象:指定某个Resolver异常,换Resolver正常;TTL异常;同一Resolver在不同地区返回不同结果。
重点查:递归DNS缓存、运营商Local DNS、公共DNS策略、ECS、DNSSEC校验。
这个时候可以临时建议用户切换到可信Resolver,或者业务侧接入稳定的权威DNS/CDN调度。但长期处理还是要确认污染来源,尤其是企业业务不能只靠“让用户换DNS”解决。
权威DNS层
现象:直接查权威NS返回错误;多个权威NS结果不一致;+trace链路里NS或Glue异常。
重点查:解析记录、线路解析策略、NS同步状态、域名注册商NS配置、DNSSEC DS记录、Glue记录。
DNSSEC引起的SERVFAIL也不少见。比如权威侧换了DNS服务商,但注册商那里DS记录没删,递归DNS校验失败,就会直接SERVFAIL。普通用户看起来就是打不开。
链路注入层
现象:UDP 53异常,TCP 53或DoH正常;抓包看到多个响应;错误响应延迟极低;只有特定跨境路径异常。
重点查:运营商链路、国际出口、企业安全设备、透明DNS代理。
这种问题业务侧很难直接“修复”链路,只能绕开明文DNS,比如客户端支持DoH/DoT,或者通过应用内置解析、私有DNS、就近探测节点做容灾。网站类业务则要配合CDN、备用域名、合理TTL来降低影响。
现场排查时常用的命令组合
查当前Resolver返回
dig example.com A
看SERVER字段,确认到底是谁回答的。
指定公共DNS对比
dig example.com A @223.5.5.5
dig example.com A @119.29.29.29
dig example.com A @8.8.8.8
dig example.com A @1.1.1.1
直接查权威DNS
dig example.com NS +short
dig @权威NS example.com A
查委派链路
dig example.com A +trace
查TCP DNS
dig example.com A @8.8.8.8 +tcp
抓DNS包
tcpdump -ni any udp port 53
tcpdump -ni any port 53
验证业务访问
curl -v https://example.com/
curl -v --resolve example.com:443:1.2.3.4 https://example.com/
一个真实排查思路的还原
现象
某业务域名在华南部分用户访问异常,用户反馈浏览器提示连接超时。运维控制台看到A记录没问题,CDN也显示节点正常。华东办公室访问正常,海外监控正常。
先把访问和解析拆开
让用户执行dig,发现域名解析到了一个不属于业务CDN的IP。TTL为3600,而权威DNS里这个记录TTL实际是120。
同一用户机器指定223.5.5.5,返回正确;指定本地运营商DNS,返回异常。用户DNS来自路由器DHCP,路由器上游是当地运营商Local DNS。
这个时候问题已经缩到运营商Local DNS或其上游缓存。
继续确认不是CDN调度
从华南移动、华南电信、华南联通三台探针分别查询。只有华南电信某两个城市异常,移动和联通正常。直接查权威NS全部正确,多个NS返回一致。
再用+tcp查询异常运营商DNS,TCP返回正确,UDP返回错误。抓包能看到两个响应,错误响应先到,正确响应后到。
结论不是权威DNS错,也不是CDN调度错,而是这段网络里的UDP 53响应被注入或污染。
处理动作
短期让受影响客户改用可信DNS或DoH,业务侧把TTL维持在120,避免后续调度切换时扩大影响。同时把异常样本整理给DNS服务商和运营商,包括时间、地区、出口IP、Resolver、错误答案、抓包截图。
业务如果有客户端,可以内置DoH或备用解析通道。纯Web业务可以准备备用域名,并确保备用域名不和主域名使用完全相同的NS与解析链路。
容易误判的场景
解析到旧IP不一定是污染
如果刚改过解析,递归DNS缓存没过期,用户拿到旧IP很正常。先看旧记录原来的TTL是多少。以前设置过86400,就别指望5分钟全球生效。
解析到国外IP不一定是污染
CDN调度、Anycast、海外线路回源、GIA/CN2优化线路都可能让用户拿到不同地域IP。要结合IP归属、CDN厂商、访问质量判断。
公共DNS正常不代表运营商DNS正常
很多排查只测8.8.8.8和1.1.1.1,结果得出“DNS没问题”。但真实用户可能用的是运营商DHCP下发的Local DNS。面向国内用户的业务,必须测运营商DNS。
权威DNS正常不代表用户侧正常
权威DNS只是源头。递归DNS缓存、中间链路、透明代理都可能改写结果。直接查权威正确,只能说明源头没错。
ping域名结果不能直接当DNS结论
ping会触发系统解析,但它还受ICMP策略影响。有的服务器禁ping,有的CDN节点丢ICMP,有的本地安全软件拦截。DNS排查还是用dig、nslookup、drill这类工具更干净。
排查记录建议直接写成证据链
不要只贴一张截图
给运营商、DNS服务商、CDN厂商提交问题时,信息越完整,定位越快。建议按这个格式记录:
时间:2026-xx-xx 14:23:10 GMT+8
用户地区和运营商:广州电信
用户出口IP:x.x.x.x
查询域名:example.com
使用Resolver:202.x.x.x
异常返回:198.51.100.8,TTL 3600
权威DNS返回:203.0.113.10,TTL 120
公共DNS对比:223.5.5.5正常,119.29.29.29正常,8.8.8.8正常
UDP/TCP对比:UDP异常,TCP正常
抓包现象:同一Transaction ID收到两个answer,错误answer先到
有这些证据,对方才好判断是缓存问题、调度问题、链路注入,还是某个节点同步异常。
业务侧能提前做的防护
TTL别长期设太大
核心业务域名TTL建议保持在60到300秒之间。不是越低越好,太低会增加权威DNS压力,也可能被部分递归DNS强制调整;但TTL设到86400,出问题时切换会很难受。
权威DNS要有多节点和监控
至少监控每个NS节点返回是否一致。不要只监控“域名能不能解析”,要监控“每个权威NS返回的答案是否符合预期”。
关键业务准备备用域名
备用域名不要和主域名完全复用同一条DNS链路。否则主域名污染时,备用域名可能也一起受影响。备用域名的证书、回源、WAF、CDN配置要提前验证,别等故障时才发现证书没签或Host没放行。
客户端业务可以考虑DoH
App、游戏启动器、企业客户端这类可控环境,可以引入DoH作为备用解析通道。传统UDP 53异常时,走HTTPS解析能绕开一部分链路污染。
但DoH也要注意可用性和合规要求,不要把所有解析都硬编码到单一服务。服务不可用时要有降级路径。
监控节点要覆盖真实用户网络
DNS监控只放在云厂商同一个Region意义不大。真实用户在电信、联通、移动、海外住宅宽带、企业出口。监控节点越贴近用户,越容易提前发现污染和调度异常。
如果业务有游戏、高防、海外访问场景,选择服务器时可以顺手把探针能力考虑进去。像129云这类提供高防服务器、G口大带宽服务器、海外云计算线路的服务商,适合把业务节点和监控节点一起规划,尤其是韩国、美国、德国这些常用方向,既能看解析,也能看BGP路径、回国延迟和丢包。
排到最后,定位结果通常会落在这些位置
本机或浏览器缓存
清缓存恢复,换设备正常。处理本机缓存、hosts、代理、浏览器DNS缓存。
企业网关或路由器DNS代理
同一局域网都异常,换网络正常。查DHCP、网关DNS代理、透明DNS策略。
运营商Local DNS缓存污染
指定运营商DNS异常,公共DNS正常。收集样本提交运营商,同时给用户临时切换DNS。
明文DNS链路注入
UDP异常,TCP或DoH正常,抓包看到抢答。客户端侧可启用DoH/DoT,业务侧准备备用解析策略。
权威DNS同步异常
不同NS返回不一致。联系DNS服务商处理节点同步,必要时临时切换权威DNS。
域名委派或Glue错误
+trace里TLD返回异常NS或旧Glue。到注册商处修正NS/Glue记录,等待上层缓存刷新。
CDN调度异常
权威返回的确是CDN给出的结果,但某区域调到了不可用节点。查CDN区域策略、节点健康、ECS、回源状态。
DNS污染排查不要靠猜。把客户端、Resolver、权威DNS、传输协议、地域运营商逐层拆开,错误答案从哪一层开始出现,问题节点就在那里。