DNS(Domain Name System)是Internet的重要組成部分,它的核心是為IP地址提供一個(gè)更易記住的名字。Internet上的大部分服務(wù)都會(huì )用到DNS,例如:訪(fǎng)問(wèn)網(wǎng)站,發(fā)送郵件,登錄軟件系統,玩游戲,網(wǎng)絡(luò )聊天等。瀏覽器通過(guò)域名訪(fǎng)問(wèn)網(wǎng)站的實(shí)際過(guò)程如下圖所示:
DNS從1985年開(kāi)始被使用。但是為IP地址提供一個(gè)更易記住的名字可以追溯到ARPANET(Internet前身)時(shí)代。最早的ARPANET網(wǎng)絡(luò )通過(guò)一個(gè)hosts.txt文件管理地址和hostname的關(guān)系,用戶(hù)需要DNS服務(wù),就從一個(gè)ftp下載host.txt文件到本地。最開(kāi)始的網(wǎng)絡(luò )中也就幾百臺計算機,這種方法沒(méi)什么問(wèn)題。但是隨著(zhù)網(wǎng)絡(luò )的增加,文件存儲的方式不能滿(mǎn)足規模的要求。為了適應日益增長(cháng)的網(wǎng)絡(luò )規模,DNS被提出。不過(guò)host.txt文件被保留下來(lái)了,這就是我們日常熟悉的hosts文件,Linux在/etc/hosts,Windows在 C:/Windows/System32/Drivers/etc/hosts。在現代的計算機中,當請求Domain name(域名)解析時(shí),還是先查找計算機的hosts文件,如果hosts文件沒(méi)有相應的記錄,才會(huì )觸發(fā)DNS請求。
作為host.txt的改進(jìn)方案,DNS本質(zhì)上是一個(gè)Internet上的域名和IP地址相互映射的分布式數據庫。數據庫以樹(shù)形結構存在,如下圖所示:
樹(shù)中每個(gè)節點(diǎn)都有自己的標簽,根節點(diǎn)有個(gè)特殊的標簽“.”。樹(shù)結構中一條路徑中所有節點(diǎn)的標簽構成了DNS域名。這與Unix文件系統路徑類(lèi)似,區別在于Unix文件系統路徑將根節點(diǎn)放在前面,而DNS域名反過(guò)來(lái)了,將根節點(diǎn)放在了最后。例如,圖中host完整的域名是:“eos.cs.berkeley.edu.”,越靠近根節點(diǎn)ROOT的標簽在右,越靠近服務(wù)器的標簽在左。注意,一個(gè)完整的域名,是以根節點(diǎn)標簽“.”結束。
Zone是DNS樹(shù)中的子樹(shù)。Zone本身可以劃分成更小的Zone。前面說(shuō)過(guò)DNS的結構與Unix文件系統類(lèi)似,相應的Zone與Unix文件系統中的磁盤(pán)分區類(lèi)似。我們無(wú)法從DNS域名看出當前域名在哪個(gè)Zone,就像很難根據Unix文件路徑,看出當前目錄在哪個(gè)磁盤(pán)分區一樣。在DNS樹(shù)形結構中,Zone可以用下圖來(lái)描述。
DNS Zone通常由一個(gè)或者多個(gè)DNS server管理,一個(gè)DNS server也可以管理多個(gè)Zone。如下圖所示:
DNS與傳統的hosts.txt方式的區別在于,通過(guò)Zone的劃分,將龐大的DNS記錄劃分成了一個(gè)個(gè)小塊,從而解決數據龐大,不易管理的問(wèn)題。所以DNS Zone本質(zhì)上是DNS記錄的集合。DNS記錄被稱(chēng)為Resource Record(RR)。RR有很多種類(lèi)型。常見(jiàn)的有以下幾種:
這部分介紹DNS工作過(guò)程,首先看一下日常中經(jīng)常接觸的DNS server。DNS server大體上可以分為兩類(lèi)。
* 一類(lèi)是管理DNS zone的DNS server,稱(chēng)為Authoritative DNS server。這些DNS Server只掌握了一個(gè)或者多個(gè)DNS zone的信息,不能為我們提供整個(gè)互聯(lián)網(wǎng)的DNS信息。
* 另一類(lèi)是Cache DNS server。這類(lèi)DNS server不管理DNS zone,但是連接Authoritative DNS server,并且緩存從Authoritative DNS Server獲取的信息。最典型的就是谷歌的8.8.8.8。
假設我的電腦配置的DNS server是8.8.8.8,我需要訪(fǎng)問(wèn)www.zhihu.com,首先我的電腦要獲取www.zhihu.com的IP地址,需要經(jīng)過(guò)下面所示的步驟:
這里的1-8實(shí)際上就是第一幅圖中的步驟1,2的詳細版。
好了,DNS的工作過(guò)程大概如此,接下來(lái)看一下,如何為OpenStack中的虛機提供DNS服務(wù)。OpenStack中的虛機DNS服務(wù),可以分為兩個(gè)部分:一個(gè)是Internal DNS service,另一個(gè)是External DNS service。Internal DNS service由Neutron DHCP Service完成,External DNS service由OpenStack Designate項目實(shí)現。
Neutron DHCP Service默認是由dnsmasq進(jìn)程實(shí)現,dnsmasq同時(shí)提供了DNS服務(wù)和DHCP服務(wù)。它的DHCP服務(wù)在OpenStack Neutron中應用廣泛,相應的,其提供的DNS服務(wù)知名度不那么高。OpenStack Neutron DHCP service是以tenant network為單位提供服務(wù)的,也就是說(shuō)每個(gè)tenant network都有獨立的DHCP service,獨立的dnsmasq進(jìn)程。那么相應的,Neutron DHCP service提供的DNS service也只能在tenant network范圍內。默認情況下,DHCP service會(huì )通過(guò)DHCP協(xié)議,將dnsmasq的管理端口地址(也就是DHCP Server地址)作為虛機的DNS Server寫(xiě)入虛機。在每個(gè)dnsmasq的配置文件中(存放于state_path中),會(huì )靜態(tài)的記錄虛機的hostname與IP地址的對應。這樣,當虛機請求DNS解析的時(shí)候,dnsmasq可以從靜態(tài)的配置文件中獲取對應的解析記錄,并回送給虛機。
相應的配置項有: