DNS原理及實戰配置指南
家住海邊喜歡浪:zhang789.blog.51cto.com
目錄
DNS簡介
DNS域名結構介紹
頂級域名
DNS工作原理
工作模式和端口
資源記錄
安裝bind(詳細)
實戰:配置一個正反向解析
實戰:配置DNS轉發
實戰:配置DNS主從
實戰:子域授權
實戰:配置智能DNS
根域架構拓撲圖
DNS域名解析服務配置與管理詳解
DNS簡介
DNS服務可以爲用戶提供域名和IP地址之間的自動轉換,通過DNS用戶只需要輸入機器的域名即可訪問相關的服務,無需使用那些難以記憶的IP地址
DNS域名結構介紹
DNS域名又稱DNS命名空間,它是以層次樹狀結構進行管理的,其頂層是根域,根域在整個DNS命名空間是唯一的,而根域下可以分爲多個子域,每個子域又可以有多個子域
一個完整的域名是由頂級域以及各子域的名稱所組成,各部分之間用圓點,“.”來分割,其中最後一個點是頂級域,最後一個“.”左邊部分稱爲二級域名,二級域左邊稱爲三級域名,以此類推
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解析過程
1、客戶端需要解析www.qq.com,客戶端向本地DNS服務器發送解析請求
2、本地DNS發現無法解析,轉發給根域服務器,
3、根域服務器根據請求域名對應的頂級的com,返回com的服務器地址,
4、本地DNS服務器向com域dns服務器發出解析請求
5、com域服務器返回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轉發
(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; };
……
實戰:配置DNS主從
上面我們已經講過,一個域內的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; };
};
重啓服務,查看目錄下的文件
[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根域架構,下面是我畫的一個根域架構圖,大家可參考,以後有時間我會寫一篇這個拓撲的博客。
上面的實驗是在兩臺機器完成的,大家儘量從頭看,因爲我都是從上面往下慢慢寫的,所有某些實戰案例的環境也是延續上面的實驗後的環境。