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.comwww.a.shifen.com 的别名(百度用了 CDN)
  • A 记录:www.a.shifen.com 解析到 110.242.68.66110.242.68.67 两个 IP
  • 1200300:TTL(Time To Live)——这条记录的有效期(秒)。过期后需要重新查询。

你可以试试 dig baidu.comdig www.baidu.com——会发现返回的 IP 不一样。因为百度用了 CDN,www 的前缀走 CDN 节点,不带 www 可能走另一个集群。

最后

DNS 是互联网上最"老"也最"隐形"的基础设施。你没有注意到它的时候,它工作得最好。你注意到它的时候——网站打不开、被跳转广告——八成是 DNS 出了问题。

记住一句话:DNS 就是把名字翻译成数字的通讯录。Hosts 是这个通讯录里最优先的那一页——你在上面写了什么,系统就信什么。

一名痴迷于计算机技术的学生~