????????DNS(domain name system)是用戶上網(wǎng)的基礎(chǔ)服務(wù),由于IP地址純數(shù)字的特點(diǎn),使得人們很難記住一個(gè)網(wǎng)站真實(shí)的IP地址,就如同人們很難記得某某的手機(jī)號(hào)碼是多少。那如何解決這個(gè)問(wèn)題呢?直觀的辦法就是創(chuàng)建一個(gè)“聯(lián)系人”的功能,將“人名”字段與“電話號(hào)碼”字段進(jìn)行關(guān)聯(lián),例如小明-13534567890;小紅-13534567891,這樣,人們?cè)趽艽螂娫挼臅r(shí)候,只需要記得人名,無(wú)需記得每個(gè)人的電話號(hào)碼,與此類似,DNS應(yīng)運(yùn)而生。類似上述例子,域名解析要做的就是將難記的IP地址如42.245.252.152,打一個(gè)備注:www.itdecent.cn,這時(shí)候,簡(jiǎn)書(shū)的拼音是遠(yuǎn)遠(yuǎn)比一長(zhǎng)串?dāng)?shù)字更方便記憶。
????????如果各位對(duì)于dns的基本概念存在疑問(wèn),建議花一段時(shí)間先學(xué)習(xí)一下維基百科dns的知識(shí)。筆者一直強(qiáng)調(diào)基礎(chǔ)知識(shí)的重要性。
????????domain name system用做域名解析的實(shí)質(zhì)是存了一張域名對(duì)應(yīng)IP地址的關(guān)系表,網(wǎng)絡(luò)中客戶端進(jìn)行查詢時(shí)就會(huì)來(lái)查這一張表,并在表中得到需要的IP地址信息。如何搭建和維護(hù)這一張表,就是筆者要做的內(nèi)容。
????????bind是目前主流的dns開(kāi)源軟件,這節(jié)筆者嘗試使用bind搭建一臺(tái)主dns服務(wù)器。
希望達(dá)成的效果:
1. ? ? 新建網(wǎng)絡(luò)區(qū)域內(nèi)域名解析系統(tǒng),做到如下表所示的域名—IP對(duì)應(yīng)關(guān)系。
????????域名????????????????????????????????服務(wù)器IP
????????a.hbai.com????????????????????192.168.0.1
????????b.hbai.com????????????????????192.168.0.2
????????c.hbai.com ? ? ? ? ? ? ? ? ? ?192.168.0.3
????????d.hbai.com????????????????????192.168.0.4
2. ? ? 除上述內(nèi)網(wǎng)域名外,其余域名查詢轉(zhuǎn)發(fā)至園區(qū)網(wǎng)外dns進(jìn)行解析,并返回實(shí)際IP地址。如查詢www.baidu.com返回百度服務(wù)器IP。
????????好,目標(biāo)明確之后,筆者來(lái)登陸第一節(jié)搭建的linux服務(wù)器。
????????首先,筆者保存一下上一章做的測(cè)試網(wǎng)頁(yè),并且關(guān)閉apache服務(wù):
????????/bin/systemctl stop httpd.service

? ? ? ? yum安裝bind:yum install bind
????????接下來(lái)筆者來(lái)進(jìn)行基礎(chǔ)配置:vi /etc/named.conf

????????注意其中幾個(gè)重要字段:
????????listen-on port 53 { 127.0.0.1; };?????? 本地監(jiān)聽(tīng)端口;
????????listen-on-v6 port 53 { ::1; };????????? IPv6監(jiān)聽(tīng)端口,由于筆者暫時(shí)沒(méi)有打算使用IPv6,所以把它用//注釋掉;
????????directory?????? "/var/named";???? 指明了域文件所在的目錄(就是筆者需要維護(hù)對(duì)應(yīng)關(guān)系表所在目錄)最好不要修改;
????????allow-query { localhost; };?????????? 允許那些主機(jī)來(lái)查詢,默認(rèn)是localhost,由于筆者園區(qū)網(wǎng)絡(luò)與公網(wǎng)有防火墻,這臺(tái)dns就可以對(duì)園區(qū)或者專網(wǎng)提供服務(wù),所以把“l(fā)ocalhost”改為“any”;
????????recursion yes;??????????????????? 是否允許遞歸,如果服務(wù)器設(shè)為主dns倒是可以關(guān)閉遞歸查詢,目前筆者搭建的這臺(tái)需要提供dns查詢,所以開(kāi)啟;
????????logging {??????????????????????? logging字段,定義日志所在位置,之后筆者對(duì)dns服務(wù)器進(jìn)行監(jiān)控會(huì)用到,不做修改。
????????zone "." IN {?????????????????? ??定義了root zone的服務(wù)類型為hint,記錄文件在/var/named/named.ca中;
????????include "/etc/named.rfc1912.zones";?? 定義區(qū)文件位置,筆者要新增的域*.local屬于一個(gè)zone,即需要在該文件中增加。
對(duì)如上內(nèi)容作修改為:

????????其中新增了一個(gè)forwarders字段,表示如果服務(wù)器無(wú)法解析該域名時(shí)將請(qǐng)求交與括號(hào)內(nèi)dns服務(wù)器解析。就是因?yàn)檫@個(gè)字段,筆者可以對(duì)本地?zé)o法解析的域名(即除*.hbai.com)的域名都轉(zhuǎn)到公用dns上解析。各位在買運(yùn)營(yíng)商帶寬時(shí),運(yùn)營(yíng)商會(huì)提供IP地址與dns服務(wù)器,這時(shí)可以直接加在forwarders字段。

保存退出wq!
啟動(dòng)dns服務(wù):/bin/systemctl start named.service

查看一下服務(wù)狀態(tài):/bin/systemctl status named.service

????????筆者注意到第三行一個(gè)字段Loaded: loaded (/usr/lib/systemd/system/named.service;disabled
????????這個(gè)表示該服務(wù)不隨開(kāi)機(jī)啟動(dòng),由于dns這類基礎(chǔ)業(yè)務(wù)類最好在服務(wù)器發(fā)生宕機(jī)之后可以自動(dòng)恢復(fù),保障業(yè)務(wù)連續(xù),因此將其設(shè)置為開(kāi)機(jī)啟動(dòng)。
????????設(shè)置dns服務(wù)為開(kāi)機(jī)啟動(dòng):bin/systemctl enable named.service
????????繼續(xù)查看一下?tīng)顟B(tài):/bin/systemctl status named.service

????????完成~
????????筆者來(lái)測(cè)試一下服務(wù)是否正常:
????????老樣子,關(guān)掉防火墻:systemctl stop firewalld.service
????????與上一章相同的網(wǎng)絡(luò)環(huán)境,筆者發(fā)現(xiàn)telnet 192.168.101.2 53端口不通?。。

????????telnet 192.168.101.2 22端口進(jìn)行一下測(cè)試,發(fā)現(xiàn)可以訪問(wèn)。說(shuō)明問(wèn)題還是出在53端口上

????????筆者看了一下配置似乎沒(méi)什么大問(wèn)題,沒(méi)辦法,進(jìn)行故障排查吧。
????????本地測(cè)試一下,在dns服務(wù)器上去測(cè)試一下端口是不是可以正常訪問(wèn)

????????未找到該命令。為了測(cè)試,插播一條消息,筆者在服務(wù)器上繼續(xù)安裝telnet:
????????看一下目前telnet的情況:yum list installed | grep telnet

????????查看一下可以安裝telnet的安裝包:yum list | grep telnet

????????直接安裝telnet.x86_64:
????????yum install telnet.x86_64
????????yum install telnet-server.x86_64
????????再查看一下telnet安裝狀態(tài): yum list installed | grep telnet

????????裝好之后繼續(xù)在服務(wù)器上進(jìn)行telnet測(cè)試,發(fā)現(xiàn)還是提示被拒絕(Connection refused)。

????????繼續(xù)telnet localhost 53,發(fā)現(xiàn)連接上了:connected to localhost

????????說(shuō)明筆者192.168.101.2這個(gè)IP在黑名單里啊,沒(méi)有服務(wù)提供。繼續(xù)檢查配置,發(fā)現(xiàn)在/etc/named.conf中確實(shí)有如下一行沒(méi)有注意。

????????這一段剛開(kāi)始修改時(shí)筆者只注意在port 53 的監(jiān)聽(tīng)上,其實(shí)后面括號(hào)內(nèi)定義了53端口只能由127.0.0.1進(jìn)行訪問(wèn)。發(fā)現(xiàn)故障原因后,筆者直接將其注釋掉。

????????重啟服務(wù):/bin/systemctl restart named.service
????????繼續(xù)回到筆者測(cè)試電腦上telnet 192.168.101.2,發(fā)現(xiàn)端口可通。小插曲解決。
????????下面筆者來(lái)配置*.local的域:vi /etc/named.rfc1912.zones
????????原有兩個(gè)zone,在此基礎(chǔ)上筆者新建一個(gè)名為hbai.com的zone。并將其type設(shè)為master。
????????zone "hbai.com" IN {
???????????????type master;
???????????????file "db.hbai";
????????};

????????保存退出wq!
????????好了,下一步就是創(chuàng)建域名對(duì)應(yīng)IP地址的關(guān)系表:cd /var/named
? ? ? ? ls看一下文件:

????????筆者新建一個(gè)剛剛在zone聲明的文件db.hbai: vi db.hbai
????????首先定義dns生存時(shí)間ttl,定在1h吧,換算成秒:$TTL 3660
????????第二行筆者做一個(gè)start of authority標(biāo)記,定義一個(gè)授權(quán)區(qū)的開(kāi)始:
????????hbai.com.?????? IN?????SOA???? mian.hbai.com.????master.hbai.com.
????????用()定義一段跨行數(shù)據(jù),并對(duì)每個(gè)數(shù)據(jù)打一個(gè)說(shuō)明標(biāo)簽:
????????2018011001????? ;??????serial
????????定義serial,每當(dāng)重啟dns服務(wù)時(shí)dns會(huì)檢測(cè)new-serial,當(dāng)new-serial大于old-serial時(shí)主dns會(huì)向從dns同步zone。這里筆者沒(méi)有搭建從dns,意義不大。
????????14400?????????? ;?????? refresh (4 hours)
????????定義refresh,從dns每過(guò)多長(zhǎng)時(shí)間向主dns進(jìn)行serial核對(duì)。意義也不大。
????????7200??????????? ;?????? retry??(2 hours)
????????定義retry,當(dāng)從dns向主dns獲取serial無(wú)響應(yīng)時(shí)多長(zhǎng)時(shí)間重新發(fā)起。目前意義不大。
????????604800????????? ;?????? expire?(1 week)
????????定義expire,當(dāng)無(wú)主dns響應(yīng)時(shí)從dns提供權(quán)威解析時(shí)間。
????????86400?????????? ;?????? minimum (1 day)
????????定義negative caching,不做詳細(xì)解釋,有興趣查一下RFC 2308文檔定義。
????????另起一行? $ORIGIN hbai.com.
????????定義從改行一下所有域名以hbai.com結(jié)尾。
????????添加NS記錄,將以hbai.com的域名解析權(quán)交與名為main.hbai.com的dns
????????添加最開(kāi)始表格的域名-IP對(duì)應(yīng)關(guān)系。
????????wq!保存退出。
????????筆者來(lái)看一下整體的文件:cat db.hbai

????????重啟dns服務(wù):/bin/systemctl restart named.service
????????開(kāi)啟防火墻:systemctl start firewalld.service
????????永久添加tcp 53端口:firewall-cmd --zone=public --add-port=53/tcp --permanent
????????永久添加udp53端口:firewall-cmd --zone=public --add-port=53/udp --permanent
????????重啟防火墻:firewall-cmd --reload

????????筆者最后在電腦上進(jìn)行dns服務(wù)測(cè)試:開(kāi)始--搜索—cmd
????????輸入nslookup
????????看到目前電腦的dns,筆者繼續(xù)隱去。。

????????設(shè)置服務(wù)器為192.168.101.2:server 192.168.101.2

????????看到這時(shí)候“默認(rèn)服務(wù)器”和“Address”字段都變?yōu)榱?92.168.101.2的IP地址。
????????直接輸入a.hbai.com;d.hbai.com;www.baidu.com進(jìn)行測(cè)試。

????????筆者看到,對(duì)于筆者自己維護(hù)的域名(*.hbai.com)的域名,筆者的dns server給出了權(quán)威解析,而對(duì)于不在筆者管控的其他域名,通過(guò)遞歸查詢返回了非權(quán)威的dns應(yīng)答。
????????到此為止dns服務(wù)器的搭順利完成~
????????由于公網(wǎng)IP沒(méi)法貼出來(lái),上圖一堆馬賽克沒(méi)法展示效果,筆者第二章設(shè)置了服務(wù)器接入專網(wǎng),并配置了IP地址10.150.101.249。筆者可以同樣在專網(wǎng)內(nèi)做一個(gè)測(cè)試:

????????這樣結(jié)果就很清楚了。
????????DNS Server的搭建可以使得筆者正常訪問(wèn)園區(qū)內(nèi)外的網(wǎng)絡(luò)資源(如百度),也可以標(biāo)注數(shù)據(jù)中心內(nèi)或者專網(wǎng)內(nèi)的服務(wù)器信息(如a.hbai.com 192.168.0.1),提供網(wǎng)絡(luò)服務(wù)的基本保障。
問(wèn)題:
1. ? ? 類比電話簿,如果一個(gè)網(wǎng)站服務(wù)器出現(xiàn)故障,需要更換服務(wù)器IP地址,這件事情對(duì)dns有什么影響,對(duì)用戶訪問(wèn)有什么影響?
2. ? ? 故障排查(trouble shooting)是一個(gè)復(fù)雜的東西,第三章和第四章都嘗試進(jìn)行了簡(jiǎn)單的故障排查,簡(jiǎn)單闡述筆者在遇到問(wèn)題時(shí)故障排除的思路。
3. ? ? 第三章筆者搭建了一個(gè)測(cè)試網(wǎng)站,在此基礎(chǔ)上嘗試將網(wǎng)站遷移至另一臺(tái)服務(wù)器如192.168.101.3并將域名test.hbai.com指向192.168.101.3做到如下頁(yè)面的訪問(wèn)。

4. ? ? 筆者其實(shí)已經(jīng)按照master-slave的部署方式修改了named.conf、named.rfc1912.zones、db.hbai的文件,我們可以將如此配置直接copy至另一臺(tái)用做slave dns的服務(wù)器來(lái)完成主從搭建,嘗試說(shuō)明對(duì)于master dns和slave dns分別要對(duì)上述三個(gè)文件的哪些字段修改?