很多朋友一听“黑客技术”四个字第一反应就是终端里滚动的绿色字符、幽暗屏幕前的神秘人以及电影里那种敲几下键盘就能黑进对方系统的场面。真正接触安全这一行之后你会发现相当一部分被媒体报道成“黑客攻击”的事件底层原理并没有想象中那么玄乎。就拿DNS劫持来说——这可能是普通用户和中小企业遇到频率最高的网络安全问题之一而它的原理、排查方法和防御手段半天时间就能理清楚。这篇文章的话题是“黑客技术没你想象的那么难——DNS劫持篇”但我想说的不是它不值得重视恰恰相反正是因为原理门槛不高它才会被大规模使用每年都有大量站点和普通家庭网络栽在上面。理解这一点你才能更好地保护自己和手上的业务。文章会从DNS的工作链路讲起拆解常见劫持类型再给出一套可以照着做的排查流程和加固方案最后复盘一个我处理过的真实案例已脱敏。无论你是刚接触安全的小白还是维护着网站、后台甚至只是家里路由器被人动过的普通用户都能从中找到能直接上手的部分。1. 先说结论DNS劫持为什么属于“原理不难”的攻击方式1.1 DNS的日常完整链路一次访问背后的多次问答要理解劫持先得知道DNS平时是怎么干活的。你在浏览器里输入一个域名比如example.com背后其实有一连串的“问路”动作。浏览器先去查本地缓存看自己之前有没有记录过这个域名对应哪个IP地址没查到就去问操作系统操作系统再查系统级的DNS缓存还没有就会去看本地一个叫hosts的静态映射文件如果hosts里也没有系统才会把请求发给你配置的DNS服务器。这还不是终点你配置的DNS服务器如果也不知道它还得替你去问根域名服务器、问顶级域名服务器、最后问到example.com的权威域名服务器拿到最终答案后再一层层传回来。整个过程看起来环节很多但每一步逻辑都非常简单。唯一的麻烦是这条链路实在太长而每一个环节都有可能被动手脚。你只要把DNS理解成“网络世界的翻译官”——负责把人类易记的域名翻译成计算机能理解的IP地址——那么劫持的本质就一句话有人在你问路的时候给你指了个错误的方向而你以为这就是正确路线。1.2 劫持的本质在“翻译环节”给一个假答案DNS劫持不是说攻击者一定要攻破某个大服务器它的核心思路是干预“翻译结果”。你问bank.com在哪正常的答案是“在1.2.3.4等你”被劫持后系统可能给你返回“在5.6.7.8等你”而5.6.7.8是一台攻击者控制的机器。你根本不会察觉因为浏览器地址栏里输的确实是正确的域名打开的页面内容也可以被伪造得和真站几乎一样。更直白的类比是你打电话问114“某公司客服电话是多少”114给了你一个错的号码而你不知道这个号码是假的。接下来你联系到的“客服”当然不是真正的客服你告诉它的一切信息都会被对方利用。DNS劫持干的就是这件事——它不直接攻击你的电脑而是在“翻译”这个中间环节把关键信息替换掉。1.3 为什么“不高深”却被传得很神秘这里有个很实际的问题既然原理这么简单为什么很多新闻把它描写成“高级黑客行为”原因有三。第一传统DNS协议默认使用UDP明文传输而且历史上很长一段时间没有完整性校验。第二DNS链路上的“可介入点”太多了本机配置、hosts文件、路由器、运营商网络、公共递归DNS、甚至域名托管商的账号任意一个被拿下解析结果就可能被篡改。第三劫持之后的表现非常直观——网页打不开、页面被插广告、输入A网站却被带到B网站普通用户很容易把原因归结为“电脑坏了”或“网站挂了”。真正让攻击显得复杂的只是攻击者把这几个简单环节组合成一条自动化链条。所以文章标题我才说“没你想象的那么难”这不是低估安全问题而是提醒大家一个原理简单的攻击如果被无视杀伤力反而更大。2. 拆解常见劫持类型每个环节都有人盯上DNS劫持并不是只有一种玩法。按介入位置划分常见的有四类本地劫持、网络设备劫持、链路侧劫持、递归服务器缓存污染。下面逐个拆开看每类劫持的现象和排查侧重点都不一样。2.1 本地劫持入口文件与系统设置本机层面的劫持最典型的操作对象是hosts文件和系统DNS设置。hosts文件是一个纯文本文件里面的内容是“域名 空格 IP地址”作用是在电脑发起DNS查询之前先检查这个静态映射表。如果这里面被写入一条记录比如127.0.0.1 example.com那么所有访问example.com的请求都会被指向本地回环地址也就是自己访问自己页面自然打不开。更麻烦的是它可以把bank.com指向一个伪造页面服务器的IP用户毫无察觉。系统DNS设置被篡改是另一条常规路径。Windows可以在网络适配器属性里看到“首选DNS服务器”这一项正常情况下它填的是你运营商或公司分配的地址也可能是公共DNS。恶意软件可以修改这个值让你所有查询都发给它指定的服务器由它来决定返回什么结果给你。这类劫持常见于下载了不明软件、点击了奇怪的激活脚本、U盘病毒传播。排查起来也算简单——打开hosts文件检查有没有可疑条目再进系统网络设置里看一眼DNS地址是否被改动过。不过要注意的是恶意软件防篡改做得越来越隐蔽它会伪装成系统进程来修改配置所以只靠肉眼检查还不够最好配合杀毒软件一起处理。2.2 网络设备劫持最容易被忽略的家庭路由器路由器在局域网里的地位相当于“网络交警”它负责给每一台上网设备分配IP地址告诉它们网关在哪同时也会通过DHCP协议把DNS服务器地址下发给所有设备。这意味着只要路由器被攻破攻击者不用去动你的电脑或手机就能让家里所有设备都使用恶意的DNS服务。路由器能被攻破最常见的原因是弱口令。很多人买回路由器后管理密码设置得极其简单甚至直接沿用出厂默认账号密码。攻击者扫描到设备后顺手一试就进去了然后在后台把DNS服务器地址改成自己的。从此以后你家里的电脑、手机、平板访问任何网站都要先经过它指定的“翻译官”。更隐蔽的是有些恶意固件会把修改藏得很深你登录路由器后台看到的DNS地址是正常的但实际下发到设备的配置却是另一套。所以排查的时候不仅要看路由器后台还要看电脑上实际获取到的DNS地址。碰到这种情况最佳做法是重置路由器、升级固件、修改管理密码然后重新设置网络。2.3 链路与运营商侧劫持你看到的解析结果来自哪里这一层劫持发生在“设备到递归DNS服务器”之间的传输链路上。传统DNS查询是明文的UDP报文只要攻击者能接入网络链路比如在公共WiFi的出口、在运营商骨干网的某个节点、甚至在某些小机房的路由设备上做手脚就可以在合法的DNS响应返回给你之前抢先伪造一个响应包发给你。普通用户遇到最多的可能不是“违法劫持”而是运营层面的内容改写。比如你访问一个正常的网站却看到页面底部被插入一段广告或者访问某个域名时被重定向到提示页、充值页。这些现象的根源之一就是链路侧或运营商侧对DNS响应做了篡改把部分域名解析到了他们的广告服务器上。链路劫持不容易从你这一端直接确认因为你的电脑没有做错任何事你配置的DNS服务器也没有问题问题出在“你的请求从家里到DNS服务器”这条路上。验证手段是用加密DNS下文会讲或者对比多个网络环境下同一域名的解析结果。2.4 递归服务器缓存污染公共DNS也并非“绝对纯净”递归DNS服务器的工作方式很像一个大号缓存库。用户问它某个域名时它先去查缓存缓存没有再向根、顶级域和权威服务器发起递归查询。为了让查询更快它会将结果缓存一段时间比如几分钟到几小时。缓存污染或者说DNS投毒针对的就是这个缓存过程。攻击者想办法让递归DNS服务器在缓存里留下一份错误的解析记录。此后该服务器覆盖范围内的所有用户查询这个域名都会直接得到被篡改的IP地址。这类攻击在传统DNS协议场景下难点在于猜对事务ID和端口号但随着协议老化和攻击工具自动化程度提高它并没有想象的那么难防御。公共DNS服务虽然维护团队技术实力更强部署了各种流量清洗和DNSSEC校验但仍然可能因为协议本身的问题在特定网络环境下面临污染风险。不要觉得“用了公共DNS就一定安全”它只是把风险概率降到了一个比较低的水平不代表你可以完全不管其他环节。为了更直观对照我把四类劫持放在一个表里劫持类型介入位置典型现象主要排查方向本地劫持hosts文件、系统DNS设置特定网站打不开或跳转异常检查hosts、查看网卡DNS配置路由器劫持路由器后台、DHCP下发的参数局域网内所有设备同时出现异常登录路由器检查设置和固件链路/运营商侧劫持客户端到递归服务器之间的链路上页面被插广告、访问被重定向用加密DNS对比验证递归服务器缓存污染公共或自建递归服务器的缓存大片用户同时解析到错误IP更换DNS做交叉验证3. 排查链路从怀疑到确认的完整过程很多人问我“我怎么知道自己是不是被DNS劫持了”其实排查思路很固定不用懂什么高深原理按下面这条链路走基本能定位到问题环节。3.1 症状清单什么情况首先想到DNS劫持先对照一下现象。以下几条中出现任意一条优先把DNS劫持列入怀疑对象访问某几个网站时明明输入的是正确域名跳到的页面却完全无关甚至出现广告页、红包页、充值页。同一个网站在手机上能打开电脑上打不开或者反过来用WiFi打不开切到手机流量就能打开。浏览器访问时出现证书错误提示该网站的安全证书与域名不匹配但你确认自己没输错网址。电脑里反复出现“DNS错误”“无法解析服务器的DNS地址”但重启路由器和电脑后只能好一阵子。域名像“抽风”一样有时解析到正确的服务器有时解析到一个完全陌生的IP。需要说明的是这些现象也可能是其他故障引起的比如网站服务器宕机、本地网络配置问题、浏览器插件篡改。所以“怀疑”只是第一步还需要用命令去验证。3.2 命令行取证nslookup、ipconfig与dig的正确用法在Windows上我用得最多的一套命令是这样走的先看本机实际生效的DNS服务器是哪台ipconfig /all在输出里找到“DNS Servers”一项记下对应的IP。这一步很关键因为很多时候你以为自己用的是某个公共DNS实际上系统里配置的可能是另一串地址。然后用系统默认解析器去查目标域名的解析结果nslookup example.com系统会返回服务器地址和域名对应的IP。如果返回的IP不是你熟悉的真实服务器IP先别急着下结论还需要换一个公开DNS再查一次。在macOS和Linux上对应的查看DNS命令是cat /etc/resolv.conf查询解析结果的命令则更推荐用dig输出更详细dig example.comWindows上也有nslookup最够用关键是后面跟上指定DNS地址的参数。3.3 交叉验证法三组DNS地址对照结果交叉验证的核心思路很简单在同一个网络环境、同一台电脑上换用不同的DNS服务器去查同一个域名如果结果不一致说明某个环节有问题。命令示例第一组用系统的默认DNS查nslookup example.com第二组指定公共DNS A来查nslookup example.com 114.114.114.114第三组指定公共DNS B来查nslookup example.com 8.8.8.8记录三组命令返回的IP地址通常会出现三种情况情况一三组结果一致但都指向一个陌生IP。这说明解析链路大概率正常问题出在上游权威解析记录本身。也就是说域名托管商那边的A记录可能被改了或者服务器那边换了IP而DNS没同步。这种情况需要登录DNS托管平台后台去核对解析记录。情况二系统默认DNS的结果和公共DNS结果不一致。优先怀疑本机DNS配置或路由器劫持。因为公共DNS返回的往往是相对可信的结果而系统默认DNS可能是被改过的或路由器下发的恶意地址。再进一步查看路由器后台看DHCP设置里下发的DNS是哪个。情况三系统默认和公共DNS的结果一致但与“真实IP”不一致。怎么判断“真实IP”如果你是站长去云服务商控制台看服务器公网IP直接对比即可。如果你只是普通用户可以去在线IP查询平台查这个域名对应的真实IP或者对比手机运营商网络下的解析结果。如果权威记录确实被改接下来要处理的就不是“本地清理”这么简单了。这里也提一个我常用的进阶命令Linux/macOS下可以追踪完整解析路径dig example.com trace它能展示DNS查询从根服务器到权威服务器的全过程适合确认问题是否出在某个中间环节。3.4 确认后的取证动作留好“案发现场”再动手很多人发现DNS异常后第一反应是立即改设置、刷缓存结果没留证据后面想追查都不知道从哪里入手。正确做法是先把现场固定下来。具体记四样东西异常发生的时间、当前系统生效的DNS服务器IP、解析出的可疑IP、正常情况下的真实IP。前面命令的执行结果最好直接保存一份文本日志。这些信息后续无论是报修、投诉、还是联系域名托管商协查都很有用。比如你确认了本机DNS被改成了一台可疑地址先不要急着改回去可以先用nslookup多查几个域名看看这台服务器的解析规律。同时检查hosts文件有没有被动过手脚杀毒软件全盘扫描一遍确认是单纯配置问题还是设备已经中招了。处理完以后再回到修改配置的步骤。4. 防御加固从终端到服务的分层方案排查完之后更重要的环节是加固不让同样的问题再发生。我把方案按场景分成三层个人终端层、网络设备层、服务端业务层。4.1 个人终端三件事必须做第一件事把系统DNS设置为可信的公共DNS地址。Windows和手机都可以手动指定DNS服务器。这里要强调一下设置完以后还是得复查因为部分恶意软件会在系统启动时重新覆盖配置。第二件事清理hosts文件并恢复默认。Windows的hosts路径是C:\Windows\System32\drivers\etc\hostsmacOS和Linux在/etc/hosts。打开后逐行检查正常情况下里面大多是注释项如果发现可疑的映射记录先备份再删除。第三件事升级系统和浏览器。现代浏览器普遍支持自动启用DoHDNS over HTTPS也就是说浏览器会通过加密HTTPS连接去查询DNS不再走传统明文链路。系统更新则能修补恶意软件常用的漏洞降低本机被种下劫持模块的概率。不用刻意去配置太复杂的东西确认系统补丁更新到了最新、杀毒软件开启实时监控就把一大半风险挡在了门外。4.2 网络设备路由器也需要单独加装“防护层”路由器是家庭网络的总闸门也是最容易被忽略的防御节点。个人终端做得再到位路由器一旦被改所有设备还是会被带走。第一步就是改管理密码。很多路由器出厂默认账号依旧是“admin/admin”这个一定要改。密码不要用生日、手机号这种短口令至少12位以上混合大小写、数字和符号。第二步补安全设置。关掉WPSWi-Fi Protected Setup功能这个功能方便但漏洞不少关闭路由器的远程管理或者至少限制为仅局域网访问开启Wi-Fi加密用WPA2/WPA3不要用古老的WEP。第三步升级固件。路由器固件更新不像电脑系统那么频繁但厂商一旦发布安全更新尽量及时升级。部分路由器还能在“DHCP设置”中指定下发的DNS地址你可以直接在这里统一设置为可信公共DNS这样下面所有设备都会自动使用它。有条件的话把访客WiFi和常用设备分开避免访客设备中毒后影响到智能家居或电脑所在的网络段。这些动作不需要任何编程基础在路由器后台点几下就行关键是愿意花这十来分钟。4.3 服务端和域名持有者别让账号安全成为突破口如果你负责维护网站、小程序或者任何线上业务DNS劫持带来的后果会比普通用户严重得多。因为一旦域名解析记录被改所有访客都会被引导到恶意页面业务形象和用户数据都会受损。这类事故的根因十有八九不是协议漏洞而是域名托管平台的账号被攻破了。所以服务端侧的第一要务是给域名注册商和DNS托管平台的账号开启两步验证。两步验证相当于多一把锁即使账号密码泄露攻击者也很难登录进去改解析记录。第二登录DNS托管平台后台逐个检查解析记录。不只检查A记录还要看是否有异常的TXT、CNAME、MX记录。攻击者在拿到控制权后有时会顺手加一条隐蔽的子域名解析用于后续垃圾邮件发送或钓鱼页面部署。第三为域名开启DNSSEC签名校验。DNSSEC是一个专门用来防止DNS伪造的技术它会给DNS响应加上数字签名递归服务器收到响应后会验签验不过就丢弃。目前主流域名托管商都支持一键开启DNSSEC只是一些老用户一直没注意。开启前先确认托管平台是否支持避免签名算法不匹配导致解析失效。第四配置解析变更告警。部分DNS服务商提供“解析记录变更通知”功能开启后任何A记录、CNAME、MX等记录被修改都会第一时间发短信或邮件通知你。这一点很实用至少能让你在攻击发生后的几分钟内发现异常而不是等用户投诉了才知道。4.4 进阶方案DoH/DoT与DNSSEC的适用场景很多人分不清DoH、DoT和DNSSEC这几个概念我用自己的话说一下。DoHDNS over HTTPS和DoTDNS over TLS解决的是“查询过程被偷听和篡改”的问题。DoH把DNS查询内容塞进HTTPS请求里走443端口和网页流量合在一起普通网络审计很难单独识别DoT则给DNS查询专门建一条TLS加密隧道。两者都是加密通道区别只是封装方式不同。它们的共同缺点是如果本机被恶意软件控制攻击者可以绕过系统设置直接不加密查询所以它们防的是链路侧篡改不是终端病毒。DNSSEC解决的是“DNS响应本身真假”的问题。它给权威解析记录加上签名递归解析服务器可以验证响应是否真的来自权威服务器。它不加密DNS请求内容但能确保证完整性。对托管重要域名的人来说DNSSEC很值得开对普通用户你无法直接控制权威服务器是否开启了签名所以更多是公共DNS那边替你做校验。这三者不是替代关系而是互补关系。终端网络环境好可以同时启用DoH和DNSSEC企业自建递归DNS可以在解析器上启用DNSSEC验证再配合DoT上游转发链路安全性会明显提高。4.5 常见误区DNS不劫持不等于网络攻击到不了你先说第一个误区“我用了HTTPSDNS被劫持也没关系。”严格来说HTTPS能保护传输内容的加密和完整性防止中间人读取或篡改网页内容但它不能防止DNS把所有域名都解析到一个错误地址。访问到大面积提示错误页甚至被引导到看起来一模一样的钓鱼页面依然可能发生。如果你的浏览器还能显示一把锁说明证书校验没有失效这能挡住多数低水平钓鱼但如果攻击者伪造的页面能通过免费证书申请用户又在证书告警时点了“继续访问”HTTPS也帮不了你。第二个误区“换个公共DNS就高枕无忧了。”公共DNS确实比运营商默认DNS在安全性上更透明但它不负责解决你本机hosts中毒、路由器被篡改、域名托管账号被盗等问题。把公共DNS当成唯一防护手段迟早会在其他环节上吃亏。第三个误区“DNS劫持跟病毒无关清理一下设置就好。”实际上很多劫持的根本原因是终端已被恶意软件控制它会在后台反复修改配置。你已经设置好了没过几天又变回去这种情况要优先考虑清杀病毒。第四个误区“只有大企业才会被盯上。”小型个人站点和博客同样会被DNS劫持用于SEO菠菜引流、弹窗广告。经济价值不一定直接来自你而来自“借用”你的域名信誉和流量。5. 一次现场复盘网站首页被替换事件的前因后果前面讲了原理和防御最后说一个我处理过的案例。为了保护隐私以下人名、域名、IP均已替换。5.1 现象为什么用户看到的是红包页面A同学运营着一个本地生活服务平台网站访问量不高但用户群很稳定。某天客服接到反馈用户从浏览器收藏夹打开网站居然跳到一个“XX红包领取”的活动页面页面风格和正规活动完全不同而且浏览器地址栏还出现了证书告警。A同学自己试了一下电脑上访问正常手机连WiFi访问也正常但切到手机流量访问时正常回到WiFi就不正常了。一开始他以为是路由器缓存问题重启了路由器问题依旧。5.2 排查三组DNS对照之后问题定位到了上游我让他按上面交叉验证的方法操作。第一组命令用他公司网络默认DNS解析返回的是203.0.113.10第二组用公共DNS解析返回的是198.51.100.23第三组再用另一组公共DNS解析返回的依然是198.51.100.23。两组公共DNS结果一致但和公司默认DNS返回的不一致。按照前面的判断逻辑问题应该出在公司网络的本地DNS获取环节大概率是路由器被动了手脚。但登录路由器后台检查后发现DHCP设置里填写的DNS地址很正常也没有发现异常下发记录。这时我们换了一个思路直接把电脑网卡的DNS手动设置为公共DNS地址再解析一次域名结果竟然还是203.0.113.10。“ 既然电脑端已经明确指定了公共DNS为什么解析还是指向那个可疑IP” 答案只剩下一个这个域名的权威解析记录本身已经被改了。登录域名托管平台的后台后果然在解析记录列表里发现主域名的A记录被篡改成了203.0.113.10。而198.51.100.23才是A同学服务器真正的IP。也就是说攻击者不是劫持了哪台路由器而是直接拿到了托管平台的登录权限把域名的“官方翻译结果”给换了。公司网络里显示异常只是因为本地DNS缓存还没有刷新切到手机流量后手机用的是运营商DNS缓存内容不同所以才时好时坏。5.3 修复改密码、开两步验证、清理残留记录修复动作分四步。第一步立即修改DNS托管平台的登录密码并且强制退出所有已登录会话。因为不确定攻击者是否还留在后台修改密码后还要检查是否存在API密钥、子账号之类的后门。第二步开启两步验证。这一步尤其重要否则密码泄露的问题解决不了下一次还会被人登进来。第三步修正A记录把example.com重新指到198.51.100.23同时清掉解析列表里多出来的几行可疑子域名记录。为了安全我们顺手把域名的TTL值调低到300秒等全球解析缓存逐步过期用户就能在较短时间内恢复正常访问。第四步通知相关部门和用户清除本地DNS缓存等待一段时间后再访问。如果还有用户反馈异常可能是某个地区的递归服务器缓存还没过期需要再等等。5.4 复盘这类事故的根因通常是账号安全而不是DNS协议这个案例最值得复盘的一点是一开始大家习惯性地怀疑路由器、怀疑链路最后发现真正的突破口是托管平台账号。DNS劫持未必非得在“链路”上动手把权威解析记录改了相当于在源头把翻译官买通了影响范围反而更大。检索下来托管平台的账号疑似在某次第三方站点数据泄露中暴露了密码密码强度一般又没有开启两步验证攻击者拿密码直接登录一分钟就能完成修改。整个过程没有涉及任何复杂技术却造成了业务中断和用户信任度下降的严重后果。后来我给A同学的建议很简单把所有和域名、服务器相关的账号统一整改一遍密码随机化能开两步验证的全部开启解析变更通知也配置上线。至少目前看来类似问题没有再出现过。我自己在这些年的安全排查里最大的体会是最有效的往往不是那些听起来很高深的攻防技巧而是把基础配置做好。DNS劫持原理再简单也架不住你连管理密码都没改原理再复杂只要开启两步验证和DNSSEC攻击的性价比就会大打折扣。希望这篇内容能帮你把这条容易被忽略的安全防线补上下次再遇到“网站打不开、跳转到奇怪页面”的情况脑子里能第一时间多出一个排查方向。
阅读完成 · 觉得有帮助?