DNS 是做什么用的?从原理到动手实验
你在浏览器里输入 www.baidu.com,回车,百度页面出来了。这中间不到一秒的时间里发生了什么?第一步就是 DNS 解析。
DNS 到底是干什么的
DNS(Domain Name System,域名系统)做的事情非常简单:把域名翻译成 IP 地址。
互联网上的每一台服务器都有一个 IP 地址——比如 110.242.68.66(百度的 IP 之一)。你理论上可以在浏览器直接输这个 IP,百度也能打开。但问题是谁记得住?
DNS 就是那个"不用你记电话号码的通讯录"。你输入名字(www.baidu.com),DNS 告诉你号码(110.242.68.66)。
DNS 的查询过程
当你输入 www.baidu.com 点回车的那一刻,你的电脑做了以下几步:
第一步:浏览器缓存。 浏览器自己有一层 DNS 缓存。如果你最近访问过百度,缓存里可能有记录。命中缓存直接返回,不用走后面步骤。
第二步:操作系统缓存。 如果浏览器缓存没有,查操作系统的 DNS 缓存。Windows 可以用 ipconfig /displaydns 查看。
第三步:本地 Hosts 文件。 如果操作系统缓存还没有,查 Hosts 文件。Hosts 是你手动指定的"域名 → IP"映射表,优先级最高。这个后面重点讲。
第四步:本地 DNS 服务器。 如果前面都没有,你的电脑向"本地 DNS 服务器"发起查询。本地 DNS 服务器通常是你家路由器或者运营商(电信/联通/移动)自动分配给你的。
第五步:递归查询。 如果本地 DNS 服务器也不知道(缓存里没有),它会代替你一层一层往上问:
你的电脑
→ 本地 DNS 服务器(运营商)
→ 根 DNS 服务器(.)
→ 告诉它 .com 的 DNS 服务器在哪
→ .com 的 DNS 服务器
→ 告诉它 baidu.com 的 DNS 服务器在哪
→ baidu.com 的 DNS 服务器
→ 告诉你 www.baidu.com 的 IP
→ 本地 DNS 服务器把结果返回给你
你的电脑拿到 IP,开始访问百度
这个过程叫"递归查询",通常只需要几十毫秒。
本地 DNS vs 远程 DNS
本地 DNS(Local DNS) 指的是离你最近的 DNS 服务器——通常是你家路由器分配的运营商 DNS。比如你用的电信宽带,你的本地 DNS 可能就是电信的 DNS 服务器。
优点: 物理距离近,延迟低,解析速度快。
缺点: 运营商 DNS 可能会做"劫持"和"污染"。你没输错域名,但它把你跳转到广告页——这就是 DNS 劫持。你访问某个境外网站,它返回一个错误的 IP——这就是 DNS 污染。
远程 DNS(Public DNS) 指的是第三方公共 DNS 服务器,比如:
- 阿里 DNS:
223.5.5.5/223.6.6.6 - 腾讯 DNSPod:
119.29.29.29 - 百度 DNS:
180.76.76.76 - Google DNS:
8.8.8.8 - Cloudflare DNS:
1.1.1.1
优点: 一般不会劫持、不会污染、解析稳定。
缺点: 如果你在国内用 Google 的 8.8.8.8,延迟很高(200ms+),拖慢所有上网体验。
建议: 国内用户用阿里 DNS(223.5.5.5)或腾讯 DNSPod(119.29.29.29)。速度快、不劫持、免费。不要在国内用 8.8.8.8——除了"我觉得 Google 牛逼"之外没别的好处,延迟高得多。
Hosts 文件:DNS 的"最高优先级"
前面说 DNS 查询会查 Hosts 文件,而且优先级最高。这意味着:你可以通过修改 Hosts 文件,让你电脑上 www.baidu.com 指向任何 IP。
实验:让百度变成另一个网站
假设你有一台自己的服务器,IP 是 123.123.123.123,上面跑着一个网站。你想让你的电脑访问 www.baidu.com 时打开的是你自己的网站,而不是真正的百度。
Step 1:找到 Hosts 文件。
- Windows:
C:\Windows\System32\drivers\etc\hosts - Mac/Linux:
/etc/hosts
Step 2:用管理员权限打开这个文件。
Step 3:在文件末尾加一行:
123.123.123.123 www.baidu.com
Step 4:保存,打开浏览器,输入 www.baidu.com。
你看到的不是百度,是你自己的网站。
如果你没有自己的服务器,也可以试试把百度指向一个本地地址。把这行加进去:
127.0.0.1 www.baidu.com
然后访问 www.baidu.com——打不开了。因为 127.0.0.1 是你自己的电脑,你自己的电脑上可没有百度。
Hosts 的其他用途
屏蔽网站。 把广告网站的域名指向 127.0.0.1,这些广告就打不开了。有些"去广告 Hosts"分享的就是这么一个原理。
开发调试。 你的网站还没上线,但你已经绑定了域名。你把域名在 Hosts 里指向测试服务器的 IP,就能用真实域名进行调试。
加速访问。 你知道某个网站的真实 IP,而且你本地到这个 IP 更快——在 Hosts 里直接绑定,跳过 DNS 查询。不过 CDN 普及后这个技巧不太好用了——CDN 的 IP 是动态变化的。
DNS 相关的安全问题
DNS 劫持。 你用的是运营商的 DNS,它故意把某个域名解析到错误的 IP——可能是广告页,可能是钓鱼网站。换公共 DNS(223.5.5.5)能解决大部分情况。
DNS 污染(投毒)。 在 DNS 查询的过程中,中间设备伪造了一个假的响应,把你引导到错误的地址。DNSSEC(DNS 安全扩展)能防止这种攻击,但在国内应用还不广泛。
DNS over HTTPS(DoH)。 把 DNS 查询加密,通过 HTTPS 协议传输。运营商看不到你查询了哪个域名,也就没法劫持或污染。主流浏览器(Chrome、Firefox、Edge)都支持 DoH。
小实验:自己查 DNS 记录
打开命令行:
# Windows
nslookup www.baidu.com
# Mac / Linux
dig www.baidu.com
你会看到类似这样的输出:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 300 IN A 110.242.68.66
www.a.shifen.com. 300 IN A 110.242.68.67
CNAME记录:www.baidu.com是www.a.shifen.com的别名(百度用了 CDN)A记录:www.a.shifen.com解析到110.242.68.66和110.242.68.67两个 IP1200和300:TTL(Time To Live)——这条记录的有效期(秒)。过期后需要重新查询。
你可以试试 dig baidu.com 和 dig www.baidu.com——会发现返回的 IP 不一样。因为百度用了 CDN,www 的前缀走 CDN 节点,不带 www 可能走另一个集群。
最后
DNS 是互联网上最"老"也最"隐形"的基础设施。你没有注意到它的时候,它工作得最好。你注意到它的时候——网站打不开、被跳转广告——八成是 DNS 出了问题。
记住一句话:DNS 就是把名字翻译成数字的通讯录。Hosts 是这个通讯录里最优先的那一页——你在上面写了什么,系统就信什么。