DNS 域名系統(英文:Domain Name System,縮寫:DNS)是因特網的一項服務。它作爲將域名和IP地址相互映射的一個分佈式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53。
是一個域名服務,應用層協議。
原理篇
DNS組成
根域(.)
頂級域(.com, .net, .org, .gov, .edu, .mil,.ac)
二級域(baidu.com,google.com ... ...)
dns查詢
迭代查詢
遞歸查詢
如下圖,從客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間的交互查詢就是迭代查詢。
總結:
1.遞歸查詢:
一般客戶機和服務器之間屬遞歸查詢,即當客戶機向DNS服務器發出請求後,若DNS服務器本身不能解析,則會向另外的DNS服務器發出查詢請求,得到結果後轉交給客戶機;
2.迭代查詢(反覆查詢):
一般DNS服務器之間屬迭代查詢,如:若DNS2不能響應DNS1的請求,則它會將DNS3的IP給DNS2,以便其再向DNS3發出請求;
所謂遞歸查詢就是:如果主機所詢問的本地域名服務器不知道被查詢的域名的IP地址,那麼本地域名服務器就以DNS客戶的身份,向其它根域名服務器繼續發出查詢請求報文(即替主機繼續查詢)”
也就是遞歸就是交給下一個服務器解決(下一個就相當於客戶了,所以他也可以選擇去遞歸,或者迭代)(迭代就是返回給當前的,當前自己再去處理)
遞歸即遞給服務器,所有操作都有服務器來完成。
舉例:比如學生問老師一個問題,王老師告訴他答案這之間的叫遞歸查詢。這期間也許王老師也不會,這時王老師問張老師,這之間的查詢叫迭代查詢!
DNS解析
正向解析區域和反向解析區域
正向解析是將域名映射爲IP地址
www.baidu.com --> 202.108.22.5
反向解析是將IP地址映射爲域名
202.108.22.5 --> www.baidu.com
注意:二者的名稱空間,非爲同一個空間,即非爲同一棵樹;因此,也不是同一個解析庫;
主-從DNS服務器
主DNS服務器:維護所負責解析的域數據庫的那臺服務器;讀寫操作均可進行;
從DNS服務器:從主DNS服務器那裏或其它的從DNS服務器那裏“複製”一份解析庫;但只能進行讀操作;
“複製”操作的實施方式:
序列號:serial, 也即是數據庫的版本號;主服務器數據庫內容發生變化時,其版本號遞增;
刷新時間間隔:refresh, 從服務器每多久到主服務器檢查序列號更新狀況;
重試時間間隔:retry, 從服務器從主服務器請求同步解析庫失敗時,再次發起嘗試請求的時間間隔;
過期時長:expire,從服務器始終聯繫不到主服務器時,多久之後放棄從主服務器同步數據;停止提供服務;
否定答案的緩存時長:
主服務器”通知“從服務器隨時更新數據;
區域傳送:
全量傳送:axfr, 傳送整個數據庫;
增量傳送:ixfr, 僅傳送變量的數據;
區域(zone)和域(domain):
baidu.com域:
FQDN --> IP
正向解析庫;區域
IP --> FQDN
反向解析庫;區域
區域數據庫文件:
資源記錄:Resource Record, 簡稱rr;
記錄有類型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA:Start Of Authority,起始授權記錄; 一個區域解析庫有且只能有一個SOA記錄,而且必須放在第一條;
NS:Name Service,域名服務記錄;一個區域解析庫可以有多個NS記錄;其中一個爲主的;
A: Address, 地址記錄,FQDN --> IPv4;
AAAA:地址記錄, FQDN --> IPv6;
CNAME:Canonical Name,別名記錄;
PTR:Pointer,IP --> FQDN
MX:Mail eXchanger,郵件交換器;
優先級:0-99,數字越小優先級越高;
資源記錄的定義格式:
語法:name [TTL] IN RR_TYPE value
SOA:
name: 當前區域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”;
value:有多部分組成
(1) 當前區域的區域名稱(也可以使用主DNS服務器名稱);
(2) 當前區域管理員的郵箱地址;但地址中不能使用@符號,一般使用點號來替代;
(3) (主從服務協調屬性的定義以及否定答案的TTL)
例如:
baidu.com. 86400 IN SOA baidu.com. admin.magedu.com. (
2017010801 ; serial
2H ; refresh
10M ; retry
1W ; expire
1D ; negative answer ttl
)
NS:
name: 當前區域的區域名稱
value:當前區域的某DNS服務器的名字,例如ns.magedu.com.;
注意:一個區域可以有多個ns記錄;
例如:
baidu.com. 86400 IN NS ns1.baidu.com.
baidu.com. 86400 IN NS ns2.baidu.com.
MX:
name: 當前區域的區域名稱
value:當前區域某郵件交換器的主機名;
注意:MX記錄可以有多個;但每個記錄的value之前應該有一個數字表示其優先級;
例如:
baidu.com. IN MX 10 mx1.baidu.com.
baidu.com. IN MX 20 mx2.baidu.com.
A:
name:某FQDN,例如www.baidu.com.
value:某IPv4地址;
例如:
www.baidu.com. IN A 1.1.1.1
www.baidu.com. IN A 1.1.1.2
bbs.baidu.com. IN A 1.1.1.1
AAAA:
name:FQDN
value: IPv6
PTR:
name:IP地址,有特定格式,IP反過來寫,而且加特定後綴;例如1.2.3.4的記錄應該寫爲4.3.2.1.in-addr.arpa.;
value:FQND
例如:
4.3.2.1.in-addr.arpa. IN PTR www.baidu.com.
CNAME:
name:FQDN格式的別名;
value:FQDN格式的正式名字;
例如:
web.baidu.com. IN CNAME www.baidu.com.
注意:
(1) TTL可以從全局繼承;
(2) @表示當前區域的名稱;
(3) 相鄰的兩條記錄其name相同時,後面的可省略;
(4) 對於正向區域來說,各MX,NS等類型的記錄的value爲FQDN,此FQDN應該有一個A記錄;
實戰篇
首先安裝bind程序包
bind:
主配置文件:/etc/named.conf
或包含進來其它文件;
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析庫文件:
/var/named/目錄下;
一般名字爲:ZONE_NAME.zone
注意:(1) 一臺DNS服務器可同時爲多個區域提供解析;
(2) 必須要有根區域解析庫文件: named.ca;
(3) 還應該有兩個區域解析庫文件:localhost和127.0.0.1的正反向解析庫;
正向:named.localhost
反向:named.loopback
rndc:remote name domain contoller(遠程域名控制)
953/tcp,但默認監聽於127.0.0.1地址,因此僅允許本地使用;
bind程序安裝完成之後,默認即可做緩存名稱服務器使用;如果沒有專門負責解析的區域,直接即可啓動服務;
CentOS 6.x: service named start
CentOS 7.x: systemctl start named.service
主配置文件格式:
全局配置段:
options { ... }
日誌配置段:
logging { ... }
區域配置段:
zone { ... }
那些由本機負責解析的區域,或轉發的區域;
注意:每個配置語句必須以分號結尾;
緩存名稱服務器的配置:
監聽能與外部主機通信的地址;
listen-on port 53;
listen-on port 53 { 172.16.100.67; };
學習時,建議關閉dnssec
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
關閉僅允許本地查詢:
//allow-query { localhost; };
檢查配置文件語法錯誤:
named-checkconf [/etc/named.conf]
測試工具:
dig, host, nslookup等
配置解析一個正向區域
步驟:
1、定義區域(在/etc/named.conf或/etc/named.rfc1912.zones)
2、定義數據文件(/var/named/xxx.zone)
權限及屬組修改
修改該文件的權限爲640,屬主屬組爲root:named
檢查語法錯誤
# named-checkzone ZONE_NAME ZONE_FILE
# named-checkconf
3、重載配置文件
詳細
1、定義區域
zone "baidu.com" IN {
type master;
file "baidu.com.zone";
};
注意:區域名字即爲域名;
2、定義數據文件(編輯一個名爲baidu.com.zone的文件與第一步的file所指的相同)
文件爲:/var/named/baidu.com.zone
$TTL 3600
baidu.com. IN SOA ns1.baidu.com. dnsadmin.baidu.com. (
2017010801
1H
10M
3D
1D )
IN NS ns1
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 172.16.100.67
mx1 IN A 172.16.100.68
mx2 IN A 172.16.100.69
www IN A 172.16.100.67
web IN CNAME www
bbs IN A 172.16.100.70
bbs IN A 172.16.100.71
權限及屬組修改
修改該文件的權限爲640,屬主屬組爲root:named
檢查語法錯誤
# named-checkconf
3、重載配置文件
rndc reload
配置反向區域
步驟:
1、定義區域(在/etc/named.conf或/etc/named.rfc1912.zones)
2、定義區域解析庫文件(/var/named/xxx.zone)
3、重載配置文件
1、定義區域
zone "100.16.172.in-addr.arpa" IN {
type master;
file "172.16.100.zone";
};
注意:反向區域的名字
反寫的網段地址.in-addr.arpa
如:100.16.172.in-addr.arpa
2、定義區域解析庫文件(主要記錄爲PTR)
示例,區域名稱爲100.16.172.in-addr.arpa;
$TTL 3600
$ORIGIN 100.16.172.in-addr.arpa.
@ IN SOA ns1.baidu.com. nsadmin.baidu.com. (
2017010801
1H
10M
3D
12H )
IN NS ns1.baidu.com.
67 IN PTR ns1.baidu.com.
68 IN PTR mx1.baidu.com.
69 IN PTR mx2.baidu.com.
70 IN PTR bbs.baidu.com.
71 IN PTR bbs.baidu.com.
67 IN PTR www.baidu.com.
別忘了修改權限和屬主屬組
檢查語法錯誤
named-checkconf
3、重載配置文件
rndc reload
配置主從DNS服務器
步驟:
1、定義一個從區域(/var/named/slaves)
2、重載配置
1、定義區域(從區域)
zone "ZONE_NAME" IN {
type slave;
file "slaves/ZONE_NAME.zone";
masters { MASTER_IP; };
}
配置文件語法檢查:named-checkconf
(2) 重載配置
rndc reload
注意:(1) 確保區域數據文件中爲每個從服務配置NS記錄,並且在正向區域文件需要每個從服務器的NS記錄的主機名配置一個A記錄,且此A後面的地址爲真正的從服務器的IP地址;
注意:時間要同步;
ntpdate命令;
DNS子域授權
子域授權就相當於是劃片管理,是由上至下的授權。由根開始"."。
例如:.com .net 就是由根授權名稱空間,其實就是由.決定要劃分什麼的名稱空間,由它委派子名稱空間。
例:若有個baidu.com.的域名,自己想再分多點子域名,如zhangsan.baidu.com. 就需要子域授權 。這就和51cto的博客一樣,我的博客地址爲http://zhaoyongtao.blog.51cto.com/ 這就是在blog.51cto.com.下的一個子域。
DNS中最重要的就是NS記錄,其中每個NS裏面的負責人就是SOA,在父域上定義一條NS記錄和一條A記錄就可以完成子域授權了
正向解析區域授權子域(/var/named/baidu.com.zone):
zhangsan.baidu.com. IN NS ns1.zhangsan.baidu.com.
s1. zhangsan.baidu.com. IN A IP.AD.DR.ESS(子域服務器ip)
lisi.baidu.com. IN NS ns1.lisi.baidu.com.
ns1.lisi.baidu.com. IN A IP.AD.DR.ESS
此子域就相當於一個域了,可以再給此子域添加正向解析記錄。
定義轉發:
注意:被轉發的服務器必須允許爲當前服務做遞歸;
(1) 區域轉發:僅轉發對某特定區域的解析請求;
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; };
};
first:首先轉發;轉發器不響應時,自行去迭代查詢;
only:只轉發;
(2) 全局轉發:針對凡本地沒有通過zone定義的區域查詢請求,通通轉給某轉發器;
options {
... ...
forward {only|first};
forwarders { SERVER_IP; };
.. ...
};
bind中的安全相關的配置:
acl:訪問控制列表;把一個或多個地址歸併一個命名的集合,隨後通過此名稱即可對此集全內的所有主機實現統一調用;
acl acl_name {
ip;
net/prelen;
};
示例:
acl mynet {
172.16.0.0/16;
127.0.0.0/8;
};
bind有四個內置的acl
none:沒有一個主機;
any:任意主機;
local:本機;
localnet:本機所在的IP所屬的網絡;
訪問控制指令:
allow-query {}; 允許查詢的主機;白名單;
allow-transfer {}; 允許向哪些主機做區域傳送;默認爲向所有主機;應該配置僅允許從服務器;
allow-recursion {}; 允許哪此主機向當前DNS服務器發起遞歸查詢請求;
allow-update {}; DDNS,允許動態更新區域數據庫文件中內容;
bind view:
視圖:
view VIEW_NAME {
zone
zone
zone
}
view internal {
match-clients { 172.16.0.0/8; };
zone "magedu.com" IN {
type master;
file "magedu.com/internal";
};
};
view external {
match-clients { any; };
zone "magecdu.com" IN {
type master;
file magedu.com/external";
};
};