playground

DNS

从功能上看,DNS协议用于把域名转换为IP地址。从技术上看,DNS是一个分布式分层数据库,用于存储IP地址,并允许根据名称查询IP地址。

域名

域名末尾有一个隐藏的.代表根域名,在根域名之前的依次称为顶级域名、二级域名、三级域名等。通常在域名供应商处购买的域名是二级域名,如github.com。

DNS服务器类型

本地域名服务器

本地域名服务器也叫递归解析器,它是客户端和DNS域名服务器的中间人。客户端向本地域名服务器发送DNS解析请求后,本地域名服务器会执行一系列的步骤最后将查询结果返回给客户端。通常运营商会提供本地域名服务器,通过DHCP协议自动给客户端分配本地域名服务器的地址。也可以手动设置本地域名服务器的地址,比如常见的114.114.114.114,8.8.8.8等公共递归解析器。

DNS解析过程

假设需要解析的域名是github.com

  1. 客户端首先查询本机DNS缓存,如果存在,则直接向缓存中的IP地址发起请求。
  2. 如果本机缓存没有命中,则查询本机hosts文件是否有域名和IP地址的映射关系。
  3. 如果hosts文件也没有映射关系,则向本地DNS服务器发送DNS请求。
  4. 本地DNS服务器会先在本地缓存中进行查找,如果缓存命中则直接返回,否则继续下面的步骤。
  5. 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回顶级域名.com对应的顶级域名服务器地址。
  6. 本地DNS服务器向顶级域名服务器发送请求,顶级域名服务器会返回二级域名github.com对应的权威域名服务器地址。
  7. 本地DNS服务器向权威域名服务器发送请求并得到IP地址。
  8. 本地DNS服务器将查询结果进行缓存并返回给客户端。

DNS记录

域名服务器可以配置DNS记录,一条DNS记录提供了一个域名的相关配置,比如域名对应的IP地址。记录也分不同的类型,常用的几种类型如下所示:

胶水记录

胶水记录是域管理者向上级域管理者提供的权威服务器主机名和IP地址的映射关系。

例如:com的域管理者向上级(根域.)管理者提供com的权威服务器主机名*.gtld-servers.net和其IP地址(192.5.6.30等)的映射关系。当我们向根域名服务器询问com的权威服务器地址时,根域名服务器会同时返回com的权威服务器主机名以及对应的IP地址,这样就可以直接向该IP地址发起后续的递归请求。如果没有胶水记录,即根域名服务器只返回com的权威服务器的主机名,那么还需要额外的请求解析*.gtld-servers.net对应的IP地址。因此胶水记录的第一个作用是减少递归查询次数,加快DNS查询。

另外一个场景是权威服务器本身托管了权威服务器主机名的解析。例如example.com的解析托管在权威服务器上,而权威服务器自身的主机名是ns.example.com。假设现在要解析a.example.com的IP地址,那么我们需要询问example.com的权威服务器,而该权威服务器的主机名是ns.example.com,导致解析陷入死循环无法继续下去。这种情况下需就用到了胶水记录,即example.com的域管理者向上级com的管理者提供example.com的权威服务器主机名ns.example.com和它的IP地址。当有了胶水记录后,在向com的权威服务器询问example.com的权威服务器地址时,就会返回对应的IP地址,从而打破了上面的循环。

工具

使用dig工具查询DNS信息。

# 指定DNS服务器查询
dig [@dns-server] example.com [DNS记录类型]

# 反向查询
dig -x ip

参考

  1. 《DNS入门:域名结构与域名服务器》
  2. 《谷歌云》
  3. 《What is an SOA Record in DNS?》
  4. 《胶水记录(Glue Record)是什么?有什么作用?》