DNS(Domain Name System 域名系統)web
DNS是因特網的一項服務,將域名和IP地址相互映射爲一個分佈式數據庫,令人可以更方便地訪問互聯網;DNS使用TCP和UDP的53端口數據庫
================================================================================
緩存
dns的分佈式結構:安全
tld:Top Level Domain(頂級域,在根之下)服務器
組織域:.com, .net, .org, .gov, .edu, .mil網絡
國家域:.iq, .tw, .hk, .jp, .cn, ...dom
DNS查詢類型:tcp
遞歸查詢:本地的主機向指向的DNS服務器發起的查詢請求分佈式
迭代查詢:被指向的DNS服務器向其餘DNS服務器發起的查詢請求一般是迭代查詢ide
DNS名稱解析方式:
正向解析:名稱 --> IP
反向解析:IP --> 名稱
注意:兩者的名稱空間,非爲同一個空間,即非爲同一棵樹;所以,也不是同一個解析庫;
DNS服務器類型:
負責解析至少一個域:
主名稱服務器;
輔助名稱服務器;
不負責域名解析:
緩存名稱服務器;
一次完整的查詢請求通過的流程:
Client --> hosts文件 --> DNS Local Cache --> DNS Server(recursion遞歸) -->
1)本身負責解析的域:直接查詢數據庫並返回答案;
2)不是本身負責解析域:Server Cache --> iteration(迭代查詢)
解析答案類型:
1)確定答案:有查詢到的記錄;確定答案可緩存;
2)否認答案:不存在查詢的鍵,所以,不存在與其查詢鍵對應的值;
1)權威答案:由直接負責的DNS服務器返回的答案;
2)非權威答案:不是DNS服務器直接返回的答案,例如DNS服務器緩存的答案
================================================================================
主-輔DNS服務器:
主DNS服務器:維護所負責解析的域數據庫的那臺服務器;讀寫操做都可進行;
從DNS服務器:從主DNS服務器那裏或其它的從DNS服務器那裏「複製」一份解析庫;但只能進行讀操做,即只能進行查詢操做,不能修改
從DNS服務器「複製」操做的實施方式:
序列號:serial, 也便是數據庫的版本號;當主服務器數據庫內容發生變化時其版本號要遞增;從服務器經過查看主服務器數據庫序列號得知數據庫是否更新;
刷新時間間隔:refresh, 從服務器每隔多久到主服務器檢查序列號更新情況;
重試時間間隔:retry, 從服務器向主服務器請求同步解析庫失敗時,再次發起嘗試請求的時間間隔;retry應小於refresh;
過時時長:expire,從服務器始終聯繫不到主服務器時,多久以後放棄從主服務器同步數據;中止提供服務;
否認答案的緩存時長
主服務器「通知」從服務器隨時更新數據;
區域傳送:
全量傳送:axfr, 傳送整個數據庫;
增量傳送:ixfr, 僅傳送變化的數據;
區域(zone)和域(domain):
例如magedu.com域:區域是物理概念,域是邏輯概念
FQDN --> IP 正向解析庫;區域
IP --> FQDN(主機名)反向解析庫;區域
區域數據庫文件:
資源記錄:Resource Record, 簡稱rr;
資源記錄類型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA:Start Of Authority,起始受權記錄;指定有關DNS區域的權威性信息;一個區域解析庫有且只能有一個SOA記錄,並且必須放在第一條;
NS:Name Service,域名服務記錄;標示區域內DNS服務器的主機名;一個區域解析庫能夠有多個NS記錄;其中一個爲主的;
A: Address, 地址記錄,FQDN --> IPv4;
AAAA:地址記錄, FQDN --> IPv6;
CNAME:Canonical Name,別名記錄;
PTR:Pointer,PTR指針記錄實現反向解析;IP --> FQDN;
MX:Mail eXchanger,郵件交換器;標示郵件服務器的主機名;優先級:0-99,數字越小優先級越高;
資源記錄的定義格式:
語法:name [TTL] INRR_TYPE value
name:既能夠是ip(反向解析),也多是某個主機名
[TTL]:域名解析記錄在DNS服務器中的存留時間,省略時可統一分配TTL值
IN:關鍵字
RY_TYPE:資源記錄類型
value:資源記錄的值
SOA:
name: 當前區域的名字;例如」mageud.com.」,或者「2.3.4.in-addr.arpa.」;
value:由多部分組成:
1)當前區域的區域名稱(也可使用主DNS服務器名稱);
2)當前區域管理員的郵箱地址;但地址中不能使用@符號,通常使用點號來替代;
3)(主從服務協調屬性的定義以及否認答案的統一TTL值)
例如:[分號後爲註釋,H、M、W、D分別表示小時、分鐘、周、天]
magedu.com. 86400 IN SOA magedu.com. admin.magedu.com. (
2017010801; serial
2H ; refresh
10M ; retry
1W; expire
1D; negative answer ttl
)
NS:
name: 當前區域的區域名稱
value:當前區域的某DNS服務器的主機名,例如ns.magedu.com.;
注意:一個區域能夠有多個DNS服務器,所以能夠有多個ns記錄; 例如:
magedu.com. 86400 IN NS ns1.magedu.com.
magedu.com. 86400 IN NS ns2.magedu.com.
MX:
name: 當前區域的區域名稱
value:當前區域某郵件服務器的主機名;
注意:MX記錄能夠有多個;但每一個記錄的value以前應該有一個數字表示其優先級;例如:
magedu.com. IN MX 10 mx1.magedu.com.
magedu.com. IN MX 20 mx2.magedu.com.
A:
name:某FQDN(主機名),例如www.magedu.com.
value:主機的IPv4地址;FQDN和IP可互相對應多個;
例如:
www.magedu.com.IN A1.1.1.1
www.magedu.com.IN A1.1.1.2
bbs.magedu.com.IN A1.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 PTRwww.magedu.com.
CNAME:
name:FQDN格式的別名;
value:FQDN格式的正式名字;
例如:
web.magedu.com. IN CNAME www.magedu.com.
注意:
(1) TTL能夠從全局繼承;
(2) @表示當前區域的名稱;
(3) 相鄰的兩條記錄其name相同時,後面記錄的name可省略;
(4) 對於正向區域來講,各MX,NS等類型的記錄的value爲FQDN,此FQDN應該有一個A記錄;
================================================================================
BIND的安裝配置:
BIND: Berkeley Internet Name Domain,如今由互聯網系統協會ISC開發和維護
dns是一種協議;bind是dns協議的一種實現
named:bind程序的運行的進程名
bind相關的程序包:
系統自帶:
bind-libs:被bind和bind-utils兩個包中的程序共同用到的庫文件;
bind-utils:bind客戶端程序集,例如dig, host, nslookup等;
手動安裝:
bind:提供了dns server程序、以及幾個經常使用的測試程序;
bind-chroot:選裝,讓named進程運行於jail模式下;
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(遠程名稱域控制器)
工做於tcp的953端口,但默認監聽於127.0.0.1地址,所以僅容許本地使用;
bind程序安裝完成以後,默認便可做爲緩存名稱服務器使用;若是沒有專門負責解析的區域,可直接啓動服務;
CentOS 6: service named start
CentOS 7: systemctl start named.service
主配置文件格式:
全局配置段:options { ... }
日誌配置段:logging { ... }
區域配置段:zone { ... } 定義那些由本機負責解析的區域,或轉發的區域;注意:每一個配置語句必須以分號結尾;
緩存名稱服務器的配置:
監聽能與外部主機通訊的地址;
listen-on port 53; //監聽本機全部地址
listen-on port 53 { 192.168.2.17; }; //監聽特定的地址
學習時,建議關閉dnssec功能
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
關閉僅容許本地查詢:
//allow-query { localhost; };
檢查配置文件語法錯誤:
named-checkconf [/etc/named.conf]
配置文件檢查無誤後,便可啓動服務:
能夠將dns服務器指向本身:
測試工具:dig, host, nslookup等
一、dig命令:用於測試dns系統,所以其不會查詢hosts文件;
dig [-t RR_TYPE] name [@SERVER] [query options]
[-t RR_TYPE]:指明資源記錄類型;
name:將哪一個名字解析爲資源記錄的值;
[@SERVER]:經過指定的DNS服務器解析,不指明則經過本機測試
查詢選項:
+[no]trace:是否跟蹤解析過程;
+[no]recurse:是否進行遞歸解析
注意:反向解析測試
dig -x IP
模擬徹底區域傳送:
dig -t axfr DOMAIN [@server]
二、host命令:
host [-t RR_TYPE] name [SERVER_IP]
三、nslookup命令:
nslookup [-options] [name] [server]
交互式模式:
nslookup>
server IP:以指定的IP爲DNS服務器進行查詢;
set q=RR_TYPE:要查詢的資源記錄類型;
name:要查詢的名稱;
四、rndc命令:named服務控制命令
rndc status:顯示服務器的狀態
rndc flush:清空服務器的緩存
rndc reload:從新加載配置文件和區域數據文件
================================================================================
配置解析一個正向區域:
以coffeeyep.com域爲例:
(1) 定義區域
在主配置文件中或主配置文件的輔助配置文件中實現;
zone "ZONE_NAME" IN {
type {master|slave|hint|forward}; //定義區域類型{主|從|根|轉發}服務器
file "ZONE_NAME.zone"; //指明區域文件路徑,相對路徑爲/var/named下
};
注意:區域名字即爲域名;
/var/named.conf只定義了根,指明瞭遵循rfc1912規範的各區域的專用配置文件的路徑
(2) 創建區域數據文件(主要記錄爲A或AAAA記錄)
在/var/named目錄下創建區域數據文件;
文件爲:/var/named/coffeeyep.com.zone
權限及屬組修改:
# chgrp named /var/named/coffeeyep.com.zone
# chmod o= /var/named/coffeeyep.com.zone
檢查語法錯誤:
# named-checkconf
# named-checkzone ZONE_NAME ZONE_FILE
(3) 讓服務器重載配置文件和區域數據文件
# rndc reload 或
# systemctl reload named.service
接下來就能夠指定本身爲DNS服務器進行解析了
================================================================================
配置解析一個反向區域
(1) 定義區域
在主配置文件中或主配置文件輔助配置文件中實現;
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
注意:反向區域的名字:
反寫的網段地址.in-addr.arpa
(2) 定義區域解析庫文件(主要記錄爲PTR)
示例,區域名稱爲2.168.192.in-addr.arpa;
權限及屬組修改:
# chgrp named /var/named/172.16.100.zone
# chmod o= /var/named/172.16.100.zone
檢查語法錯誤:
# named-checkconf
# named-checkzone ZONE_NAME ZONE_FILE
(3) 讓服務器重載配置文件和區域數據文件
# rndc reload 或
# systemctl reload named.service
接下來就能夠進行反向解析了:
================================================================================
配置主從服務器:
注意:從服務器是區域級別的概念;便可以僅從與主服務器的某個區域
注意:主從服務器時間要同步,可以使用ntpdate命令同步時間服務器;
配置一個從區域:
On Master(192.168.2.17):
確保區域數據庫文件中爲每一個從服務器都配置了NS記錄,而且在正向區域文件須要每一個從服務器的NS記錄的主機名配置一個A記錄,且此A記錄後面的地址爲真正的從服務器的IP地址;
檢查區域配置文件:
重載區域配置文件:
On Slave(192.168.2.18):
(1) 定義區域,定義一個從區域;
zone "ZONE_NAME" IN {
type slave;
file "slaves/ZONE_NAME.zone";
masters { MASTER_IP; };
};
主服務器的slave目錄對於屬主屬組都有寫權限,專用於從服務器從主服務器同步文件、須要自動建立數據庫文件時使用
配置文件語法檢查:named-checkconf
(2) 重載配置
rndc reload 或
systemctl reload named.service
接下來就能夠在從服務器的/var/named/slaves目錄下看到從主服務器傳送的區域配置文件了
將DNS服務器指向本身解析www.coffeeyep.com:
On Master(192.168.2.17):
再次在主DNS服務器上新增一條A記錄:
重載配置文件後,就能夠查看DNS的狀態中發送序列號更新通知到從服務器了:
On Slave(192.168.2.18):
查看DNS狀態中接收到主服務器的更新序列號通知並自動更新區域配置文件了:
從服務器無需重載配置文件便可查詢到主DNS服務器新增的記錄了:
配置從服務器的反向解析區域
On Master(192.168.2.17):
在主DNS服務器上的反向解析區域的數據庫文件中添加從服務器的NS記錄和PTR指針記錄
On Slave(192.168.2.18):
添加反向解析的區域配置文件
On Master(192.168.2.17):
再次在主DNS服務器上新增一條反向解析記錄:
On Slave(192.168.2.18):
從服務器接收到主服務器的反向解析文件更新序列號通知並自動更新其區域配置文件
手動執行區域傳送
On Master(192.168.2.17):
On Slave(192.168.2.18):
手動執行正向區域傳送
手動執行反向區域傳送
注意:主DNS服務器應該配置訪問控制權限,只開放僅有從DNS服務器能傳送的權限。
================================================================================
子域受權:
正向解析區域受權子域的方法:
在正向區域中定義子域的主從服務器的NS記錄和A記錄便可,子域也應有主從DNS服務器
ops.coffeeyep.com. IN NS ns1.ops.coffeeyep.com.
ops.coffeeyep.com. IN NS ns2.ops.coffeeyep.com.
ns1.ops.coffeeyep.com. IN A IP.AD.DR.ESS
ns2.ops.coffeeyep.com. IN A IP.AD.DR.ESS
On Master(192.168.2.17):
On Subns1(子域主DNS服務器,192.168.2.19):
/* (使用本地yum源出問題了,重建下緩存)
查看當前主機的53號端口處於監聽狀態,就能夠做爲緩存名稱服務器使用了
配置子域ops.coffeeyep.com的主DNS服務器的正向解析區域和區域配置文件
On Master(192.168.2.17):
在父域上能夠解析子域了:
定義轉發:
注意:被轉發的服務器必須容許爲當前服務器作遞歸;
(1) 區域轉發:僅轉發對某特定區域的解析請求;
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; }; //定義轉發給哪臺DNS服務器
};
first:首先轉發;轉發器不響應時,自行去迭代查詢;
only:只轉發;
On Subns1(192.168.2.19):
(2) 全局轉發:針對凡本地沒有經過zone定義的區域查詢請求,通通轉給某轉發器;
options {
... ...
forward {only|first};
forwarders { SERVER_IP; };
.. ...
};
On Subns1(192.168.2.19):
================================================================================
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,容許動態更新區域數據庫文件中內容;若是沒有使用DDNS,每一個區域默認都應設置爲none
On Master(192.168.2.17):
定義acl,注意acl的位置需在options以前
在區域中添加acl表示只對此區域生效,僅容許本機和從服務器作傳送;
On Subns1(192.168.2.19):
因爲不在192.168.2.17的acl白名單中,由於不能經過其作區域傳送了
On Master(192.168.2.17):
配置容許遞歸查詢的acl
================================================================================
bind view(智能DNS):
視圖:
view VIEW_NAME {
zone
zone
zone
}
例如:使用view定義內網和外網的用戶分別獲得不一樣的解析結果,優先匹配的位置要放在上面定義,這樣不一樣的view能夠獲得不一樣的解析結果,完成智能解析
view internal {
match-clients { 172.16.0.0/8; };
zone "coffeeyep.com" IN {
type master;
file "coffeeyep.com/internal";
};
};
view external {
match-clients { any; };
zone "coffeeyep.com" IN {
type master;
file coffeeyep.com/external";
};
};