A DNS Refresher
最近在调研CoreDNS如何为Kubernetes集群内的Service提供DNS服务发现。但是在开始CoreDNS之前,需要对DNS的基础知识有所了解,本篇主要对DNS的学习过程做下记录。
DNS是什么?
DNS全名是Domain Name System
,通过DNS系统,可以通过domain name查询IP,也可以通过IP反查domain name,除此之外DNS还可以与Mail system结合,提供Mail routing的功能,并且DNS不仅仅是一个域名系统,也是全世界最大的分布式数据库(不同的Zone存储着各自的Zone文件)。
简单理解就是: 你在浏览器上输入www.google.com
域名之后,通过DNS解析之后,会给你Answer一个217.160.0.201
地址。然后浏览器通过这个IP地址加端口号去访问最终的服务。
DNS基本概念
Domain Names and Namespace
DNS Namespace
DNS namespace是一颗倒置的树,并且除了root node节点允许为空外,其它节点不允许空,并且每个node的内容需要有一个最长为63个字符的label。 下图为一个虚构的DNS namespaces:
Domain Name
在一个DNS namespace树中,从叶子节点到根节点,这一条路径的组合被叫做
Domian name
. 如下图所示是一个www.baz.example.
的Domain name
。
接下来,让我们看Domain name
是如何被分组的,并且如何对其进行管理。
Domains, Delegation and Zones
Domain
将这个internal分成许多个domain, 每个domain下又会细分为许多个domain,然后这些细分的domain会根据实际的情况在进行更细粒度的划分。并且每一部分domian都会有相应的组织去维护和管理。例如: Google管理
google.com
, UC Berkeley管理berkeley.edu
等。下面是一个foo.example Domain的例子:
Delegation
每个Domain都可因实际的需求再细分成许多sub domain。上层的domain可以将其分出的某一个sub domain的domain name与IP mapping交由另一个组织去管理。这个动作我们称为
Delegation
.举个例子: 我们可以把
berkeley.edu
这个domain,分成两个不同的sub domain,一个是cs.berkeley.edu
和music.berkeley.edu
交由两个不同的学院去各自维护。Zones
上面提到的基本每个domain交由一个特定的组织去管理,其实更准确的说应该是每个Zone交由一个name server来负责,所谓的zone就是domian的一部分。下图是一个具体的例子:
<div align=left>
Resource Records
之前我们简单的说过DNS是一个分布式数据库,但是每个数据库中存储的数据格式是什么样的?
DNS会在每一个Zone的nameserver上维护一个叫做Zone data file
的文件,该文件中保存了该Zone范围内所有的mapping关系。并且该文件中的每一行代表一条resource record
。
resource record
是DNS存储数据的基本单位。resource record
记录的格式如下:
1 | [NAME] [TTL] [CLASS] TYPE RDATA |
下面是一个Zone data file
文件的样例:
每个resource record
有不同的Class
(但是通常Class为IN)和Type
,先简单的介绍下比较通用的resrouce record
:
- A(IPv4 addresss): Maps a domain name to a single IPv4 address.
- AAAA (IPv6 address): Maps a domain name to a single IPv6 address.
- CNAME (alias): Maps a domain name (the alias) to another domain name (the canonical name).
- MX (mail exchanger): Names a mail exchanger (mail server) for an email destination.
- NS (name server): Names a name server (or DNS server) for a zone.
- PTR (pointer): Maps an IP address back to a domain name.
- SRV record - Specifies a port for specific services.
- SOA (start of authority): Provides parameters for a zone.
DNS Servers
DNS server主要负责两方面:
- 对于一个domain name的query动作进行Answer。
- 对于一个domain name的query去其它的DNS server query。
从上面这张图可以看到,每个Zone内通常存在两个DNS server,一个叫Promary DNS server
,另一个叫做Secondary DNS server
。这种关系其实就是master/salve的关系,Primary DNS Server
会通过zone transfer
机制去向Secondary DNS server
同步zone data file
记录,当其中一个DNS server挂掉之后,不会导致这个Zone不能进行domain name的解析工作。
其中,每个Zone的DNS server都会维护一个叫做zone data file
的文件,该文件中记录了该Zone的所有domain name的记录数据,DNS server会加载zone data file
的记录用于DNS解析工作。并且DNS server也可以通过zone transfer
的机制,加载其它DNS server的zone data file
。
DNS是如何工作?
为了更好的理解DNS对domain的解析流程,首先介绍下DNS服务器的种类:
What is a DNS recursive resolver?
从上面这张图,可以看到recursive resolver
在DNS解析过程的位置是在client和DNS nameserver之间,当client发起DNS查询请求时,首先会经过recursive resolver
,如果在recursive resolver
维护的cache中已经有请求的记录则直接返回给client,否则recursive resolver
会依次向root nameserver
,TLD nameserver
和authoritative nameserver
进行DNS的请求查询,然后将查询到的数据响应给请求的客户端,
并同时缓存这部分数据到本地的缓存中,用于提高下次查询的效率。
What is a DNS root nameserver?
每个recursive resolver
都知道13个root nameserver
的地址(因为全世界就只有13个root nameserver)。recursive resolver
首先会给这13个root nameserver中的一个发送查询请求,root nameserver接收到查询请求之后,会给recursive resolver
返回相关的TLD namenameserver
的地址(TLD是top-level domain的缩写顶级域名)。类似:(.com, .net, .edu等)
注意: 这里说的13个root nameserver,并不是只有13台root nameserver。而是表示13种类型的root namserver
。
What is a TLD nameserver?
TLD nameserver维护了所有的顶级域名信息,例如:.com, .net, .edu等。例如你想要访问google.com
, 首先会去访问root nameserver
,然后recursive resolver
接收到响应之后会去查询.com
的TLD nameserver。 之后TLD nameserver会响应相关的authoritative nameserver
。
- Generic top-level domains: 通用的顶级域名。比较有名的包括: .com, .org, .net, .edu等。
- Country code top-level domains: 区域域名,例如: .uk, .cn, .us等
What is an authoritative nameserver?
authoritative nameserver
简而言之就是直接给你的查询返回Answer的服务器。例如: 你search googlec.com
, 则当recursive resolver
解析到authoritative nameserver
之后,就会直接给你返回google.com domain的IP地址:217.160.0.201
。
上面就是DNS server的几种类型,知道了DNS Server的类型之后,接下来让我们看下DNS的整个解析流程:
The 8 steps in a DNS lookup:
1.用户在web浏览器上输入: example.com
之后,DNS recursive resolver
服务器接收到DNS请求。
2.resolver
首先向root nameserver
进行查询。
3.root nameserver
会响应给resolver
顶级域名TLD DNS Server
的地址,在我们的例子中,由于访问的是example.com
,所以会给resolver
返回.com
TLD。
4.resolver
之后会向.com
TLD发起查询请求。
5.TLD DNS server会给resolver
响应包含example.com
domain name的nameserver地址。
6.接着, recursive resolver
会向domain nameserver发送query查询动作。
7.最终, domain nameserver会返回example.com
的IP地址给resolver
。
8.DNS resolver
会把解析出来的IP响应给web浏览器。
9.浏览器发起一个HTTP的请求到目标IP地址。
10.请求的服务端将请求的数据响应给浏览器。
上面就是在DNS的一个完成的解析过程。
DNS 工具
- host
- nslookup
- dig