浏览器输入网址按下回车,打开页面和预期内容完全不一样。页面充斥广告,弹出网站风险提示,或是直接跳转到运营商导航页面,反复核对确认网址输入无误。不少人碰到过这类情况,但不清楚现象名称,也不知道问题根源。
这种现象叫做DNS劫持,由运营商在解析链路当中篡改数据引发。
前面已经介绍DNS,作用就是把域名翻译转换成IP地址。输入zhihu.com之后,DNS系统返回知乎服务器IP地址,浏览器再向该IP请求页面内容。正常访问流程就是这样。但运营商管理的递归DNS服务器,返回解析结果的时候,不一定返回真实服务器IP。有可能返回运营商自身服务器IP,服务器页面存放广告内容,访客打开页面就看到广告。

要区分DNS劫持和DNS污染。DNS劫持由运营商主动操作,运营商掌控递归DNS服务器,可以自主修改返回IP。DNS污染触发场景大多在跨境域名查询链路,第三方设备向解析响应数据包植入伪造结果,让域名解析指向错误IP。两者都会造成无法正常访问目标站点,但底层原理和触发动机不一样。
运营商开展DNS劫持存在两方面原因。广告收益是重要诱因。用户输错域名跳转推广页面,页面当中链接点击可以产生商业收入。运营商手握海量用户DNS查询记录,流量变现空间很大。另一层比较隐蔽的原因和内容管控相关,部分域名按照要求不能正常解析,运营商在DNS层面做拦截,返回风险提示页面或者空解析结果。
普通用户很难定位问题根源。大部分人遇到页面跳转广告,第一反应判定电脑中毒或者浏览器被劫持,安装杀毒软件、重置浏览器,反复操作之后问题依旧。问题根源不在本地电脑,而是运营商DNS服务器。更换浏览器、重装操作系统都无法解决劫持。
可以采用的应对办法。最简单直接的方式更换无劫持公共DNS服务器。阿里DNS、腾讯DNS、114DNS这类公共DNS,正常场景不会植入广告。路由器或者电脑网络设置,把DNS选项从自动获取修改为手动填写,填入223.5.5.5或是119.29.29.29,很多劫持问题可以解决。操作难度不高,但了解这项方案的用户不多,多数人甚至不清楚DNS概念,更不会手动修改。
更换公共DNS并不是万能方案。如果运营商在底层链路实施拦截,直接封禁公共DNS服务器IP,或是在用户设备和公共DNS通信链路篡改数据包,更换DNS依旧无效。这种场景就需要加密DNS,DoH、DoH对DNS查询加密处理,链路中间设备无法读取查询域名,也不能篡改返回结果。浏览器开启DoH或是路由器配置DoT,可以绕过大部分劫持。国内加密DNS公共服务可用性不稳定,部分地区访问加密DNS节点会受到干扰。
还有更深层次的问题,运营商DNS劫持的合规边界。按照《电信条例》以及工信部相关管理规定,运营商不允许擅自中断通信服务,篡改用户数据。DNS劫持在解析结果插入广告,严格来说侵犯用户知情权与选择权。但是实际场景用户举证、维权难度很高。打开页面看到广告,很难证明广告来源是运营商劫持,而不是网站自身投放广告。就算取证成功,单个用户投诉运营商,时间成本高,获得回报很低。
技术圈子针对DNS劫持讨论很多年,问题始终没有彻底解决。监管层面曾经开展整治,要求运营商清理DNS劫持广告,但落地执行效果参差不齐。部分地区劫持行为有所收敛,部分地区更换形式继续开展劫持。普通用户能做的,就是自行更换DNS或者启用加密DNS,拿回解析链路控制权。至于运营商什么时候停止这类操作,需要监管压力上升到让运营商承担更高违规成本才有可能实现。