🌈个人主页 :一条泥憨鱼(欢迎各位大佬莅临)

🎬精选专栏传送门:
❄️《数据结构》 ❄️《AI与Agent那些事》
❄️《从0开始学计算机网络》 ❄️《后端开发》

你有没有过这种经历:明明输入的是 `github.com`,结果浏览器打开的却是一个满屏广告的页面。或者昨天还能访问的网站,今天突然就打不开了。你以为是电脑中毒了,重装系统,没用。换浏览器,也没用。
这背后其实是一套挺有意思的机制。今天把这件事讲透:DNS 是干什么的,污染和劫持有什么区别,以及 CDN 又是怎么"反杀"的。

先搞懂 DNS 到底在干嘛
你有没有想过一个问题:你输入 `www.baidu.com` 的时候,电脑怎么知道该连哪台服务器?
互联网上的每台电脑都有一个地址,叫 IP 地址,长得像 `220.181.38.148` 这样。但让你记这串数字太反人类了,所以就有了域名------`www.baidu.com` 这种好记的名字。
那谁来把域名翻译成 IP 地址?这就是 **DNS(域名系统,Domain Name System)**干的事。
你可以把 DNS 想象成电话簿。你想给张三打电话,不用记住他的手机号,翻电话簿找"张三"就行。DNS 就是这本电话簿,只不过它是全世界共享的,而且实时更新。

DNS 查询的基本流程是这样的:
-
你在浏览器输入 `www.example.com`,浏览器先问操作系统:"你知道这个域名的 IP 吗?"
-
操作系统查自己的缓存,没有的话,就去问本地 DNS 服务器(通常是你家路由器或运营商给的)。
-
本地 DNS 服务器如果也没有缓存,就往上问------根服务器、顶级域名服务器(比如 `.com` 的)、最后到权威服务器。
-
权威服务器告诉你:"这个域名对应的 IP 是 `93.184.216.34`"。
-
这个 IP 一路传回你的浏览器,然后浏览器才去连接这个 IP。
整个过程通常只要几十毫秒。快是因为每一层都有缓存,不用每次都从根服务器问起。
好,DNS 的基本原理清楚了。接下来看看它是怎么被"玩坏"的。
DNS 污染------你的快递被"掉包"了
先说最容易遇到的情况:DNS 污染。
还是用快递来打比方。你寄了一个包裹,上面写着收件人地址。正常情况下,快递员会按地址送到正确的人手上。但 DNS 污染相当于:包裹在运输途中,被某个中转站的员工偷偷换掉了------里面的东西被换成了假货,但面单还是原来的。
具体到技术上,DNS 查询走的是 UDP 协议 ,端口是 53。这个协议的特点是快,但不验证对方身份。就像你打个电话过去问路,对方说"我是交警",你就信了。
攻击者可以利用这一点。他往你的 DNS 查询通道里"塞"一个假的响应包,内容大概是:"`www.example.com` 的 IP 是 `x.x.x.x`",这个 IP 指向的是一台恶意服务器。如果你的电脑先收到了这个假响应,就会信以为真。
还有一种方式是缓存投毒。如果你用的本地 DNS 服务器有漏洞,攻击者可以让这个服务器缓存错误的解析结果。这样不只是你,所有用这个 DNS 的用户都会中招。
这里要强调一点:DNS 污染不是你的电脑中毒了。你的电脑是干净的,只是它在"问路"的时候被人指错了方向。
怎么判断自己是不是被污染了?后面我会教你怎么查。
DNS 劫持------快递员被收买了
污染和劫持,听起来差不多,但机制完全不同。
污染是在"路上"动手脚,劫持则是"源头"出了问题。
打个比方:污染是运输途中包裹被掉包;劫持是快递公司内部有人直接把面单改了,所有发往 A 的包裹,都被改发到 B。
技术上有几种常见的劫持方式:
运营商劫持。这是国内最普遍的。你用某运营商的宽带,它在你访问某些网站时,往页面里插入广告代码,或者在 DNS 解析时直接返回它自己的服务器 IP。你访问 `example.com`,它返回一个 IP,这个 IP 上跑着一个带广告的假页面。
路由器被黑。你家路由器被攻破了,DNS 设置被改成攻击者的服务器。这样不管你访问什么网站,都会被引导到钓鱼页面。这种很隐蔽,因为你看不出路由器有什么异常。
权威服务器被攻破。这是最严重的。如果某个域名的权威 DNS 服务器被入侵,攻击者可以篡改解析记录,让全世界所有访问这个域名的人都被引导到恶意 IP。
判断方法其实不复杂。你可以在电脑上打开命令行,用 `nslookup` 命令查一下域名解析结果:
bash
# 用系统默认的 DNS 查
nslookup example.com
# 用公共 DNS 查(比如 Google 的 8.8.8.8)
nslookup example.com 8.8.8.8
```
如果两次结果不一样,而且用默认 DNS 查出来的 IP 明显不对(比如解析出来一个国内的 IP,而这个网站是国外的),那大概率是被劫持或污染了。
CDN 是怎么"反杀"的
讲了这么多"坏消息",来说说正面的东西------CDN(内容分发网络,Content Delivery Network)。
CDN 的核心思路其实很简单:把内容搬到离你近的地方。
你想想,如果你在北京,访问一个服务器在广州的网站,每次请求都要跨半个中国,延迟自然高。CDN 的做法是:在全国甚至全球部署很多节点服务器,把网站的内容(图片、视频、静态文件)复制到各个节点上。
然后,DNS 解析的时候做点"手脚"------根据你的地理位置,返回离你最近的节点 IP。这样你在北京访问,就直接连北京的节点,不用跑去广州了。
打个比方:你在北京点外卖,平台不会让广州的店给你送,而是找你家附近的店。这就是 CDN 的"就近配送"。

那 CDN 为什么能缓解 DNS 污染和劫持?几个原因:
缩短路径。你的请求只到最近的 CDN 节点,不会经过太多中间环节。污染和劫持往往发生在长距离、多跳的路径上,路径短了,被动手脚的机会就少了。
HTTPS 加持。现在主流 CDN 都支持 HTTPS。就算 DNS 被污染,你被引导到一个假 IP,但那个假服务器没有你的证书私钥,浏览器会提示"证书无效"。这相当于给快递加了一把锁,就算包裹被掉包,你也能发现。
智能调度。CDN 的 DNS 解析服务器通常有更严格的防护,而且它会根据你的网络状况动态调整。就算某些节点被污染,也能切换到其他可用节点。
当然,CDN 不是万能的。如果你的本地 DNS 被完全劫持,连 CDN 的调度域名都被篡改了,那也没辙。但至少,CDN + HTTPS 的组合能挡住大部分"低级"的污染和劫持。
普通人能做什么
说了这么多,落到实操。作为普通用户,你能做这几件事:
1. 换公共 DNS
把家里的路由器 DNS 设置改成:
-
Google:`8.8.8.8` 和 `8.8.4.4`
-
Cloudflare:`1.1.1.1` 和 `1.0.0.1`
-
阿里:`223.5.5.5` 和 `223.6.6.6`
这些公共 DNS 服务器防护更好,被污染的概率低很多。
2. 用 DoH / DoT
DNS over HTTPS 或 DNS over TLS。简单说,就是把 DNS 查询加密,别人看不到你查什么,也没法在中间塞假响应。浏览器(Chrome、Firefox)和操作系统(Windows 11、macOS)都支持配置。
3. 尽量访问 HTTPS 网站
看到浏览器地址栏有锁标志的,至少说明传输是加密的。如果访问一个网站提示证书错误,赶紧关掉,别点"继续访问"。
4. 检查路由器
如果怀疑路由器被黑,重启路由器并修改管理员密码。把固件升级到最新版本。
5. 必要时用代理
如果某些网站确实访问不了(比如 GitHub 被污染),可以走加密隧道。但注意,国内用代理访问境外网站需要遵守相关法律法规。
最后送你一个简单的检查命令。在 Windows 命令行或 Mac 终端里:
bash
# 查一下你访问的域名解析到什么 IP
nslookup github.com
# 再对比一下公共 DNS 的解析结果
nslookup github.com 8.8.8.8
```
如果两次结果差异很大,而且你访问 github.com 打开的是别的页面,那基本可以确定是 DNS 被污染了。
DNS 是互联网的"翻译官",这个翻译官被收买了或者被掉包了,你看到的网页自然就不对劲。理解了 DNS 污染和劫持的区别,你就能解释很多网络怪象:为什么有些网站时好时坏,为什么同一个网站不同人访问结果不一样,为什么换了浏览器也没用。
下一步,如果你感兴趣,可以自己抓包看看 DNS 请求长什么样。Wireshark 装一个,过滤 `dns`,就能看到你电脑发出的每一条 DNS 查询。那感觉,比看这篇文章有意思多了。
