- DNS簡介
- DNS解析關鍵概念
- BIND
一、DNS簡介:
(一)DNS服務
- DNS:Domain Name Service,域名解析服務,服務于應用層的協議
- 端口:TCP的53端口和UDP的53端口
- 主流軟件實現:BIND(Berkeley Internet Name Domain)
- 域名解析方式:
- 本地解析:hosts文件,每一行格式
IP地址 域名
- 網絡分層解析:DNS服務
- 域名解析時先查詢本機hosts文件,匹配則直接使用文件中的域名;若無匹配項,再使用DNS服務
- 本地解析:hosts文件,每一行格式
(二)DNS域名
- 分層設計,自上而下分為:根域、一級域名、二級域名、三級域名......,最多127級
- 一級域名:
- 組織域名:com, edu, mil, gov, net, org
- 國家地區(qū)域名:cn, uk, hk
- 反向域名:arpa
(三)DNS解析
-
按查詢類型分為:遞歸解析和迭代解析
- 遞歸解析:客戶端向所在網絡DNS服務器發(fā)起請求,DNS服務器發(fā)回解析結果的過程
- 迭代解析:當某個DNS服務器無法解析客戶端的請求時,從根域名服務器開始,向每層DNS服務器發(fā)出請求,并接收每層DNS服務器的查詢結果,直至找到權威DNS服務器(存儲主機準確IP地址的服務器)的過程
一次完整的查詢請求經過的流程:
Client -->hosts文件-->DNS Service Local Cache(本地DNS緩存,Windows有,Linux沒有)--> DNS Server (recursion, 遞歸) --> Server Cache --> iteration(迭代) --> 根--> 頂級域名DNS-->二級域名DNS…-
按解析方向解析:
- FQDN(Fully Qualified Domain Name):完全合格域名,主機+全域名路徑,邏輯上能夠準確表達主機的位置
- 正向解析:FQDN解析為IP
- 反向解析:IP解析為FQDN
- 正向解析和反向解析是兩個不同的名稱空間,兩個不同的解析樹
(四)DNS服務器類型
主服務器:管理和維護所在域的解析服務
-
從服務器:主服務器解析庫的鏡像,復制和更新的過程稱為區(qū)域傳輸,涉及的概念有:
- 序列號(serial):解析庫版本號,主服務器解析庫變化時,其序列遞增,從服務器從序列號判斷主服務器的解析庫是否發(fā)生變化,最長10位數字
- 刷新時間間隔(refresh):從服務器從主服務器請求同步解析的時間間隔
- 重試時間間隔(retry):從服務器請求同步失敗時,再次嘗試時間間隔
- 過期時長(expire):從服務器聯系不到主服務器時,多久后停止服務
緩存服務器:轉發(fā)器
-
主從服務器解析庫更新機制:Push和Pull
- Push:推送,主服務器解析庫發(fā)生變化時,主動通知從服務器更新
- Pull:拉取,從服務器按照設置每隔一定時間主動同步主服務器的解析庫
二、DNS解析關鍵概念:
(一)資源記錄(RR, Resource Record)
每個DNS服務器的解析庫由各類RR組成
-
資源記錄的類型:
- SOA:Start Of Authority,起始授權記錄;一個區(qū)域解析庫有且僅能有一個SOA記錄,必須位于解析庫的第一條記錄
- A:Internet Address,FQDN --> IP
- AAAA:FQDN --> IPv6
- PTR:PoinTeR,IP --> FQDN
- NS:Name Server,專用于標明當前區(qū)域的DNS服務器
- CNAME:別名記錄
- MX:Mail eXchanger,郵件交換器
-
資源記錄定義的格式:
- 語法:name [TTL] IN rr_type value
- 注意:
(1) TTL(緩存的生命期)可從全局繼承,如:$TTL 1d
(2) @可用于引用當前域的名字
(3) 同一個名字可以通過多條記錄定義多個不同的IP,此時DNS服務器會以輪詢方式響應,這種方式實現了簡單的平衡負載
(4) 同一個值也可能有多個不同的定義名字;通過多個不同的名字指向同一個值進行定義,此僅表示通過多個不同的名字可以找到同一個主機
(5) 相鄰資源記錄的name相同時,后續(xù)的name可以省略
(二)SOA記錄
name:當前域名,可用"@"代替
value:包含多部分內容
(1) 當前區(qū)域的主DNS服務器的FQDN(無命名要求,只要和相應的A記錄匹配即可)
(2) 當前區(qū)域管理員的郵箱地址;但地址中不能使用"@"符號,一般用"."替換,例如linuxedu.hellopeiyang.com.
(3) 主從服務器區(qū)域傳輸相關定義,否定結果緩存統一的TTL
(三)NS記錄
- name:當前域名,可用"@"代替,常省略
- value:當前域DNS服務器的主機名
- 一個域可以有多條NS記錄,每條記錄都應該匹配一條A記錄
(四)MX記錄
- name:當前域名,可用"@"代替,常省略
- value:當前域的郵件服務器的主機名,格式:
## mail_server_addr
##表示數字(1-99),數字越小優(yōu)先級越高 - 一個域可以有多條MX記錄,每條記錄都應該匹配一條A記錄
(五)A記錄和AAAA記錄
- name:主機的FQDN
- value:主機的IP地址
- 特殊寫法:
$GENERATE 1-254 HOST$ A 1.2.3.$
:按照序號排列規(guī)律的FQDN與IP的對應關系
*.magedu.com. IN A 5.5.5.5
:泛域名解析,當用戶輸錯地址時,統一解析至某個地址
magedu.com. IN A 6.6.6.6
:當用戶沒有輸入www主機名時解析至地址 - AAAA記錄與A記錄相似,只是IP地址為IPv6地址
(六)CNAME記錄
- name:別名QFDN
- value:真實名QFDN
(七)PTR記錄
- name:特定格式IP+特定后綴
IP地址反過來寫:如1.2.3.4
寫作4.3.2.1
特定后綴:in-addr.arpa.
完整寫法:4.3.2.1.in-addr.arpa.
- value:FQDN
三、BIND:
(一)BIND的安裝
- 安裝:
yum install BIND
- 列出BIND有關程序包名:
yum list all BIND*
bind:服務器
bind-libs:相關庫
bind-utils:客戶端
bind-chroot:遷移BIND目錄至深層目錄,減少BIND被黑客攻破對系統的影響 - 程序名:named
- 服務腳本:
/etc/rc.d/init.d/named
CentOS 6
/usr/lib/systemd/system/named.service
CentOS 7 - 主要配置文件:
/etc/named.conf
,/etc/named.rfc1912.zones
,/etc/rndc.key
- 解析庫文件
/var/named/ZONE_NAME.ZONE
(二)BIND的配置
(1)配置主配置文件:/etc/named.conf
- 全局配置:options {};
- 日志子系統配置:logging {};
- 區(qū)域定義:zone "ZONE_NAME" IN {};
- 定義本機能夠提供解析的zone
- dnssec:dns的安全選項,建議關閉dnssec,設為no
(2)配置解析庫文件:按照資源記錄的格式定義
(3)格式檢查:
- 主配置文件語法檢查:
named-checkconf
- 解析庫文件語法檢查:
named-checkzone zone_name PATH_TO_ZONE_NAME
(4)重載配置:
rndc reload
或 service named reload
(5)實驗:配置基本的DNS服務,DNS正向解析
將192.168.136.230配置為"hellopeiyang.com"域的DNS服務器,本區(qū)域主機"websrv"的IP地址為192.168.136.229,"www"是"websrv"的別名,郵件服務器"mailsrv1"的IP地址為192.168.136.100,郵件服務器"mailsrv2"的IP地址為192.168.136.101,mailsrv1的優(yōu)先級更高
- 第1步,配置主配置文件/etc/named.conf,修改options字段,修改部分如下:
vim /etc/named.conf
options {
listen-on port 53 { localhost; };
//修改監(jiān)聽主機IP為localhost,這樣網絡上的其他主機可以連接本機的DNS服務
//也可以通過注釋本條語句達到相同效果
allow-query { any; };
//修改允許查詢的客戶端網段,any表示任意客戶端可以向本機發(fā)起DNS請求,并得到查詢結果
};
- 第2步,修改獨立區(qū)域配置文件,添加區(qū)域配置信息:
vim /etc/named.rfc1912.zones
zone "hellopeiyang.com" IN {
type master; //類型為主服務器
file "hellopeiyang.com.zone"; //必須與/var/named下的文件名相同
};
- 第3步,配置解析庫文件
解析庫文件可以手動編輯,也可以復制類似文件修改,這里將/var/named目錄下的named.localhost文件復制并重命名為hellopeiyang.com.zone文件,并作出相應修改
cp -p /var/named/named.localhost /var/named/hellopeiyang.com.zone //復制時保留所屬組權限
vim /var/named/hellopeiyang.com.zone
$TTL 1D //DNS緩存生命期的全局設置
@ IN SOA dns1 admin.hellopeiyang.com. (
//dns1:主DNS服務器域名
//本配置文件中凡是域名處若末尾不加"."系統識別時自動認為其后增加當前域名,
如這里"dns1"視作"dns1.hellopeiyang.com."
100 ; serial //序列號,不多于10位
1D ; refresh //從DNS服務器更新時間
1H ; retry //從DNS服務器重試時間
1W ; expire //從DNS服務器失效時間
3H ) ; minimum //錯誤的DNS緩存生命期
NS dns1 //DNS服務器主機名
dns1 A 192.168.136.230 //DNS服務器的IP地址
websrv A 192.168.136.229 //本域下的主機websrv的IP地址
www CNAME websrv //主機websrv的別名
@ MX 10 mailsrv1 //郵件服務器mailsrv1.hellopeiyang.com
@ MX 20 mailsrv2 //郵件服務器mailsrv2.hellopeiyang.com
mailsrv1 A 192.168.136.100 //郵件服務器mailsrv1.hellopeiyang.com的IP
mailsrv2 A 192.168.136.101 //郵件服務器mailsrv2.hellopeiyang.com的IP
- 第4步,格式檢查:
檢查主配置文件:named-checkconf
檢查解析庫文件:named-checkzone hellopeiyang.com hellopeiyang.com.zone
第5步,重新載入配置:
rndc reload
或者systemctl reload named
第6步,測試:
dig www.hellopeiyang.com @192.168.136.230
測試成功,返回結果中NS、A、CNAME記錄與設置相同,同時aa標簽表明指定的DNS服務器192.168.136.230是www.hellopeiyang.com網路主機的權威服務器
(6)只允許DNS返回本機存在的DNS記錄(適用于企業(yè)內網)
修改/etc/named.conf文件options字段recursion選項,修改如下:
recursion no;
此時,請求一個DNS服務器不知道的域名,服務器直接拒絕
(三)測試命令
(1)dig命令
- 語法:
dig [-t type] name [@SERVER]
dig只用于測試dns系統,不會查詢hosts文件進行解析 - 查詢選項:
+[no]trace:跟蹤解析過程
+[no]recurse:進行遞歸解析 - 測試反向解析:
dig -x IP
dig -t ns . @114.114.114.114 //查詢根DNS服務器域名
dig -t mx hellopeiyang.com @192.168.136.230 //查詢hellopeiyang.com域的郵件服務器
(2)host命令
- 語法:
host [-t type] name [SERVER]
host -t ns . 114.114.114.114 //查詢根DNS服務器域名
dig -t mx hellopeiyang.com 192.168.136.230 //查詢hellopeiyang.com域的郵件服務器
(3)nslookup命令
- 交互式命令:
- server IP:指定DNS服務器地址
- 域名:查找域名的A記錄
- set type=TYPE_NAME:設置之后查詢信息的記錄類型
(四)反向區(qū)域解析
反向區(qū)域解析與正向區(qū)域解析類似,同樣需要修改/etc/named.rfc1912.zones和建立/var/named目錄下的解析庫文件
第1步,修改獨立區(qū)域配置文件,添加區(qū)域配置信息:
vim /etc/named.rfc1912.zones
zone "136.168.192.in-addr.arpa"{ //反向解析域,IP需要倒寫
type master;
file "192.168.136.zone";
};
- 第2步,配置解析庫文件:
vim /var/named/192.168.136.zone
$TTL 1d
@ IN SOA dns1.hellopeiyang.com. admin.hellopeiyang.com. (100 3h 1h 12h 1d )
NS dns1.hellopeiyang.com.
230 PTR dns1.hellopeiyang.com.
229 PTR websrv.hellopeiyang.com.
100 PTR mailsrv1.hellopeiyang.com.
101 PTR mailsrv2.hellopeiyang.com.
注意:NS和PTR記錄的域名應該寫全并以"."結束,以防止系統自動視作在其后添加反向解析域
第3步,格式檢查:
named-checkconf
named-checkzone 192.168.136.zone /var/named/192.168.136.zone
第4步,重新載入配置:
rndc reload
第5步,測試:
dig -x 192.168.136.229 @192.168.136.230
或者下條命令
dig -t ptr 229.136.168.192.in-addr.arpa @192.168.136.230
(五)bind-chroot程序包
功能:將DNS服務的相關文件移至更深的目錄中,減少DNS被攻破時對系統的影響
安裝并啟動服務:
yum install bind-chroot
systemctl start named-chroot
發(fā)現/var/named/chroot目錄下有很多與named服務相關文件,并且文件的inode相同而硬連接數都只是1
- 這種情況只能是文件目錄掛載所形成的,執(zhí)行
mount
命令發(fā)現大量相關文件的掛載記錄,證明bind-chroot程序實現遷移文件至更深目錄的實質是將文件掛載至更深的目錄下
(六)允許動態(tài)更新
- 功能:允許客戶端通過命令更新解析庫資源記錄信息
- 準備工作:
- 指定的zone語句塊中修改allown-update選項
例如:allow-update {192.168.136.229;};
:只允許192.168.136.229主機能夠動態(tài)更新本機DNS解析庫指定zone的資源記錄 - chmod770 /var/named:增加寫權限
- 指定的zone語句塊中修改allown-update選項
- 動態(tài)更新命令:nsupdate
nsupdate
>server 192.168.136.230
>zone hellopeiyang.com
>update add ftp.hellopeiyang.com 86400 IN A 192.168.136.150
>send
>update delete ftp.hellopeiyang.com A
>send
(七)從服務器
從DNS服務器從主DNS服務器拷貝解析庫文件,共同提供DNS服務,提升DNS服務的可靠性
第1步,從服務器:配置主配置文件,修改options字段的如下內容:
options {
listen-on port 53 { localhost; };
allow-query { any; };
};
- 第2步,從服務器:修改獨立區(qū)域配置文件,添加區(qū)域配置信息
zone "hellopeiyang.com" IN {
type slave;
masters {192.168.136.230;};
file "slaves/hellopeiyang.com.slave.zone";
};
- 第3步,主服務器:添加解析庫文件NS記錄,修改后如下
vim /var/named/hellopeiyang.com.zone
$TTL 1D
@ IN SOA dns1 admin.hellopeiyang.com. (
101 ; serial //只要解析庫更新,一定要更新序列號
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1
NS dns2 //增加的NS記錄
dns1 A 192.168.136.230
dns2 A 192.168.136.130 //增加的A記錄
websrv A 192.168.136.229
www CNAME websrv
@ MX 10 mailsrv1
@ MX 20 mailsrv2
mailsrv1 A 192.168.136.100
mailsrv2 A 192.168.136.101
-
第4步,主服務器、從服務器:設置防止黑客窺視DNS信息
為了防止黑客通過建立從服務器,獲得主服務器的解析庫信息,需要在主服務器和從服務器的主配置文件/etc/named.conf中options條目中增加"allow-transfer"選項
主服務器增加內容:
allow-transfer {192.168.136.130;};
:只允許從服務器IP復制解析庫文件從服務器增加內容:
allow-transfer {none;};
:不允許任何IP復制解析庫文件
第5步,主服務器、從服務器:格式檢查
分別在主服務器和從服務器上執(zhí)行named-checkconf
命令
在主服務器上執(zhí)行named-checkzone hellopeiyang.com /var/named/hellopeiyang.com.zone
第6步,主服務器、從服務器:重新載入配置
rndc reload
第7步,測試
dig www.hellopeiyang.com @192.168.136.130
- 注意:客戶端查詢過程通過UDP的53端口進行,主、從服務器之間的解析庫同步操作需要通過TCP和UDP的53端口聯合進行。
(八)子域
(1)子域與父域在一臺主機上(適用于子域的流量比較小時)
- 第1步,修改獨立區(qū)域配置文件,添加子域配置信息,增加的信息如下:
zone "zhengzhou.hellopeiyang.com" IN {
type master;
file "zhengzhou.hellopeiyang.com.zone";
};
- 第2步,添加子域解析庫文件,內容如下:
cp -p /var/named/hellopeiyang.com.zone /var/named/zhengzhou.hellopeiyang.com.zone
復制一份父域的解析庫文件,在其上做修改
vim /var/named/zhengzhou.hellopeiyang.com.zone
$TTL 1D
@ IN SOA dns1 admin.hellopeiyang.com. (
101 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1
dns1 A 192.168.136.230
websrv A 192.168.136.160
www CNAME websrv
@ MX 10 mailsrv1
mailsrv1 A 192.168.136.170
第3步,檢查語法
named-checkconf
named-checkzone zhengzhou.hellopeiyang.com /var/named/zhengzhou.hellopeiyang.com.zone
第4步,重新載入配置
rndc reload
第5步,測試
dig www.zhengzhou.hellopeiyang.com @192.168.136.230
(2)子域與父域不在一臺主機上(適用于子域的流量比較大時)
又稱作:父域DNS服務器將DNS管理權委派給子域DNS服務器
- 第1步,父域DNS:在解析庫文件中增加子域的NS記錄
vim /var/named/hellopeiyang.com.zone
$TTL 1D
@ IN SOA dns1 admin.hellopeiyang.com. (
101 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1
henan NS dns2
dns1 A 192.168.136.230
dns2 A 192.168.136.130
websrv A 192.168.136.229
www CNAME websrv
@ MX 10 mailsrv1
@ MX 20 mailsrv2
mailsrv1 A 192.168.136.100
mailsrv2 A 192.168.136.101
named-checkzone hellopeiyang.com /var/named/hellopeiyang.com.zone //檢查語法
rndc reload //重新載入配置
- 第2步,子域DNS:創(chuàng)建子域shanghai.hellopeiyang.com
//步驟1:修改主配置文件
vim /etc/named.conf //修改的內容如下
options {
listen-on port 53 { localhost; };
allow-query { any; };
};
//步驟2:修改獨立區(qū)域配置文件
vim /etc/named.rfc1912.zones //增加的內容如下
zone "henan.hellopeiyang.com" IN {
type master;
file "henan.hellopeiyang.com.zone";
};
//步驟3:創(chuàng)建解析庫文件
vim /var/named/henan.hellopeiyang.com.zone
$TTL 1D
@ IN SOA dns1 admin.hellopeiyang.com. (
101 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1
dns1 A 192.168.136.130
websrv A 192.168.136.133
www CNAME websrv
chgrp named /var/named/henan.hellopeiyang.com.zone //更改所屬組
//步驟4:檢查語法
named-checkconf
named-checkzone henan.hellopeiyang.com /var/named/henan.hellopeiyang.com.zone
//步驟5:重新載入配置
rndc roload
- 第3步,測試
dig www.henan.hellopeiyang.com @192.168.136.230
(九)轉發(fā)服務器
(1) 全局轉發(fā): 對非本機所負責解析區(qū)域的請求,全轉發(fā)給指定的服務器
實現:修改/etc/named.conf文件
options {
forward first|only;
//first:轉發(fā)到達的DNS服務器若解析失敗,則自身直接發(fā)起DNS解析請求
//only:轉發(fā)到達的DNS服務器若解析失敗,則自身不再發(fā)起請求,本次DNS解析結果為失敗
forwarders { ip;};
};
(2) 特定區(qū)域轉發(fā):僅轉發(fā)對特定的區(qū)域的請求,比全局轉發(fā)優(yōu)先級高
實現:修改/etc/named.rfc1912.zones文件
zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { ip;};
};
(3)實驗一:實現全局轉發(fā)
- 第1步,轉發(fā)服務器的設置:
vim /etc/named.conf
options{
forward first;
forwarders {192.168.136.139;}; //凡是不在本區(qū)域DNS服務器中的請求一律轉發(fā)給192.168.136.139
dnssec-enable no;
dnssec-validation no;
};
named-checkconf
rndc reload
- 第2步,被轉發(fā)服務器:設置DNS服務
//步驟1:修改主配置文件
vim /etc/named.conf
options {
listen-on port 53 { localhost;};
allow-query { any; };
};
//步驟2:修改獨立區(qū)域配置文件
vim /etc/named.rfc1912.zones
zone "byebye.com" IN {
type master;
file "byebye.com.zone";
};
//步驟3:創(chuàng)建解析庫文件
vim /var/named/byebye.com.zone
$TTL 1D
@ IN SOA dns1 admin.hellopeiyang.com. (
101 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1
dns1 A 192.168.136.139
websrv A 192.168.136.66
www CNAME websrv
chgrp named /var/named/beijing.hellopeiyang.com.zone //更改所屬組
//步驟4:檢查語法
named-checkconf
named-checkzone byebye.com /var/named/byebye.com.zone
//步驟5:重新載入配置
rndc reload
- 第3步,測試
dig www.byebye.com @192.168.136.230
(4)實驗二:實現特定區(qū)域轉發(fā)
- 第1步,轉發(fā)服務器的設置:
vim /etc/named.rfc1912.zones
zone "byebye.com" IN {
type forward;
forward first;
forwarders {192.168.136.139;};
//僅當請求解析beijing.hellopeiyang.com區(qū)域時,轉發(fā)給192.168.136.224
};
named-checkconf
rndc reload
第2步,被轉發(fā)服務器:設置DNS服務,與實驗一:實現全局轉發(fā)過程完全相同
第3步,測試
dig www.byebye.com @192.168.136.230
(十)bind中的acl
acl:把一個或多個地址歸并為一個集合,并通過一個統一的名稱調用
語法:
acl acl_name{
ip;
net/prelen;
……
};
acl只能先定義后使用,因此一般定義在/etc/named.conf文件中options前面
-
bind的內置acl
- none:沒有一個主機
- any:任意主機
- localhost:本機
- localnet:本機的IP同掩碼運算后得到的網絡地址
-
訪問控制的指令
- allow-query {}:允許查詢的主機;白名單
- allow-transfer {}:允許區(qū)域傳送的主機;白名單
- allow-recursion {}:允許遞歸的主機,建議全局使用
- allow-update {}:允許更新區(qū)域數據庫中的內容
實驗:使用acl功能只允許192.168.136.0網段的主機查詢DNS服務
編輯/etc/named.conf文件,添加acl設置,并且在allow-query字段中添加acl
vim /etc/named.conf
acl lan {
192.168.136.0/24;
};
options {
listen-on port 53 { localhost; };
allow-query { lan;localhost; }; //添加名為lan的acl
};
named-checkconf
rndc reload
此時,只有192.168.136.0/24的網段可以查詢DNS其他網段的請求會被服務器拒絕