安全与合规

DNS 劫持是什么意思?类型、检测、处理与防范

DNS 劫持是指域名查询的结果被人为篡改:你访问的是正确的域名,拿到的却是别人指定的 IP,于是被带到广告页、钓鱼页或攻击者的服务器。判断方法只有一条主线:拿你看到的解析结果和域名权威服务器的结果对比,不一致就说明某一环被改了,再按篡改位置分别处理。

作者 顶联产品团队发布于 8 分钟阅读

DNS 劫持是什么意思?简单说,就是域名解析的结果被篡改了:你输入的域名没错,DNS 返回的却不是网站真实的 IP,而是广告服务器、钓鱼页面或攻击者控制的主机。篡改可以发生在解析链路的任何一环:你自己的电脑和路由器、运营商的递归服务器、域名的注册商账号,或者被投毒的 DNS 缓存。处理 DNS 劫持的第一步不是换 DNS,而是确认篡改发生在哪一环,因为影响范围和修复方法完全不同。

DNS 劫持的四种类型:篡改发生在哪一环

类型 篡改位置 典型表现 影响范围
本机或路由器 DNS 被改 电脑的 DNS 设置、hosts 文件,或路由器下发给终端的 DNS 地址 很多网站被插广告、跳转;换一个网络就正常 这台电脑,或这个路由器下的所有终端
运营商或出口劫持 运营商的递归服务器,或出口设备抢先回答 UDP 53 查询 输错的域名跳到导航页;某些域名在某个运营商网络下解析异常 某个地区、某个运营商的用户
域名账号被盗 注册商账号或 DNS 托管账号,NS 或解析记录被改 全网访客都进了假网站,邮件收不到 所有访客,后果最严重
缓存投毒 递归服务器的缓存被注入伪造应答 使用某个递归服务器的用户解析到错误地址,一段时间后自行恢复 使用这台递归服务器的所有用户,直到缓存过期

还有一种发生在机房和办公网里的变体:攻击者先在同一个二层网络里做 ARP 欺骗,把自己伪装成网关,再伪造 DNS 应答。表现和本机 DNS 被改很像,但电脑上的设置是正常的。

DNS 劫持有什么后果

  • 钓鱼和盗号:仿冒的登录页收集账号密码,访客看到的域名是对的,很难察觉。
  • 插广告、改跳转:运营商或流量贩子把访问导向广告页变现,网站自己的流量和收入被截走。
  • 邮件被截获:MX 记录被改后,发往你域名的邮件全部进了攻击者的服务器,包括其他平台发来的“重置密码”邮件,攻击者可以借此接管更多账号。
  • 签发合法证书:控制了解析的人能通过证书颁发机构的域名验证,拿到你域名的正规 HTTPS 证书,浏览器的小锁照样显示。
  • 软件更新和下载被替换:服务器上用 curl ... | sh 安装脚本、下载程序却不校验签名和哈希的,可能执行攻击者的代码。yum、apt 的软件包有 GPG 签名,受到的影响小得多。
  • 业务中断与搜索收录异常:解析指向不可用的地址时网站直接打不开;搜索引擎的爬虫如果抓到被替换的内容,收录也会受影响。

怎么检测 DNS 劫持:拿结果和权威服务器对比

第一步:对比权威服务器与各个递归服务器的结果

权威服务器上的记录是“正确答案”,直接问它不经过任何缓存。再用本机配置的 DNS 和几个公共 DNS 分别查询,对比结果:

# 找出域名的权威服务器
dig +short NS example.com
# 直接问权威服务器(换成上一步查到的 NS)
dig +short www.example.com @ns1.example-dns.com
# 本机当前使用的 DNS
dig +short www.example.com
# 几个公共 DNS 逐一查询
for s in 223.5.5.5 119.29.29.29 114.114.114.114 8.8.8.8 1.1.1.1; do
  printf '%-16s %s\n' "$s" "$(dig +short +time=2 +tries=1 www.example.com @"$s" | tr '\n' ' ')"
done

注意,用了 CDN 或智能解析的域名,不同地区、不同运营商本来就会拿到不同的 IP,结果不一致不等于被劫持。这时看返回的 IP 属于谁:whois 198.51.100.7 查出的组织是你的 CDN 或机房,就是正常调度;属于一个完全不相干的机构,才是可疑结果。还要从不同地区的几台服务器上各跑一遍,有些劫持只在特定城市或运营商出现。

第二步:测试不存在的域名会不会被改写

# 随机生成一个肯定不存在的子域名,正常应返回 status: NXDOMAIN
dig nx-$(date +%s).example.com | grep -E 'status|IN[[:space:]]+A'

如果返回的是 NOERROR 外加一个 IP,说明你用的递归服务器会把“域名不存在”改写成自己的地址,这是运营商劫持最常见的形式。测试要用一个确定没有泛解析(*.example.com)的域名,否则结论不成立。

第三步:查注册信息,看 NS 有没有被改

# 注册商、NS、域名状态和最近一次修改时间
whois example.com | grep -iE 'registrar:|name server|status|updated date'
# 直接问 TLD(域名后缀)服务器,看注册局里登记的 NS,不受任何递归缓存影响
dig +norecurse +noall +authority NS example.com @a.gtld-servers.net

.com、.net 的 TLD 服务器是 a.gtld-servers.net 等,.cn 用 a.dns.cn。NS 不是你在用的 DNS 服务商,或者 Updated Date 是一个你没有操作过的时间,就要按账号被盗处理。顺便看一眼 Status 里有没有 clientTransferProhibited、clientUpdateProhibited 这类锁定状态。

第四步:检查本机和服务器的设置

# Linux 服务器
cat /etc/resolv.conf
resolvectl status 2>/dev/null | grep -i 'dns server'   # 使用 systemd-resolved 的系统
grep -vE '^\s*(#|$)' /etc/hosts                         # 一般只有 localhost、本机名和 IPv6 默认条目
lsattr /etc/resolv.conf /etc/hosts                      # 出现 i 属性,说明有人锁定了它们
getent hosts www.example.com                            # 程序实际拿到的结果,会经过 hosts
# Windows
Get-DnsClientServerAddress -AddressFamily IPv4
Get-Content C:\Windows\System32\drivers\etc\hosts | Where-Object { $_ -notmatch '^\s*(#|$)' }

路由器要登录管理页面,看 WAN 口和 DHCP 下发的 DNS 是不是你设置的地址。服务器的 DNS 或 hosts 被不明来源改过并加了锁定属性,这不只是 DNS 问题,说明机器很可能已被入侵,要按入侵排查处理。

第五步:查证书透明度日志

所有公开信任的 HTTPS 证书都会记录在证书透明度(CT)日志里。查一下最近有没有你不认识的证书:

curl -s "https://crt.sh/?q=example.com&output=json" \
  | jq -r '.[] | [.not_before, .issuer_name, .name_value] | @tsv' | sort -r | head -20

出现了不是你申请的证书,说明有人短暂控制过你的解析,或者通过其他方式通过了域名验证,要连同账号一起排查。

对照表:根据结果判断是哪一类

检测结果 结论
权威、公共 DNS 都正确,只有本机或本网络的结果错误 本机、路由器 DNS 被改,或局域网里有 ARP 欺骗
权威正确,某个运营商、某个地区的结果错误 运营商劫持,或该地区的递归服务器缓存被投毒
不存在的域名返回了 IP 递归服务器改写 NXDOMAIN
权威服务器返回的就是错误 IP,或注册局里的 NS 变了 域名账号或 DNS 托管账号被盗
各处解析都正确,页面仍被插广告或跳转 不是 DNS 劫持:可能是 HTTP 内容在传输中被篡改(用 HTTPS 解决),也可能是本机的浏览器插件或恶意程序

DNS 劫持怎么处理:按类型分别修复

本机或路由器被改:“DNS 劫持异常”怎么修复

安全软件提示“DNS 劫持异常”或“DNS 被篡改”,多数属于这一类。Windows 上按顺序处理:

# 1. 看当前网卡名称和 DNS
Get-DnsClientServerAddress -AddressFamily IPv4
# 2. 改成可信的 DNS(网卡名换成上一步看到的),或恢复为自动获取
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses 223.5.5.5,119.29.29.29
#    或者恢复为自动获取(二选一)
# Set-DnsClientServerAddress -InterfaceAlias "以太网" -ResetServerAddresses
# 3. 清掉已经缓存的错误结果
ipconfig /flushdns
# 4. 全盘扫描,找出修改设置的程序
Start-MpScan -ScanType FullScan

hosts 文件里删掉不认识的条目。只改设置不查原因,修改它的程序会再改回去。路由器这一侧:修改管理员密码,关闭从外网访问管理页面的功能,把 DHCP 下发的 DNS 改回自动或可信地址,升级固件;固件太老、厂商已不再更新的,换掉。

Linux 服务器上的 /etc/resolv.conf 被改成陌生地址,先 chattr -i 去掉锁定再恢复,同时查 crontab 和 systemd 服务里有没有定时改写它的任务,并把这台机器当作已被入侵来排查。

运营商劫持:留证、投诉、加密

  1. 保存证据:在出问题的网络里运行上面的 dig 对比,把命令、结果、时间、宽带账号或出口 IP 一起保存,网页被替换的截图也留着。
  2. 向运营商客服投诉,要求处理;没有结果的,可以向工业和信息化部电信用户申诉受理中心(12300)申诉。
  3. 技术上减少暴露:网站全站 HTTPS 并开启 HSTS,让中途篡改内容和降级到 HTTP 都行不通;访客一侧改用加密 DNS(DoH 或 DoT),查询在传输途中无法被改写;App 可以使用云服务商的 HTTPDNS 服务,绕过运营商的递归服务器。

域名账号被盗:最紧急,按小时算

  1. 能登录的,立刻改密码、开二次验证,并检查账号绑定的邮箱、手机号有没有被改,有没有新增的子账号和 API 密钥。
  2. 把 NS 改回原来的 DNS 服务商,在 DNS 托管平台逐条核对 A、CNAME、MX、TXT 记录,TXT 里的 SPF 和各类平台的域名验证记录也要看。
  3. 登录不了的,马上联系注册商走找回流程,准备好实名认证材料,同时说明正在发生劫持,请求先冻结域名的修改。
  4. 查攻击期间签发的证书:按上面的方法查 CT 日志,找到不属于你的证书,联系对应的证书颁发机构吊销。
  5. 处理邮件被截的后果:攻击期间收到过“重置密码”邮件的平台,逐个检查登录记录并改密码。
  6. 评估影响,必要时报案:出现资金损失或用户数据泄露的,向公安机关网安部门报案,并按规定通知受影响的用户。

修复之后不会立刻全网恢复。已经缓存了错误 NS 和记录的递归服务器,要等缓存过期才会重新查询,TLD 服务器给出的 NS 记录缓存时间通常是一到两天(例如 .com 为 172800 秒,即两天),攻击者还可能给伪造的记录设了很长的 TTL。这段时间可以在主流公共 DNS 的缓存刷新页面提交刷新请求,缩短一部分用户的受影响时间。

缓存投毒:自建递归 DNS 的运维要做的事

# BIND:清除某个名称或整个缓存
rndc flushname www.example.com
rndc flush
# Unbound:清除某个域名下的全部缓存
unbound-control flush_zone example.com

清缓存只是止血。递归服务器要开启 DNSSEC 验证,保持软件更新(源端口随机化等防投毒机制依赖较新的版本),并且只对自己的网段提供递归,不要做对公网开放的递归服务器。

怎么防范 DNS 劫持:域名侧与服务器侧清单

措施 主要防哪一类 怎么做
注册商账号加固 账号被盗 强密码加二次验证;用公司专用邮箱注册,不挂在某个员工的个人账号下;定期检查登录记录
域名锁定 账号被盗 开启注册商提供的转移锁、更新锁;重要域名可以申请注册局锁定(Registry Lock),改 NS 需要线下核验
DNSSEC 缓存投毒、传输途中篡改 在 DNS 服务商处开启签名,再到注册商处提交 DS 记录
CAA 记录 被冒签证书 只允许你实际在用的证书颁发机构签发
可信的递归 DNS 本机被改、运营商劫持 服务器用机房 DNS 或知名公共 DNS,必要时开启 DoT;办公网统一下发
HTTPS 与 HSTS 内容篡改、降级 全站 HTTPS,HSTS 设足够长的有效期
解析监控 所有类型 定时从多个递归服务器和 TLD 服务器查询,结果不符就告警

DNSSEC 要说清楚它能做和不能做的:它让开启了验证的递归服务器能识别伪造的应答,对缓存投毒和途中篡改有效;但如果攻击者偷了你的注册商账号,可以连 DS 记录一起删掉,所以它代替不了账号安全。验证是否生效:

dig +dnssec www.example.com @1.1.1.1 | grep flags   # flags 里出现 ad,表示通过了验证
delv www.example.com                                  # 输出 fully validated 表示签名链完整
dig +short CAA example.com                            # 例如:0 issue "letsencrypt.org"

解析监控用一个简单脚本就能做,放进 crontab 每 5 分钟跑一次,输出接到你的告警渠道:

#!/bin/bash
# /usr/local/bin/dns-watch.sh:解析结果或 NS 与预期不符时输出一行告警
DOMAIN=example.com
HOST=www.example.com
EXPECT_A="203.0.113.10"
EXPECT_NS="ns1.example-dns.com. ns2.example-dns.com."

for s in 223.5.5.5 119.29.29.29 8.8.8.8; do
  got=$(dig +short +time=3 +tries=1 A "$HOST" @"$s" | sort | xargs)
  [ "$got" = "$EXPECT_A" ] || echo "$(date '+%F %T') $s 返回 [$got],预期 [$EXPECT_A]"
done

ns=$(dig +norecurse +noall +authority NS "$DOMAIN" @a.gtld-servers.net | awk '{print $5}' | sort | xargs)
[ "$ns" = "$EXPECT_NS" ] || echo "$(date '+%F %T') 注册局 NS 为 [$ns],预期 [$EXPECT_NS]"

用了 CDN 的域名,A 记录会随调度变化,改为监控 CNAME 的目标是否正确;预期值里有多个地址时,按排序后的顺序写。

机房和 IDC 这一侧能做什么

IDC 给客户提供的递归 DNS,本身就是缓存投毒的目标。只对本机房的地址段开放递归、开启 DNSSEC 验证、两台互为备份并监控应答时间,是自建递归 DNS 的基本要求。客户的服务器该填哪两个 DNS,在 IP 地址管理 里每个 IP 段都可以登记两个 DNS 地址,开通和排障时有据可查,不会出现同一机房的服务器各填各的。

局域网里的 DNS 欺骗,前提是攻击者能冒充网关或伪造源地址发包。接入交换机上把每台服务器的 IP 与 MAC 绑定、开启源地址校验,伪造来源的数据包会被直接丢弃,一台客户机器被入侵后,也很难对同网段的其他客户发起 ARP 欺骗和伪造应答。这两项都可以在 交换机管理 里开启,服务器侧的 MAC 由系统自动学习并绑定,换线和迁移时不用再人工核对。

常见问题

DNS 劫持会自动恢复吗?

要看类型。缓存投毒在伪造记录的 TTL 到期后会消失;本机、路由器被改和运营商劫持不会自己恢复,要改回配置或投诉处理;域名账号被盗更不会,必须先夺回账号、把 NS 改回来,之后各地才会随缓存过期陆续恢复。

网站用了 HTTPS,还会被 DNS 劫持吗?

解析结果照样可能被改,但攻击者拿不到你域名的有效证书时,访客会看到证书错误,而不是悄无声息地进入假网站;开启了 HSTS 的网站,浏览器连“继续访问”的选项都不给。只有攻击者控制了你的域名解析、能申请到正规证书时,HTTPS 才挡不住。

改 hosts 文件能防 DNS 劫持吗?

只能让这一台电脑临时绕过 DNS,网站换 IP 后要手动改,用了 CDN 的网站还会因为写死一个节点而变慢或打不开,不适合作为长期方案。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88