博主幹貨:DNS原理及實戰配置指南

DNS原理及實戰配置指南

          家住海邊喜歡浪zhang789.blog.51cto.com

目錄

  • DNS簡介

  • DNS域名結構介紹

  • 頂級域名

  • DNS工作原理

  • 工作模式和端口

  • 資源記錄

  • 安裝bind(詳細)

  • 實戰:配置一個正反向解析

  • 實戰:配置DNS轉發

  • 實戰:配置DNS主從

  • 實戰:子域授權

  • 實戰:配置智能DNS

  • 根域架構拓撲圖

DNS域名解析服務配置與管理詳解

DNS簡介

DNS服務可以爲用戶提供域名和IP地址之間的自動轉換,通過DNS用戶只需要輸入機器的域名即可訪問相關的服務,無需使用那些難以記憶的IP地址

DNS域名結構介紹

DNS域名又稱DNS命名空間,它是以層次樹狀結構進行管理的,其頂層是根域,根域在整個DNS命名空間是唯一的,而根域下可以分爲多個子域,每個子域又可以有多個子域

wKiom1fyOEPDtxs7AAF3u543gys436.png

一個完整的域名是由頂級域以及各子域的名稱所組成,各部分之間用圓點,“.”來分割,其中最後一個點是頂級域,最後一個“.”左邊部分稱爲二級域名,二級域左邊稱爲三級域名,以此類推

www.sina.com.cn

cn是一級域名,com是二級域名,sina是三級域名

頂級域名

域名代表含義域名代表含義
.com表示商業機構 .cn中國 
.net表示網絡服務機構.hk中國香港 
.org表示非營利性組織.tw中國臺灣
.gov表示政府機構 .us美國 
.edu表示教育機構 .jp日本
.mil表示軍事機構 

DNS工作原理

隨着計算機網絡的快速發展,網絡中的計算機數量也是隨之快速增長,以前依靠hosts文件來實現主機名和IP地址之間的通信已經無法滿足現狀,DNS的出現提供了一個完整的解決方案

DNS服務採用C/S方式,域名和IP地址的維護工作全部在DNS服務端進行,用戶無需再在本地手動維護hosts文件 
下面是通過DNS解析域名的工作過程

1、當需要DNS解析的時候,系統會向本地DNS服務器發出DNS解析請求,由本地DNS服務器進行域名和IP地址的解析工作
2、本地DNS服務器收到用戶請求後,則會在自身的DNS數據庫中進行查找匹配域名和IP對應的記錄,如果找到則把結果返回給客戶端,如果查不到,則把請求轉發給根DNS服務器
3、根DNS服務器查到域名對應的頂級域,再由頂級域查找二級域,由二級域查找三級域,以此類推,直到找打需要解析的域名和IP地址,並把結果返回給本地DNS服務器
4、最終由本地DNS服務器把結果返回給客戶端
5、如果經過查找依然無法查找到,則有本地DNS服務器返回給客戶端解析錯誤信息


案例:訪問www.QQ.com的dns解析過程

wKioL1fyOJHwU3MrAACPfbdhIu8744.png

1、客戶端需要解析www.qq.com,客戶端向本地DNS服務器發送解析請求
2、本地DNS發現無法解析,轉發給根域服務器,
3、根域服務器根據請求域名對應的頂級的com,返回com的服務器地址,
4、本地DNS服務器向com域dns服務器發出解析請求
5com域服務器返回qq.com域服務器的地址
6、以此類推,本地DNS服務器向qq.com域dns服務器發出解析請求,直到在qq.com域dns服務器上面找到www.qq.com所對應的IP地址
7、qq.com把查找到的域名對應IP地址信息返回給本地DNS服務器
8、最終再由本地DNS服務器把結果返回給客戶端計算機

工作模式和端口

端口:TCP/53,UDP/53      //用戶客戶端查詢,遞歸查詢
    TCP/953,UDP/953    //DNS主從同步
工作模式:C/S模式

資源記錄

1、SOA:起始授權記錄,Start of Authority Record
   每個區的開始處都包含,SOA定義了域的全局參數,進行整個域的管理,一個區有且僅有一個SOA記錄
2、NS:Name Server 域名服務記錄
   指定該域名由那個DNS服務器來解析,每個區在區根處至少包含一條NS記錄
3、A:address記錄,吧FQDN映射到IP地址,因爲有此記錄,所以DNS服務器能夠解析FQDN域名對應的IP地址
4、PTR:反A記錄,指針PRT記錄把IP映射到FQDN,用於反向查詢,通過IP地址,找到域名
5、CNAME:別名記錄,記錄創建特定FQDN的別名,用戶可以使用CNAME記錄來隱藏網絡用戶的實現細節
6、MX:郵件交換記錄,爲DNS指定郵件交換服務器

DNS服務器的安裝

Bind是一款開放的源代碼DNS服務器軟件,是目前使用最廣泛的DNS服務器軟件

[root@localhost ~]# yum install -y bind bind-utils
用腳本在每臺服務器上面安裝Bind軟件,並且初始化主配置文件
#!/bin/bash
##安裝Bind服務
if [ ! -e /etc/init.d/named ];then
       rpm -e --nodeps bind-utils &>/dev/null
       rpm -e --nodeps bind-libs &>/dev/null
       rpm -e --nodeps bind &>/dev/null
       rpm -e --nodeps bind-chroot &>/dev/null
       yum -y install bind bind-utils &>/dev/null && echo "Bind已安裝成功,請稍等,初始化Bind主配置文件。。。"
else
       echo -------------------------------------------------
       echo "此臺服務器Bind已安裝,請退出........."
sleep 1
fi
##初始化Bind配置文件
cd /etc/
sed -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' named.conf
echo -------------------------------------------------
sleep 2
echo "初始化Bind配置文件已完成........."

關鍵文件

/etc/named.conf    #bind主配置文件
/etc/named.rfc1912.zones    #定義zone的文件
/etc/rc.d/init.d/named    #bind腳本文件
/etc/rndc.conf    #rndc配置文件
/usr/sbin/named-checkconf    #檢測/etc/named.conf文件語法
/usr/sbin/named-checkzone    #檢測zone和對應zone文件的語法
/usr/sbin/rndc    #遠程dns管理工具
/usr/sbin/rndc-confgen    #生成rndc密鑰
/var/named/named.ca    #根解析庫
/var/named/named.localhost    #本地主機解析庫
/var/named/slaves    #從文件夾

named.conf配置文件

bind的主要配置文件包括named.conf和相應的區域文件,bind中各種配置都是更改這個文件來完成的,修改完成後重啓生效

named.conf是bind的主要配置文件,裏面存儲了大量的bind自身的設置信息,bind啓動時候會去檢測該文件,讀取文件的內容,如果文件不存在,或者裏面語法錯誤,會導致啓動失敗

named.conf配置文件是有配置語句和註釋組成,每條配置語句以分好“;”作爲結束符,多條配置語句組成一個語句塊;註釋使用兩個//作爲註釋符

named.conf配置文件所支持的所有配置語句

acl         定義一個主機匹配列表,用戶訪問控制權限
controls    定義rndc工具與bind服務進程的通信
include     把其他文件的內容包含進來
key         定義加密祕鑰
logging     定義系統日誌信息
lwres       把named配置爲輕量級解析器
masters     定義主域列表
options     設置全局選項
server      定義服務器屬性
trusted-keys定義信任的dnssec祕鑰
view        定義視圖
zone        定義區域

實戰:配置一個正反向解析

1、核心配置文件的修改

[root@localhost ~]# vim /etc/named.conf 
options {
       listen-on port 53 { any; };   //修改成any
       listen-on-v6 port 53 { ::1; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       allow-query     { any; };    //修改成any,誰都可以查詢
       recursion yes;

2、正向解析配置zone文件指定

[root@localhost ~]# vim /etc/named.rfc1912.zones
// 添加正向,反向解析zone指定
zone "qq.com" IN {      //域名
       type master;    //type類型,master(主)
       file "qq.com.zone";  //區域文件保存位置.zone文件位置,用實例來說明買個字段的意思
       allow-update { none; };  //是否允許動態更新(DNS和DHCP結合是使用)
};

zone "252.1.10.in-addr.arpa" IN {
       type master;
       file "252.1.10.rev";
       allow-update { none; };
};

3、建立zone文件記錄文件

[root@localhost named]# cat qq.com.zone 
$TTL 600
@   IN  SOA    qq.com.  root.qq.com. (
//@代表區域名,這裏就是代表xuegod.cn,可以改寫爲xuegod.cn
//IN Internet Name
//SOA 權威結構,後面的dns.就是其實授權記錄,有且僅有一條SOA
//主機名,DNS名稱
//代表DNS管理員的郵箱地址,有什麼問題通知誰,@用.代替@有其他含義
               20160321;    //序列號,手工改,同步用
               1H;          //1天更新,多長時間請求更新
               5M;          //一天聯繫上,過5個小時再試
               1W;          //1周時間過期,一直聯繫不上時
               10M )        //最短的有效期,10小時,不需要更新
       IN      NS      qq.com.    //最好和上面同步,如果要寫完整,可以寫qq.com.後面的.一定要帶上
       IN      A       127.0.0.1  //主機頭,這裏填寫主機頭,注意要對我們上面的NS記錄做一條主機記錄
       IN      MX 10   mail1
mail1   IN      A       10.1.252.96
www     IN      A       10.1.252.96
cname   IN      CNAME   www
*       IN      A       10.1.252.96
[root@localhost named]# cat 252.1.10.rev
$ttl   1D
@   IN  SOA qq.com. root.qq.com.    (
       20160321;
               1H;
               5M;
               1W;
               10M )
   IN  NS  qq.com.
96  IN  PTR www.qq.com.      //PTR指針,反向解析記錄

4、重啓DNS服務

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]

5、在客戶端設置DNS服務器後測試

[root@localhost named]# nslookup 
> www.qq.com
Server:     10.1.252.97
Address:    10.1.252.97#53

Name:   www.qq.com
Address: 10.1.252.96
> 10.1.252.96
Server:     10.1.252.97
Address:    10.1.252.97#53

96.252.1.10.in-addr.arpa    name = www.qq.com.
>

實戰:配置DNS轉發

wKioL1fyOYOiei13AABeuQv1WEg635.png

1)當本地DNS服務器(也是轉發器)收到查詢時,它會嘗試使用它主持和緩存的主要和輔助區域解析該查詢;
2)如果不能使用本地數據解析查詢,此時它作爲客戶端,會將查詢轉發給外網DNS服務器;
3)本地DNS(轉發器)收到客戶端的請求後會等待一段很短的時間,等待來自外網DNS的應答;
4)對於外網DNS來說,它接收到的查詢請求是遞歸查詢,此時,它自己需要向外層層迭代找到最終答案返回給轉發器(此時轉發器作爲DNS客戶端)
5)轉發器將外網DNS返回的查詢結果送到客戶端(非權威答案),完成解析過程。


注:轉發的前提——接收轉發請求的服務器(這裏是外網DNS)必須能夠爲請求者(這裏是本地DNS,也是轉發器)做遞歸查詢;

轉發的類型:

(1)無條件轉發:轉發所有針對非本機負責解析的區域的請求; 
在主配置文件/etc/named.conf的全局選項中添加如下內容:

options {    
   forwarders { ip; };    #指明轉發器是誰
   forward only|first;    #only表示僅轉發 ;first表示先進行轉發,如果沒查詢到結果,那麼它自己還會根據根提示向外迭代查詢
};

(2)條件轉發:僅轉發對特定區域的請求(即轉發域); 
在區域置文件/etc/named.rfc1912.zone中定義轉發域:

zone "區域名稱" IN {
   type forward;          #區域的類型爲轉發
   forwarders {  ip; };   #指明轉發器是誰
   forward only|first;    #only表示僅轉發 ;first表示先進行轉發,如果沒查詢到結果,那麼它自己還會根據根提示向外迭代查詢
};

實例:配置轉發服務器

我們按照上圖當用戶訪問oa.qq.com,crm.qq.com在本地進行查詢,當需要解析www.qq.com就轉發的外網

[root@localhost ]# yum install -y bind bind-utils
[root@localhost ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };         #修改
       listen-on-v6 port 53 { ::1; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       allow-query     { any; };           #修改
       recursion yes;
       
       idnssec-enable no;                //改成no不檢查來源頭部
       dnssec-validation no;
       dnssec-lookaside auto;
       forward first;          #only,僅僅轉發,first,先查找再轉發,實驗效果,僅僅轉發
               forwarders { 192.168.211.128; };
……

wKioL1fyOknynmTkAAHzGKTjf1E535.jpg

實戰:配置DNS主從

wKiom1fyOniTHoqSAACKozdvPDA223.png

上面我們已經講過,一個域內的DNS服務器一般都需要兩個,我們這裏就進行主從配置和區域傳送

從服務器配置文件

[root@localhost ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };         #修改監控地址
       listen-on-v6 port 53 { any; };      #修改監控地址
       ● ● ● ● ● ●
       allow-query     { any; };           #允許所有來查詢
       recursion yes;
       ● ● ● ● ● ●
       #dnssec-enable no;                  //改成no不檢查來源頭部
       #dnssec-validation no;
       #dnssec-lookaside auto;
       ● ● ● ● ● ●

時間同步主從都做

[root@localhost ~]# ntpdate 0.rhel.pool.ntp.org
[root@localhost ~]# ntpdate 0.rhel.pool.ntp.org

主配置

root@localhost ~]# vim /etc/named.rfc1912.zones
//主配置文件區域參數
zone "taobao.com" IN {
   type master;
   file "taobao.com.zone";
   allow-update { none; };
   notify yes;
       also-notify{ 192.168.211.136; };
};

從配置

[root@localhost ~]# vim /etc/named.rfc1912.zones
//從配置文件區域參數
zone "taobao.com" IN {
       type slave;
       file "slaves/taobao.com.zone";
   masters { 192.168.211.128; };
};

wKioL1fyOsCRiu5wAABbdi3fH4s876.png

重啓服務,查看目錄下的文件

[root@localhost named]# ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 377 Oct  2 11:42 taobao.com.zone

實戰:子域授權

二級域是我們的三級域就可以隨意定義,聯繫公司各個部門,都應該有自己的服務器,因爲公司上萬人讓一臺DNS服務器去解析壓力會很大,分成部門每個部門一臺子域DNS解析服務器,就輕鬆很多,過程就是在父DNS服務器中定義區域解析條目


例: 
.<–根域 
.com <–頂級域(一級域) 
taobao.com <–二級域<–子域 
ops.taobao.com <–主機名<–子域<–子域

正向解析區域授權子域的方法

父域配置

在父主機上面的區域配置文件裏面添加NS記錄
[root@localhost ~]# vim /var/named/taobao.com.zone
$TTL    1D
@       IN      SOA     ns1.taobao.com.     ops.taobao.com. (
                       20161015;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
Ns1     IN      A       127.0.0.1
oa      IN      A       192.168.211.136
//添如下內容
    IN      NS         ops     //添加一條NS記錄將ops.taobao.com. 域授權ops管理
ops     IN      A       192.168.211.136  //對應上條的NS記錄A記錄

子域配置(授權域)

在從服務器添加ops的子域區域
[root@localhost named]# vim /etc/named.rfc1912.zones
//添加ops.taobao.com區域
zone "ops.taobao.com" IN {
       type master;
       file "ops.taobao.com.zone";
};
添加區域的zone
[root@localhost named]# cat /var/named/ops.taobao.com.zone 
$TTL    1D
@       IN      SOA     ns1.ops.taobao.com.     ops.taobao.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1.ops.taobao.com.
Ns1     IN      A       127.0.0.1
mail        IN      A       192.168.244.55
zabbix  IN      A       192.168.244.66
it      IN      A       192.168.244.66
測試
[root@localhost named]# host -t A zabbix.ops.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

zabbix.ops.taobao.com has address 192.168.244.66
[root@localhost named]# host -t A it.ops.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

it.ops.taobao.com has address 192.168.244.66
[root@localhost named]# host -t A oa.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

oa.taobao.com has address 192.168.211.136

實戰:配置智能DNS

bind的視圖功能,又稱腦裂(split-brain): 
根據客戶端來源的不同,將同一個名稱解析至不同的值。 
例如,一個企業有兩臺web主機,對應於一個FQDN,一臺位於電信機房,一臺位於聯通機房,爲了用戶訪問的便利,我們欲將電信用戶的域名查詢請求解析爲電信那臺主機的ip地址,將聯通用戶的請求解析爲另一臺主機的地址,bind的視圖功能就可實現這種需求。

1、一旦啓動了view, 所有的zone都只能在view中定義
2、僅有必要在匹配到允許遞歸請求的客戶所在view定義根區域
3、客戶端請求到達, 是自上而下檢查每個view所服務器的客戶端列表

核心配置文件

[root@localhost named]# cat /etc/named.conf 
acl local { 127/8; };           #最前面添加
acl network { 192.168.211/24; };
#zone "." IN {              #這一段要註銷,寫到我們的include的zone文件中
#       type hint;
#      file "named.ca";
#};

view local {            #對於上面定義的acl進行區定義,名字可以不一樣
       match-clients { local; };       #正式定義,名字要和acl中的相同
       recursion yes;
       include "/etc/named.local";     #這裏定義我們的配置文件的另外塊兒
};

view network {
       match-clients { network; };
       recursion yes;
       include "/etc/named.network";
};

// include "/etc/named.rfc1912.zones";   #上面按已經包含了,那麼我們就把這行include去掉
// include "/etc/named.root.key";        #檢測頭部的註釋

include文件創建

[root@localhost etc]# ll named.local named.network 
-rw-r--r-- 1 root root 162 Oct  2 12:20 named.local
-rw-r--r-- 1 root root 164 Oct  2 12:20 named.network

配置本地網絡的include

[root@localhost etc]# cat named.local 
zone "." IN {
     type hint;
     file "named.ca";
};
zone "qq.com" IN {
       type master;
       file "qq.com.local";
       allow-update { none; };
};

配置外網網絡的include

[root@localhost etc]# cat named.network 
zone "." IN {
     type hint;
     file "named.ca";
};
zone "qq.com" IN {
       type master;
       file "qq.com.network";
       allow-update { none; };
};

Zone記錄文件創建

[root@localhost etc]# cd /var/named/
[root@localhost named]# cat qq.com.local            //內網的
$TTL    1D
@       IN      SOA     ns1.qq.com.     admin.qq.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
ns1 IN      A       127.0.0.1
www IN  A   192.168.211.111
[root@localhost named]# cat qq.com.network      //外網的
$TTL    1D
@       IN      SOA     ns1.qq.com.     admin.qq.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
ns1 IN      A       127.0.0.1
www IN  A   192.168.211.222

重啓bind服務

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                             [  OK  ]

測試

[root@localhost named]# host www.qq.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

www.qq.com has address 192.168.211.111
[root@localhost named]# host www.qq.com 192.168.211.136
Using domain server:
Name: 192.168.211.136
Address: 192.168.211.136#53
Aliases:

www.qq.com has address 192.168.211.222

大型根域架構

    可結合上面單獨構建DNS根域架構,下面是我畫的一個根域架構圖,大家可參考,以後有時間我會寫一篇這個拓撲的博客。

    上面的實驗是在兩臺機器完成的,大家儘量從頭看,因爲我都是從上面往下慢慢寫的,所有某些實戰案例的環境也是延續上面的實驗後的環境。


wKioL1fyPDrgnTzLAAJ4wAsnoYI617.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章