DNS(Domain Name System)是Internet的重要组成部分,它的核心是为IP地址提供一个更易记住的名字。Internet上的大部分服务都会用到DNS,例如:访问网站,发送邮件,登录软件系统,玩游戏,网络聊天等。浏览器通过域名访问网站的实际过程如下图所示:
DNS从1985年开始被使用。但是为IP地址提供一个更易记住的名字可以追溯到ARPANET(Internet前身)时代。最早的ARPANET网络通过一个hosts.txt文件管理地址和hostname的关系,用户需要DNS服务,就从一个ftp下载host.txt文件到本地。最开始的网络中也就几百台计算机,这种方法没什么问题。但是随着网络的增加,文件存储的方式不能满足规模的要求。为了适应日益增长的网络规模,DNS被提出。不过host.txt文件被保留下来了,这就是我们日常熟悉的hosts文件,Linux在/etc/hosts,Windows在 C:/Windows/System32/Drivers/etc/hosts。在现代的计算机中,当请求Domain name(域名)解析时,还是先查找计算机的hosts文件,如果hosts文件没有相应的记录,才会触发DNS请求。
作为host.txt的改进方案,DNS本质上是一个Internet上的域名和IP地址相互映射的分布式数据库。数据库以树形结构存在,如下图所示:
树中每个节点都有自己的标签,根节点有个特殊的标签“.”。树结构中一条路径中所有节点的标签构成了DNS域名。这与Unix文件系统路径类似,区别在于Unix文件系统路径将根节点放在前面,而DNS域名反过来了,将根节点放在了最后。例如,图中host完整的域名是:“eos.cs.berkeley.edu.”,越靠近根节点ROOT的标签在右,越靠近服务器的标签在左。注意,一个完整的域名,是以根节点标签“.”结束。
Zone是DNS树中的子树。Zone本身可以划分成更小的Zone。前面说过DNS的结构与Unix文件系统类似,相应的Zone与Unix文件系统中的磁盘分区类似。我们无法从DNS域名看出当前域名在哪个Zone,就像很难根据Unix文件路径,看出当前目录在哪个磁盘分区一样。在DNS树形结构中,Zone可以用下图来描述。
DNS Zone通常由一个或者多个DNS server管理,一个DNS server也可以管理多个Zone。如下图所示:
DNS与传统的hosts.txt方式的区别在于,通过Zone的划分,将庞大的DNS记录划分成了一个个小块,从而解决数据庞大,不易管理的问题。所以DNS Zone本质上是DNS记录的集合。DNS记录被称为Resource Record(RR)。RR有很多种类型。常见的有以下几种:
这部分介绍DNS工作过程,首先看一下日常中经常接触的DNS server。DNS server大体上可以分为两类。
* 一类是管理DNS zone的DNS server,称为Authoritative DNS server。这些DNS Server只掌握了一个或者多个DNS zone的信息,不能为我们提供整个互联网的DNS信息。
* 另一类是Cache DNS server。这类DNS server不管理DNS zone,但是连接Authoritative DNS server,并且缓存从Authoritative DNS Server获取的信息。最典型的就是谷歌的8.8.8.8。
假设我的电脑配置的DNS server是8.8.8.8,我需要访问www.zhihu.com,首先我的电脑要获取www.zhihu.com的IP地址,需要经过下面所示的步骤:
这里的1-8实际上就是第一幅图中的步骤1,2的详细版。
好了,DNS的工作过程大概如此,接下来看一下,如何为OpenStack中的虚机提供DNS服务。OpenStack中的虚机DNS服务,可以分为两个部分:一个是Internal DNS service,另一个是External DNS service。Internal DNS service由Neutron DHCP Service完成,External DNS service由OpenStack Designate项目实现。
Neutron DHCP Service默认是由dnsmasq进程实现,dnsmasq同时提供了DNS服务和DHCP服务。它的DHCP服务在OpenStack Neutron中应用广泛,相应的,其提供的DNS服务知名度不那么高。OpenStack Neutron DHCP service是以tenant network为单位提供服务的,也就是说每个tenant network都有独立的DHCP service,独立的dnsmasq进程。那么相应的,Neutron DHCP service提供的DNS service也只能在tenant network范围内。默认情况下,DHCP service会通过DHCP协议,将dnsmasq的管理端口地址(也就是DHCP Server地址)作为虚机的DNS Server写入虚机。在每个dnsmasq的配置文件中(存放于state_path中),会静态的记录虚机的hostname与IP地址的对应。这样,当虚机请求DNS解析的时候,dnsmasq可以从静态的配置文件中获取对应的解析记录,并回送给虚机。
相应的配置项有: