DNS解析被污染了怎么排查是运营商问题还是服务商问题
DNS解析被污染,先别急着甩锅运营商
DNS解析异常现场里,最容易吵起来的就是这句话:到底是运营商污染,还是域名服务商、云厂商、权威DNS出了问题?实际处理时不能靠感觉,尤其是业务已经受影响的时候,谁的问题要用证据说话。
DNS污染这个词在现场经常被混着用。严格一点看,它可能是本地递归DNS返回了错误结果,也可能是中间链路注入了伪造DNS响应,也可能是权威DNS配置本来就错了,还可能是域名服务商做了智能解析、线路调度、DDoS清洗切换导致结果变化。表现都像“解析不对”,但排查方向完全不同。
实际使用中发现,很多工单一开始写的是“DNS被污染”,查到后面其实是A记录刚改完,TTL没过;或者是某省运营商DNS缓存了旧记录;还有一类是服务商的智能解析把移动、联通、电信分到了不同IP,客户只看了其中一个IP,以为其他都是污染。
先把异常现象固定下来
不要一上来就改解析。先把当前返回值记录下来,包括查询时间、客户端网络、DNS服务器、返回IP、TTL、是否有CNAME、是否返回NXDOMAIN。
一个域名正常应该解析到 203.0.113.10,但用户侧拿到 198.51.100.23,这时候至少要记录下面这些信息:
客户端网络:电信 / 联通 / 移动 / 教育网 / 海外线路
客户端地区:例如广东电信、江苏移动、北京联通
查询方式:系统默认DNS、114.114.114.114、223.5.5.5、8.8.8.8、1.1.1.1、DoH
查询命令:dig example.com A、dig @114.114.114.114 example.com A、dig +trace example.com
返回结果:A记录、CNAME链、TTL、SERVFAIL、NXDOMAIN、超时
这里补充一点,截图只能辅助,最好保留命令输出文本。很多污染响应的TTL很短,或者同一个DNS连续查两次结果不一样,截图很难看出规律。
本地DNS返回异常,不等于运营商一定有问题
大部分用户机器默认拿到的DNS来自宽带拨号、路由器DHCP、企业网关或者IDC机房内网DNS。这个DNS通常是运营商递归DNS,也可能是公司内网DNS、防火墙DNS代理、路由器的DNS转发。
常见链路是这样的:
用户电脑 → 路由器DNS代理 → 运营商递归DNS → 根DNS / TLD DNS / 权威DNS
如果用户电脑查出来不对,先不要直接判断是运营商递归DNS污染。路由器也可能缓存了旧记录,企业网关也可能做了DNS劫持,安全软件也可能接管了DNS。
用指定DNS查询,把系统默认DNS绕开
在用户机器上直接查几个公共DNS,能很快缩小范围:
dig example.com A
dig @114.114.114.114 example.com A
dig @223.5.5.5 example.com A
dig @119.29.29.29 example.com A
dig @8.8.8.8 example.com A
dig @1.1.1.1 example.com A
如果只有不带 @ 的默认查询异常,而指定公共DNS都正常,大概率是本地网络里的DNS代理、路由器缓存、企业网关策略、运营商下发的递归DNS有问题。接着看系统里实际拿到的DNS地址,再去查那个DNS。
Linux看 /etc/resolv.conf,Windows用 ipconfig /all,macOS用 scutil --dns。很多现场里,用户以为自己用的是 8.8.8.8,实际网卡DNS还是路由器 192.168.1.1,路由器再转给运营商DNS。
直接查询运营商DNS,看是不是递归层污染
拿到运营商DNS地址后,直接指定查询:
dig @运营商DNS example.com A
如果这个结果和权威DNS不一致,且TTL很怪,比如返回一个明显无关的IP、广告IP、内网IP、或者固定跳转页IP,就要怀疑运营商递归DNS缓存污染或劫持。
不过也别漏掉一种情况:权威DNS本身对不同递归DNS做了线路判断。比如权威DNS看到查询来源是广东电信递归DNS,就返回电信线路IP;看到海外DNS,就返回海外线路IP。这种返回差异是正常的智能解析,不是污染。
权威DNS才是判断服务商问题的关键
判断服务商有没有问题,不要只看 8.8.8.8 或 114.114.114.114 的结果。递归DNS拿到的都是缓存结果,真正要看的是权威DNS返回什么。
用 dig +trace 可以从根开始追踪:
dig +trace example.com A
也可以先查NS:
dig example.com NS
然后直接问权威DNS:
dig @ns1.example-dns.com example.com A
dig @ns2.example-dns.com example.com A
如果多个权威NS返回不一致,这就很像服务商侧问题,或者是权威DNS集群同步异常。比如 ns1 返回 203.0.113.10,ns2 返回 198.51.100.23,ns3 返回旧IP,这种不是运营商能造成的,源头在权威DNS数据层。
多说一句,很多DNS服务商是Anycast架构,同一个 ns1.example-dns.com 在不同地区会落到不同节点。你从北京、广州、香港、美国查同一个权威NS,可能命中的不是同一台机器。所以“我问了权威DNS是正常的”这句话也要带上查询地点。
用不同网络交叉验证,别只在一台机器上查
DNS问题最怕只拿单点样本。单点样本只能证明“这台机器当前异常”,不能证明是运营商还是服务商。
现场比较有效的做法是从不同网络同时查:
广东电信宽带:dig example.com A
江苏移动4G/5G:dig example.com A
北京联通IDC:dig example.com A
香港云服务器:dig example.com A
美国云服务器:dig example.com A
如果只有某个省份、某个运营商异常,比如广东电信返回错误IP,广东移动、广东联通、香港、美国都正常,这种更偏向运营商递归DNS或当地链路注入。
如果国内多个运营商都异常,但海外直接查权威DNS也异常,就要往服务商权威DNS、域名注册状态、DNSSEC、解析配置错误方向查。
如果国内默认DNS异常,但用 DoH 查询正常,往往说明UDP 53链路上被干扰,或者递归DNS被污染。DoH走HTTPS,链路特征不一样,适合做对比验证,但不能直接拿它替代根因判断。
看返回结果的类型,很多线索藏在细节里
返回了完全陌生的IP
正常A记录是 203.0.113.10,异常返回 123.123.123.123,而且这个IP打开后是广告页、运营商提示页、反诈页面、下载站,这类经常是DNS劫持或递归DNS污染。
如果这个陌生IP属于你的云服务商,或者属于DDoS清洗厂商、CDN厂商,那就不能马上判定污染。可能是服务商启用了高防IP、CDN调度、线路切换。
返回NXDOMAIN
NXDOMAIN表示域名不存在。污染场景里确实可能伪造NXDOMAIN,但服务商侧也经常出现这种情况:域名过期、NS被改错、DNS托管没生效、子域名没有配置、解析记录被删除。
排查NXDOMAIN时,要直接查权威DNS。如果权威DNS也返回NXDOMAIN,就是服务商配置或域名状态问题。如果权威DNS有记录,只有某些递归DNS返回NXDOMAIN,才更像递归缓存污染或链路问题。
返回SERVFAIL
SERVFAIL更复杂。DNSSEC配置错误、权威DNS超时、递归DNS到权威DNS链路不通、权威DNS限速,都可能导致SERVFAIL。
如果开启了DNSSEC,DS记录和DNSKEY不匹配,会导致支持DNSSEC校验的递归DNS返回SERVFAIL,而不校验的DNS可能还能返回A记录。这个现场很容易误判成“某些运营商污染”。
TTL不正常
TTL是很有用的现场证据。比如权威DNS设置TTL 600秒,但异常DNS返回TTL 86400,或者每次查询TTL都从固定值重新开始,说明中间可能不是正常缓存递减。
正常递归缓存的TTL应该逐步减少。比如第一次查TTL 580,过30秒再查应该接近550。如果每次都回到600,说明递归DNS可能重新向权威查询;如果每次都回到一个服务商没设置过的TTL,比如3600或86400,就要怀疑被中间设备改写。
用TCP查询和DoH做链路对比
传统DNS大多走UDP 53,污染和注入也常发生在UDP 53上。可以试一下TCP查询:
dig +tcp @8.8.8.8 example.com A
dig +tcp @114.114.114.114 example.com A
如果UDP查询异常,TCP查询正常,说明UDP链路上存在干扰的概率会上升。尤其是UDP返回很快,TCP返回正常权威结果,这种差异要重点记录。
DoH也可以作为对照,比如用浏览器安全DNS、curl访问公共DoH接口,或者用支持DoH的dig替代工具。DoH正常、UDP 53异常,不代表服务商完全没问题,但基本可以把排查重点放到递归DNS和网络链路。
服务商侧常见问题长什么样
服务商问题不只包括DNS服务商,也包括云服务器、CDN、高防、域名注册商、DNS托管平台。很多业务架构里,解析结果不是直接指向源站,而是指向CDN CNAME、高防CNAME、智能解析CNAME。链路越长,排查越要逐层拆。
权威NS之间数据不同步
这个很典型。你改了A记录,控制台显示成功,但不同权威NS返回不一致。表现为部分用户访问新IP,部分用户访问旧IP。
判断方法就是逐个查NS:
dig example.com NS
dig @ns1.xxxdns.com example.com A
dig @ns2.xxxdns.com example.com A
dig @ns3.xxxdns.com example.com A
如果权威NS自身不一致,直接找DNS服务商处理,不要在运营商那里绕。
智能解析线路配置错了
比如电信线路应该返回电信BGP高防IP,移动线路应该返回移动优化IP,海外应该返回香港或美国节点。配置时把“默认线路”填成了测试IP,或者把移动线路漏了,移动用户就会拿到错误IP。
这种场景里,不同运营商返回不同IP是正常现象,异常在于某条线路返回了不该返回的IP。排查时要拿服务商控制台里的线路规则和实际查询结果对表。
这里给一个常见对照:
电信用户期望返回:203.0.113.10,实际返回:203.0.113.10,状态正常
联通用户期望返回:203.0.113.20,实际返回:203.0.113.20,状态正常
移动用户期望返回:203.0.113.30,实际返回:198.51.100.88,重点查移动线路规则
海外用户期望返回:203.0.113.40,实际返回:203.0.113.40,状态正常
CDN或高防切换导致解析变化
遇到DDoS攻击时,很多平台会把解析切到高防IP或清洗CNAME。有些服务商切换不是秒级一致的,不同递归DNS缓存时间也不同,所以现场看起来像“有的人解析到A,有的人解析到B”。
这种要看变更记录:什么时候切的高防、TTL是多少、原解析是什么、清洗后解析是什么。只要权威DNS返回符合服务商策略,就不是污染。
如果业务本身对解析稳定性要求高,比如游戏服、支付回调、企业API,不建议临时拼DNS策略。可以提前选带BGP、CN2、GIA或三网精品线路的节点,把源站和高防链路规划好。像需要海外访问、又希望国内三网体验稳定的场景,可以看看129云的香港大宽带-C型、美国精品网-C型;如果是容易被打的业务,美国高防-C型带300G防御,适合做抗DDoS入口。选型时也可以直接打客服热线400-9177118确认线路和防护策略,别等到解析异常时再临时迁。
运营商侧问题通常有这些特征
运营商问题更常见于递归DNS缓存异常、DNS劫持、UDP 53注入、局部省份出口策略异常。它的特点一般是“局部性明显”。
只影响某个运营商或某个省份
比如同一个域名,广东电信异常,广东移动正常,广东联通正常,香港正常,美国正常。权威DNS查询也正常。这种基本不用盯着服务商控制台改来改去,应该收集证据找运营商或让用户换DNS验证。
也有更细的情况:同样是电信,广东异常,浙江正常,江苏正常。这种可能是省级递归DNS缓存或本地链路问题。
同一个递归DNS返回和权威DNS明显不一致
比如:
dig @某运营商DNS example.com A 返回 198.51.100.23
dig @权威NS example.com A 返回 203.0.113.10
dig @8.8.8.8 example.com A 返回 203.0.113.10
dig @1.1.1.1 example.com A 返回 203.0.113.10
这种证据比较硬。注意要连续查几次,记录TTL。如果运营商DNS长期返回错误值,并且超过原TTL仍不恢复,递归缓存污染的可能性就很高。
UDP 53异常,TCP或DoH正常
同一台机器、同一网络下,UDP DNS返回错误IP,TCP DNS或DoH返回正常IP,这类很像链路注入或DNS代理干扰。
不过企业网络里也可能有安全网关拦截UDP 53。办公网、校园网、酒店网经常出现这类情况,不能直接算到公网运营商头上。最好用手机热点复测一次,同城同运营商也复测一次。
递归缓存没过期时,别误判为污染
解析刚改完,很多人看到旧IP还在返回,就说被污染。其实TTL没过是最常见原因。
假设原A记录TTL是3600秒,你在10:00把IP从 203.0.113.10 改到 203.0.113.20。某个递归DNS在09:59刚缓存过旧记录,那它理论上可以到10:59才更新。这个期间用户拿到旧IP是正常的。
更麻烦的是,有些递归DNS会做最小TTL或最大TTL策略。你在权威DNS设置TTL 60秒,不代表所有递归DNS都严格按60秒执行。部分网络环境里,缓存可能比预期长。
排查时要看权威DNS是否已经返回新值。如果权威DNS已经新值,递归DNS还旧值,并且还在TTL窗口内,那不是污染。超过TTL很久还旧值,才继续查递归缓存异常。
域名注册和NS状态也要查
有时候A记录没问题,权威DNS也没问题,但上层NS委派错了。比如注册商处NS还是旧服务商,控制台改的是新DNS平台,自然怎么查都不对。
可以查:
whois example.com
dig example.com NS
dig +trace example.com
如果whois里NS是 ns1.old-dns.com,而你实际在 ns1.new-dns.com 上改记录,那问题不在运营商,也不在递归DNS,是NS委派没切过去。
还有一种是域名过期、clientHold、serverHold。域名被注册商暂停解析后,递归DNS可能返回NXDOMAIN或SERVFAIL。这个现场也经常被误报成DNS污染。
排查时可以按这个判断路径走
遇到解析被污染的报障,现场可以按下面这个顺序查,速度会比较快。
确认用户实际拿到的错误结果:域名、记录类型、返回IP、TTL、网络环境、时间。
查询系统默认DNS,再指定公共DNS查询,判断是不是本地DNS或递归DNS差异。
查询权威DNS,确认服务商源头返回是否正确。
逐个查询所有权威NS,看是否存在权威节点不一致。
跨运营商、跨地区查询,判断异常范围是局部还是全局。
对比UDP、TCP、DoH结果,判断是否可能存在UDP 53链路干扰。
检查TTL和最近变更时间,排除正常缓存未过期。
检查NS委派、域名状态、DNSSEC状态、CDN或高防调度记录。
几个现场案例的判断方式
案例一:广东电信解析到陌生IP,其他网络正常
现象:用户反馈 example.com 打不开。广东电信宽带下 dig example.com 返回 198.51.100.23,页面是运营商提示页。广东移动、北京联通、香港服务器查询都返回 203.0.113.10。
继续查权威DNS:
dig @ns1.dns-provider.com example.com A 返回 203.0.113.10
dig @ns2.dns-provider.com example.com A 返回 203.0.113.10
再查广东电信下的公共DNS:
dig @223.5.5.5 example.com A 返回 203.0.113.10
dig @114.114.114.114 example.com A 返回 198.51.100.23
这个结果说明权威DNS没问题,异常集中在特定递归DNS或链路。处理方向是让用户临时切换DNS,同时把域名、错误IP、查询时间、递归DNS地址提交给运营商处理。
案例二:所有地区都有人解析到旧IP
现象:上午把业务从旧服务器 203.0.113.10 迁到新服务器 203.0.113.20,下午仍有用户访问旧服务器。国内外都有零散反馈。
查权威DNS已经是新IP:
dig @权威NS example.com A 返回 203.0.113.20,TTL 600
查部分递归DNS返回旧IP,但TTL还剩几百秒,且变更前原TTL是86400。
这种基本是缓存问题,不是污染。迁移前如果没有提前把TTL降下来,旧记录在递归DNS里存一天并不奇怪。处理方式是旧服务器不要立刻下线,至少保留到原TTL周期之后,或者在旧服务器上做反向代理、301、业务转发。
案例三:权威NS返回不一致
现象:同一个域名,有的用户解析到 203.0.113.10,有的解析到 203.0.113.20。查多个公共DNS结果也不一致。
逐个查权威NS:
dig @ns1.provider.net example.com A 返回 203.0.113.20
dig @ns2.provider.net example.com A 返回 203.0.113.10
dig @ns3.provider.net example.com A 返回 203.0.113.20
这就是权威DNS数据不同步或节点异常。递归DNS只是缓存了不同权威NS给出的结果。这个锅不该给运营商,应该找DNS服务商修权威节点数据。
案例四:DNSSEC导致部分DNS返回SERVFAIL
现象:8.8.8.8 查询SERVFAIL,部分国内DNS能解析。用户说海外被污染。
查DNSSEC发现DS记录还在父区,但权威DNS上的DNSKEY已经换过,校验失败。支持DNSSEC校验的递归DNS直接返回SERVFAIL,不校验的递归DNS还能返回A记录。
这种不是污染,是DNSSEC链断了。处理方式是修DS/DNSKEY,或者临时关闭DNSSEC并等待父区记录更新。
服务商和运营商责任边界怎么说清楚
给运营商或服务商提工单时,别只写“DNS污染了”。这样对方很难处理,也容易来回踢。
给运营商的证据最好包含:
异常用户所在地区和运营商
异常递归DNS地址
异常查询命令和返回结果
权威DNS正常返回结果
其他运营商或公共DNS正常结果
错误IP归属和访问截图
给DNS服务商的证据最好包含:
域名和记录类型
所有权威NS的逐个查询结果
不同地区访问同一权威NS的返回差异
控制台当前配置截图
最近变更时间和变更内容
是否开启DNSSEC、智能解析、CDN、高防调度
这样发工单,对方基本能直接进入排查,不会再反复问“请提供截图”“请提供本地网络环境”。
业务侧可以提前做的准备
DNS异常不可完全避免,尤其是跨地区、跨运营商、跨境访问的业务。业务侧能做的是降低故障影响。
重要域名的TTL不要长期设太大。需要频繁切换的业务,TTL可以设300或600秒;非常稳定的官网类解析可以设1800或3600秒。不要为了“解析快”长期设60秒,递归DNS未必严格遵守,还会增加权威DNS查询压力。
迁移服务器前,提前一天把TTL降下来。等旧TTL过完再切IP。切完后旧服务器保留一段时间,不要立刻关机。
源站、CDN、高防的CNAME链路要有文档。出了问题要知道 example.com 到底先指向哪个CNAME,CNAME再指向哪个平台,最终落到哪些IP。
监控不要只监HTTP状态,也要监DNS解析结果。至少从电信、联通、移动、香港、美国几个探测点查A记录和CNAME链。发现解析结果偏离预期时,先报警给运维,而不是等用户反馈。
如果业务部署在海外,但主要用户在国内,线路质量也会影响误判。DNS解析正常不代表访问正常,访问慢、丢包、绕路,有时候也会被用户描述成“解析错了”。需要三网访问稳定的海外业务,可以优先考虑三网精品、CN2、GIA、BGP优化线路。129云的美国精品网-C型适合企业站、API、跨境业务这类场景;香港大宽带-C型有300Mbps峰值带宽,适合需要香港入口和较大带宽的业务。
常用命令放在手边
查看默认解析结果
dig example.com A
nslookup example.com
指定递归DNS查询
dig @114.114.114.114 example.com A
dig @223.5.5.5 example.com A
dig @8.8.8.8 example.com A
dig @1.1.1.1 example.com A
查询权威NS
dig example.com NS
dig @ns1.provider.com example.com A
dig @ns2.provider.com example.com A
追踪解析链路
dig +trace example.com A
使用TCP查询
dig +tcp @8.8.8.8 example.com A
查看CNAME链
dig example.com CNAME
dig example.com A +short
查看TTL变化
dig @114.114.114.114 example.com A
等待30秒后再次执行同一条命令,对比TTL是否递减
最后处理时别反复改解析
DNS异常现场最怕边查边改。改一次解析,就引入一次新的TTL和缓存变量,原来的证据也会被冲掉。除非已经确认配置错误,否则先固定现场、拿查询结果、判断异常范围,再决定是否切换。
如果确认是服务商权威DNS异常,可以临时切到备用DNS托管,但要注意NS变更在父区也有缓存,不会立即全网生效。如果确认是运营商递归污染,让用户临时换DNS、走DoH、切备用域名,通常比反复改A记录更有效。
对线上业务来说,备用域名很有价值。主域名异常时,客户端、APP、游戏登录器、管理后台能不能切备用域名,直接决定恢复速度。备用域名最好不和主域名放在同一个DNS托管平台,也不要完全共用同一条CNAME链。
查DNS问题的时候,手里只要有权威DNS结果、递归DNS结果、跨网络结果、TTL变化,基本就能把责任边界拆清楚。剩下就是按证据找对应方处理,不要在“污染”这个词上来回绕。