正向,反向,主從,子域,轉發器,安全控制。數據庫
介紹:
vim
top level domain(tld) 頂級域windows
域的組織絡式,咱們也看到箭頭是單向的,這也是域名解析的方式,在本地DNS服務器沒法解析的狀況下,本地DNS服務器會直接去找根域,再找頂級域,找到組織域再找到主機名。註冊域名通常就是註冊的組織域,如今也有那種net.co,這種不知道是怎麼個狀況。
centos
遞歸 迭代:緩存
如今咱們先來看看左下角這個用戶是如何解析到redhat.com下面的主機的。server是對應的dns服務器。
安全
用戶向本地的DNS服務器,發送解析請求。本地的DNS服務器出去饒了一大圈最終返回給用戶結果。服務器
這種隱藏背後的操做,直接爲用戶返回結果就是對用戶支持遞歸。網絡
可是對於DNS服務器來講,它本身沒有請求的答案,因此就直接去找根,而根告訴DNS服務器去找com.,服務器收到之後就再去找com.,com又告訴咱們的DNS服務器再去找redhat.com,服務器再去找redhat.com,redhat.com這個DNS服務器上面有這個答案,因此直接返回給咱們本地的DNS服務器。本地的DNS服務器再返回給用戶最終答案。session
上面DNS服務器一次又一次的重複去找同一個答案,這種過程就是迭代。
dom
若是是redhat下面的主機想要解析google下面主機的主機名。redhat的DNS服務器沒有答案也是會直接去找根,不會去找上級COM的,即便看起來這樣更近。
由於要達到這樣的效果太難了,本地的DNS服務器須要有每一個負責com域服務器的IP地址,其它的同級域固然也要有了,並且那些服務器發生變化也還要同步更新。因此,結果就是咱們的DNS服務器上面只有全球13個根的服務器地址。
正向解析與反向解析:
名稱 --> IP:正向解析
IP --> 名稱:反向解析
兩者的名稱空間,非爲同一個空間,即非爲同一棵樹;所以,也不是同一個解析庫;
反向的樹有點這個姿式。
地址就是從上到下的IP地址塊。不過這個在公網上沒有物理存在的解析樹,只是在公司組織內部有時候會使用。
正向解析是 倒置的域名樹。
反向解析是 倒置的IP樹。
很明顯它們一點也不同。因此在作DNS服務的時候要明白這是兩個徹底不一樣的東西,沒有交集。
DNS服務器類型:
主DNS服務器
輔助DNS服務器
緩存名稱服務器
只要是DNS服務器默認狀況下都會把不是本身管轄的區域的解析記錄,緩存下來。
而這種主要是用來給客戶端作遞歸的DNS服務器就是緩存名稱服務器。
一次完整的查詢請求通過的流程:
Client --> hosts文件 --> DNS Local Cache --> DNS Server (recursion) -->
本身負責解析的域:直接查詢數據庫並返回答案;
不是本身負責解析的域:Server Cache --> iteration(迭代)
解析答案:
確定答案:
否認答案:不存在查詢的鍵,所以,不存在與其查詢鍵對應的值;
權威答案:由直接負責的DNS服務器返回的答案;
非權威答案:
主-輔DNS服務器:
主DNS服務器:維護所負責解析的域數據庫的那臺服務器;讀寫操做都可進行;
從DNS服務器:從主DNS服務器那裏或其它的從DNS服務器那裏「複製」一份解析庫;但只能進行讀操做;
「複製」操做的實施方式:
序列號:serial, 也便是數據庫的版本號;主服務器數據庫內容發生變化時,其版本號遞增;
刷新時間間隔:refresh, 從服務器每多久到主服務器檢查序列號更新情況;
重試時間間隔:retry, 從服務器從主服務器請求同步解析庫失敗時,再次發起嘗試請求的時間間隔;
過時時長:expire,從服務器始終聯繫不到主服務器時,多久以後放棄從主服務器同步數據;而且本身也中止提供服務;
否認答案的緩存時長:
主服務器能夠」通知「從服務器隨時更新數據;
區域傳送:區域數據文件
全量傳送:axfr, 傳送整個數據庫;通常剛創建完成DNS的時候。
增量傳送:ixfr, 僅傳送變化的數據;
區域數據庫文件:
資源記錄:Resource Record, 簡稱rr;
記錄類型:A, AAAA, PTR, SOA, NS, CNAME, MX
資源記錄類型,用於資源的功能。
SOA: Start Of Authority, 起始受權 區域管理者,一個區域解析庫有且只能有一個SOA記錄,並且必須放在第一條;
NS: Name Server 域名服務記錄;一個區域解析庫能夠有多個NS記錄;其中一個爲主的;
MX: Mail eXchange: 郵件交換器, 優先級:0-99,數字越小優先級越高;
A: Address : (FQDN-->IP) 地址記錄,FQDN --> IPv4;
PTR: PoiTeR, IP --> FQDN 反向地址記錄,IP --> FQDN
AAAA: Address FQDN --> IPv6 地址記錄,FQDN --> IPv6
CNAME: Canonical Name, 別名記錄
資源記錄的定義格式:
語法: name [TTL] IN RR_TYPE value
資源記錄的格式:
name [ttl] IN RRtype Value
name: 須要解析的名稱
ttl : 客戶端緩存能夠保留的時間。
IN : 關鍵字
RRtype: 記錄類型
Value :所解析名稱得值
SOA :
name 只能是區域名稱 能夠用@來表示區域。
value 區域名稱(也能夠用主dns的FQDN), 管理員郵箱 , 附加信息。 ; 分號表明註釋。
@ 600 IN SOA ds.star.com. dd.star.com. (
serial number ;序列號,用來表示記錄是否有變更,十位之內的十進制數字
refresh time ;刷新時間,多久到服務器檢查一次數據。
retry time ;重試時間, 刷新失敗後,再嘗試時間。
expire time ;過時時間, 輔助DNS將中止工做。
negative answer ttl ;否認答案的ttl,客戶端緩存否認答案的時間。
)
上面中括號裏的數據能夠寫在同一行。用空格分隔。
dd.star.com 就是 dd@star.com. 由於文件中@有特殊意義。
SOA 必須是區域數據庫文件的第一條記錄。
刷新時間單位 秒。 也能夠用 M 分 H 小時, D 天
SOA中定義的序列號只要是增加,主服務器就會觸發通知機制,序列號減小不會觸發。
NS : 表明DNS服務器,一個區域能夠有多個。
name 區域名稱, 能夠用@表示。
value dns服務器的FQDN.
@ 600 IN NS dns.star.com.
@ 600 IN NS ns 不寫全自動補上區域名稱。
A : 若是有多個相同主機名的A記錄,就會輪詢着給客戶端地址。
name: FQDN
value: IP
MX: 表明這個區域裏的smtp服務器,一個區域能夠有多個 指定優先級。
用來標識區域裏的郵件服務器的。要否則這也不知道發給誰啊 tc@star.com
name:區域名稱
value: 包含優先級和FQDN.
優先級: 0-99 ,數字越小,級別越高。此優先級不是輪詢用是,是用來備份的。
@ 600 IN MX 10 mail
這個域的郵件服務器是mail,要有相對應的A記錄。
CNAME:
name : FQDN 別名
value: FQDN 真實的名
ftp 600 IN CNAME www
ftp 的正式名稱是www, www 的別名是ftp
PTR : IP-->FQDN, 反向查找,在正向區域物理文件中雖然也能夠寫PTR記錄,但最好仍是把它們分開的好。 能夠有多條記錄。
name: IP 反向IP地址。
value: FQDN
區域名稱爲: 網絡地址反向.in-addr.arpa.
注意主機名的 . 和相對名稱 、絕對名稱。相對名稱就是會自動會在主機名後加上區域名稱的。絕對名稱必定要以.點結尾。 要否則會再加上區域名稱。
一個區域只能有一個主DNS服務器。
注意:
(1) TTL能夠從全局繼承; $TTL 3600
(2) @表示當前區域的名稱;
(3) 相鄰的兩條記錄其name相同時,後面的name可省略;
(4) 對於正向區域來講,各MX,NS等類型的記錄的value爲FQDN,此FQDN應該有一個A記錄;
環境:
bind:BIND 9.9.4-RedHat-9.9.4-18.el7 (Extended Support Version)
系統:CentOS Linux release 7.1.1503 (Core)
各主機:
172.16.40.10 |
主DNS服務器 |
172.16.40.11 |
從DNS |
172.16.40.12 |
子DNS |
172.16.249.218 |
測試機 |
注意事項:時間同步。
安裝:
BIND:Berkeley Internet Name Domain 伯克利建立,現由ISC.ORG維護。
isc(www.isc.org) dhcp軟件也是由isc來維護。
直接yum安裝便可,並且也省去了本身建立一些所必須的區域文件。
咱們這裏就只安裝bind包了,其它的如chroot功能包這裏就不介紹了。
[root@localhost ~]# yum install bind -y Package bind.x86_64 32:9.9.4-18.el7 will be installed
[root@localhost ~]# rpm -ql bind ..... /etc/named /etc/named.conf /etc/named.rfc1912.zones /etc/named.root.key #在CentOS6上面若是不能轉發,能夠把這個註釋試試。 /etc/rndc.conf #用於rndc與bind通訊 /etc/rndc.key #用於rndc與bind通訊 /usr/sbin/named-checkconf #用來檢查bind的配置文件。 /usr/sbin/named-checkzone #用來檢查區域數據文件 /usr/sbin/rndc /var/named/named.ca /var/named/named.empty /var/named/named.localhost /var/named/named.loopback /var/named/slaves
主配置文件:
/etc/named.conf
包含進來的其它文件:
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析庫文件:
/var/named/目錄下;
通常名字爲:ZONE_NAME.zone
rndc: Remote Name Domain Controller 遠程名稱域管理。953/tcp,默認監聽於127.0.0.1地址,所以僅容許本地使用;爲了安全着想通常也不用設置。
看到生成了幾個named開頭的文件,這些都是所必須的區域數據文件。
注意:
(1) 一臺DNS服務器可同時爲多個區域提供解析;
(2) 必需要有根區域解析庫文件: named.ca;
(3) 還應該有兩個區域解析庫文件:localhost和127.0.0.1的正反向解析庫;
正向:named.localhost
反向:named.loopback
rpm安裝的會本身帶,就是上面的那幾個named.*文件,若是是編譯安裝就要本身寫了。
bind程序安裝完成以後,默認便可作緩存名稱服務器使用;若是沒有專門負責解析的區域,直接便可啓動服務;
CentOS 6: service named start
CentOS 7: systemctl start named.service
配置:
主配置文件:
options {
全局選項;
};
zone "ZONE name" {
區域數據文件;
};
logging {
定義日誌系統;
};
如:
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "star.com." IN {
type master;
file "star.com.zone";
};
type包括:
hint 根提示
master 主區域
slave 輔助區域
forward 轉發區域
注意每行後面的分號。
options { listen-on port 53 { 127.0.0.1; }; #默認監聽127,要改成監聽的網卡 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 { localhost; }; #容許查詢的主機,白名單。能夠註釋,默認全部 recursion yes; #容許全部給全部主機遞歸。 dnssec-enable yes; #DNS的安全擴展認證機制,若是出現問題能夠禁用試試。 dnssec-validation yes; # dnssec-lookaside auto; # bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; #包含的配置文件,裏面有不少區域的定義。 include "/etc/named.root.key"; #在centos6上面若是不能轉發,能夠註釋掉試試。
我這裏的配置
/etc/named.conf 全局配置,其它部分沒有改。
options { listen-on port 53 { 172.16.40.10; }; 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 { localhost; };
咱們先來啓動下看看。
[root@localhost ~]# ss -unl State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 172.16.40.10:53 *:* UNCONN 0 0 *:123 *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 ::1:53 :::* [root@localhost ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 10 172.16.40.10:53 *:*
tcp/udp的53號端口。
172.16.249.218測試:
[root@localhost ~]# dig -t A www.baidu.com @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t A www.baidu.com @172.16.40.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50339 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 5 ;; QUESTION SECTION: ;www.baidu.com. IN A ;; ANSWER SECTION: www.baidu.com. 1200 IN CNAME www.a.shifen.com. www.a.shifen.com. 300 IN A 61.135.169.121 www.a.shifen.com. 300 IN A 61.135.169.125 ;; AUTHORITY SECTION: a.shifen.com. 1198 IN NS ns4.a.shifen.com. a.shifen.com. 1198 IN NS ns1.a.shifen.com. a.shifen.com. 1198 IN NS ns2.a.shifen.com. a.shifen.com. 1198 IN NS ns3.a.shifen.com. a.shifen.com. 1198 IN NS ns5.a.shifen.com. ;; ADDITIONAL SECTION: ns2.a.shifen.com. 1198 IN A 180.149.133.241 ns3.a.shifen.com. 1198 IN A 61.135.162.215 ns5.a.shifen.com. 1198 IN A 119.75.222.17 ns1.a.shifen.com. 1198 IN A 61.135.165.224 ns4.a.shifen.com. 1198 IN A 115.239.210.176 ;; Query time: 3253 msec ;; SERVER: 172.16.40.10#53(172.16.40.10) ;; WHEN: Sat Jan 9 17:00:12 2016 ;; MSG SIZE rcvd: 260
工具介紹:
dig命令:
dig [-t RR_TYPE] name [@SERVER] [query options]
用於測試dns系統,所以其不會查詢hosts文件;
查詢選項:
+[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:要查詢的名稱;
nslookup在windows上也有。
配置一個正向解析區域:
一、定義區域
在主配置文件中或主配置文件輔助配置文件中實現;
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
注意:區域名字ZONE_NAME即爲域名;
我這裏是在named.rfc1912.zones文件中添加的,也能夠在named.conf文件中添加。
注意分號。
[root@localhost ~]# vim /etc/named.rfc1912.zones zone "star.com" IN { type master; file "star.com.zone"; };
文件的位置是相對於主配置文件中的directory而言的。
檢測一下配置文件有沒有錯誤:
[root@localhost named]# named-checkconf
沒有消息就是最好的消息。
二、 創建區域數據文件(主要記錄爲A或AAAA記錄),在/var/named目錄下創建區域數據文件;
[root@localhost ~]# cd /var/named [root@localhost named]# ls data dynamic named.ca named.empty named.localhost named.loopback slaves [root@localhost named]# vim star.com.zone $TTL 3600 @ IN SOA ns nsadmin.star.com. ( 2016011001 30M 10M 1D 1H ) IN NS ns ns IN A 172.16.40.10 www IN A 172.16.40.101 @ IN MX 10 mail mail IN A 172.16.40.102 pps IN CNAME www pop3 IN CNAME mail
檢查一下區域數據文件:
[root@localhost named]# named-checkzone star.com star.com.zone zone star.com/IN: loaded serial 2016011001 OK [root@localhost named]#
提示加載了一個區域,而且序列號爲2016011001,只要這個數字增加就會通知全部從服務器來拿數據。
咱們如今只有主服務器。
重讀一下置配:
[root@localhost named]# rndc reload server reload successful [root@localhost named]
這裏也能夠用systemctl reload named來重載配置文件。
不過在數據文件不少的時候用這個可能會卡住的。在最後會介結下rndc的經常使用使用。
172.16.249.218測試:
[root@localhost ~]# dig -t MX star.com @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t MX star.com @172.16.40.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40815 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; QUESTION SECTION: ;star.com. IN MX ;; ANSWER SECTION: star.com. 3600 IN MX 10 mail.star.com. ;; AUTHORITY SECTION: star.com. 3600 IN NS ns.star.com. ;; ADDITIONAL SECTION: mail.star.com. 3600 IN A 172.16.40.102 ns.star.com. 3600 IN A 172.16.40.10 ;; Query time: 12 msec ;; SERVER: 172.16.40.10#53(172.16.40.10) ;; WHEN: Sat Jan 9 17:01:50 2016 ;; MSG SIZE rcvd: 96 [root@localhost ~]# dig -t axfr star.com @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.10 ;; global options: +cmd star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600 star.com. 3600 IN MX 10 mail.star.com. star.com. 3600 IN NS ns.star.com. mail.star.com. 3600 IN A 172.16.40.102 ns.star.com. 3600 IN A 172.16.40.10 pop3.star.com. 3600 IN CNAME mail.star.com. pps.star.com. 3600 IN CNAME www.star.com. www.star.com. 3600 IN A 172.16.40.101 star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600 ;; Query time: 27 msec ;; SERVER: 172.16.40.10#53(172.16.40.10) ;; WHEN: Sat Jan 9 17:05:19 2016 ;; XFR size: 9 records (messages 1, bytes 233)
模擬區域傳送,這裏能夠用來看看star.com區域裏面有哪些條目,看來咱們剛纔寫的所有都生效了。
這裏忽略了一個問題,看一下區域數據文件的權限:
[root@localhost named]# ll total 20 drwxrwx---. 2 named named 22 Jan 10 11:44 data drwxrwx---. 2 named named 58 Jan 10 14:44 dynamic -rw-r-----. 1 root named 2076 Jan 28 2013 named.ca -rw-r-----. 1 root named 152 Dec 15 2009 named.empty -rw-r-----. 1 root named 152 Jun 21 2007 named.localhost -rw-r-----. 1 root named 168 Dec 15 2009 named.loopback drwxrwx---. 2 named named 6 Mar 6 2015 slaves -rw-r--r--. 1 root root 212 Jan 10 14:11 star.com.zone
如今的權限是其它人可讀的。來修改下。
[root@localhost named]# chown :named star.com.zone [root@localhost named]# chmod o= star.com.zone [root@localhost named]# ll star.com.zone -rw-r-----. 1 root named 212 Jan 10 14:11 star.com.zone [root@localhost named]#
配置一個反向解析區域:
咱們先在配置文件中添加區域:
[root@localhost named]# vim /etc/named.rfc1912.zones zone "16.172.in-addr.arpa" IN { type master; file "172.16.zone"; };
上面的區域名稱也能夠寫成40.16.172.in-addr.arpa。
我這裏只是爲了說明在數據文件中的地址的寫法。
[root@localhost named]# named-checkconf
沒有錯誤。
對區域添加對應的區域數據文件:
[root@localhost named]# vim 172.16.zone $TTL 3600 @ IN SOA @ nsadmin.star.com. ( 2016011001 30M 10M 1D 1H ) IN NS ns.star.com. 10.40 IN PTR ns.star.com. 10.101 IN PTR www.star.com. 102.40 IN PTR mai.star.com. 102.40 IN PTR pop3.star.com.
我這裏的第10行的name部分寫錯了,正常應該是101.40。就是反着寫ip地址。作到下邊才發現,我實驗的主機改了下。這裏就不改了。
檢測一下:
[root@localhost named]# named-checkzone 16.172.in-addr.arpa 172.16.zone zone 16.172.in-addr.arpa/IN: loaded serial 2016011001 OK [root@localhost named]# [root@localhost named]# rndc reload server reload successful [root@localhost named]#
172.16.249.128再來看看:
[root@localhost ~]# dig -x 172.16.40.10 @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.10 @172.16.40.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46366 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;10.40.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 10.40.16.172.in-addr.arpa. 3600 IN PTR ns.star.com. ;; AUTHORITY SECTION: 16.172.in-addr.arpa. 3600 IN NS ns.star.com. ;; ADDITIONAL SECTION: ns.star.com. 3600 IN A 172.16.40.10 ;; Query time: 1 msec ;; SERVER: 172.16.40.10#53(172.16.40.10) ;; WHEN: Sat Jan 9 17:47:19 2016 ;; MSG SIZE rcvd: 98 [root@localhost ~]# dig -x 172.16.40.102 @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.102 @172.16.40.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23950 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;102.40.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 102.40.16.172.in-addr.arpa. 3600 IN PTR mai.star.com. 102.40.16.172.in-addr.arpa. 3600 IN PTR pop3.star.com. ;; AUTHORITY SECTION: 16.172.in-addr.arpa. 3600 IN NS ns.star.com. ;; ADDITIONAL SECTION: ns.star.com. 3600 IN A 172.16.40.10
主從配置:
區域傳送:主從複製:
主服務器是時刻敞開的,只有用權限來控制。若是沒有權限控制,任何人均可以來複制。
因此: 從服務設置區域類型爲slave,從服務器作的就是去主服務器複製這個數據。別的無論。
服務器就會給它數據。
而父服務器上設置的從服務器的NS和A記錄只是爲了在區域文件序列號增長之後通知從服務器來獲取數據。
從服務器是用的隨機端口向服務器的53號端口開啓傳送的。從服務器扮演的是客戶端。
輔助DNS服務器從主DNS服務器或其它輔助DNS服務器處請求傳輸數據的過程。
輔助DNS服務器上面不用創建任務數據庫文件,會從主DNS上面同步。
徹底區域傳送: 傳送區域的全部數據, AXFR , 通常剛創建完成DNS的時候。
增量區域傳送: 傳送區域中改變的數據部分, IXFR.
主的bind版本可能低於從的,從的不能低於主的。由於從的要兼容於主的。主的版本高會有新的功能,而從的沒有。從的去同步數據,可能就會出現問題。對於系統的版本沒有太大的要求,是軟件層面的同步。
從服務器設置:
172.16.40.11
安裝:
[root@localhost ~]# yum install bind -y
主配置文件:
options { listen-on port 53 { 172.16.40.11; }; 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 { localhost; };
配置文件中添加區域:
[root@localhost ~]# vim /etc/named.rfc1912.zones zone "star.com" IN { type slave; file "slaves/star.com.zone"; masters { 172.16.40.10; }; };
說明:
這裏的類型爲 slave。 文件放在slaves目錄下是由於這個目錄的的權限是named用戶可寫的,bind的工做用戶。masters 能夠在大括號中寫多個,以分號分隔。
[root@localhost named]# ll total 16 drwxrwx---. 2 named named 6 Mar 6 2015 data drwxrwx---. 2 named named 6 Mar 6 2015 dynamic -rw-r-----. 1 root named 2076 Jan 28 2013 named.ca -rw-r-----. 1 root named 152 Dec 15 2009 named.empty -rw-r-----. 1 root named 152 Jun 21 2007 named.localhost -rw-r-----. 1 root named 168 Dec 15 2009 named.loopback drwxrwx---. 2 named named 6 Mar 6 2015 slaves
看最下面的一行,目錄的屬主組都是named。
從服務器不須要建立數據文件,它會去主服務器複製數據文件,而後再自動建立對應的數據文件。
咱們要作的就是爲它指定要在哪裏建立這個文件。 它的工做用戶是named,必須對目錄有寫入的權限才能建立文件。
啓動從服務器
[root@localhost named]# systemctl start named
172.16.40.10:主服務器
[root@localhost named]# tail -30 /var/log/messages ..... Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR started Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR ended
能夠看到172.16.40.11以隨機端口42701來請求star.com區域的數據。
172.16.40.11: 從服務器
[root@localhost named]# tail -20 /var/log/messages Jan 10 16:10:15 localhost named[3257]: zone star.com/IN: transferred serial 2016011001 Jan 10 16:10:15 localhost named[3257]: transfer of 'star.com/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 9 records, 233 bytes, 0.021 secs (11095 bytes/sec) ..... #從172.16.40.10:53傳送過來9條記錄,還有數據大小。 [root@localhost named]# ll slaves total 4 -rw-r--r--. 1 named named 423 Jan 10 16:10 star.com.zone [root@localhost named]#
數據文件確實有了,在centos7上面的這個bind版本 這個文件是以二進制格式存放的。咱們只能用dig命令來看看有沒有數據了。
[root@localhost ~]# dig -t axfr star.com @172.16.40.11 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.11 ;; global options: +cmd star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600 star.com. 3600 IN NS ns.star.com. star.com. 3600 IN MX 10 mail.star.com. mail.star.com. 3600 IN A 172.16.40.102 ns.star.com. 3600 IN A 172.16.40.10 pop3.star.com. 3600 IN CNAME mail.star.com. pps.star.com. 3600 IN CNAME www.star.com. www.star.com. 3600 IN A 172.16.40.101 star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600 ;; Query time: 4 msec ;; SERVER: 172.16.40.11#53(172.16.40.11) ;; WHEN: Sat Jan 9 18:38:47 2016 ;; XFR size: 9 records (messages 1, bytes 233)
別的測試就不貼了,太佔篇幅了。
這個dig -t axfr就是用來測試區域傳送的,也就是複製數據。由於如今尚未安全控制,因此在哪也可使用,到後面加上安全控制之後,能夠用這個命令來測試某主機有沒有複製的權限。
我這再把反向的也加上:
這裏我把上面添加的也貼出來了。剛添加的是下面那個。
zone "star.com" IN { type slave; file "slaves/star.com.zone"; masters { 172.16.40.10; }; }; zone "16.172.in-addr.arpa" IN { type slave; file "slaves/172.16.zone"; masters { 172.16.40.10; }; };
看下日誌:
[root@localhost named]# tail -20 /var/log/messages ..... Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: Transfer started. Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: connected using 172.16.40.11#51642 Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: transferred serial 2016011001 Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 7 records, 225 bytes, 0.006 secs (37500 bytes/sec) Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: sending notifies (serial 2016011001)
[root@localhost ~]# dig -t axfr 16.172.in-addr.arpa @172.16.40.11 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr 16.172.in-addr.arpa @172.16.40.11 ;; global options: +cmd 16.172.in-addr.arpa. 3600 IN SOA 16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600 16.172.in-addr.arpa. 3600 IN NS ns.star.com. 10.40.16.172.in-addr.arpa. 3600 IN PTR ns.star.com. 101.40.16.172.in-addr.arpa. 3600 IN PTR www.star.com. 102.40.16.172.in-addr.arpa. 3600 IN PTR mai.star.com. 102.40.16.172.in-addr.arpa. 3600 IN PTR pop3.star.com. 16.172.in-addr.arpa. 3600 IN SOA 16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600 ;; Query time: 4 msec ;; SERVER: 172.16.40.11#53(172.16.40.11) ;; WHEN: Sat Jan 9 19:08:02 2016 ;; XFR size: 7 records (messages 1, bytes 225)
好了,還有一個問題。如今這種狀況下,從服務器只有到時間之後纔會去主服務器獲取數據。
若是想要讓主服務器通知從服務器,就要在主服務器的區域數據文件中加上從服務器的NS記錄。
忽然想到一點,在這裏加上,若是咱們這是公網的域名,而且想要在公網上使用。就要把主從兩臺服務器都在com服務器上受權才能使用。否則com服務器不知道有這我的,請求也就到不了這裏。
172.16.40.10: 加從服務器NS記錄。注意修改序列號。
star.com區域。兩條記錄: 一、從服務器ns記錄,二、對應的A記錄。
ftp記錄是我剛纔測試的時候加上的。這裏不用關注它。
16.172.in-addr.arpa加一條記錄,從服務器的NS記錄。
rndc reload 一下。主服務器會把此次修改通知給從服務器。 這就能夠了。
子域配置:
注意:子區域服務器要在運行狀態,才能夠檢測經過區域數據文件。 namd-checkzone
提示沒有A記錄。由於測試結果是由子域來返回的。
父域的區域數據文件中添加:有多個子域就要分別在文件中寫上這些設置。
1, 受權的子區域名稱
2, 子區域的名稱服務器
3, 子區域的名稱服務器IP地址。
在相對應的區域數據文件中加上子區域的記錄 如我這裏要在star.com域中加上sst的子域:
1, 子區域名稱 sst
2, 子區域的名稱服務器 ns.sst.star.com.
3, 子區域的名稱服務器 IP 地址, 加上A記錄。
看一下我這裏的star.com.zone的內容。爲了容易理解,NS記錄部分用的是絕對名稱。
$TTL 3600 @ IN SOA ns nsadmin.star.com. ( 2016011006 30M 10M 1D 1H ) star.com. IN NS ns.star.com. star.com. IN NS ns1.star.com. sst.star.com. IN NS ns.sst.star.com. ns.sst.star.com. IN A 172.16.40.12 .....#下面的沒有變化
主服務器這邊能夠了,子服務器是徹底獨立的一臺服務器,能夠說它不知道有父服務器的存在。
看咱們最上面的圖就能夠知道,是從上到下的,下邊的不會向上走,只會找到根向下走。
而父服務器作的上面的兩項只是標出子域,再來這種請求會去找子服務器。 而在父服務器不支持遞歸的狀況下,會返回給客戶端子域的地址。
序更號忘了改了,改一下,把配置通知給從服務器。
172.16.40.12:子服務器
主配置:
options { listen-on port 53 { 172.16.40.12; }; 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 { localhost; };
添加區域:
zone "sst.star.com" IN { type master; file "sst.star.com"; };
區域數據文件:
[root@localhost named]# vim sst.star.com $TTL 3600 @ IN SOA ns.sst.star.com. nsadmin.sst.star.com. ( 2016011001 30M 10M 1D 1H ) IN NS ns.sst.star.com. ns IN A 172.16.40.12 www IN A 172.16.40.121 @ IN MX 10 mail mail IN A 172.16.40.120 pop IN CNAME mail ftp IN A 172.16.40.12
注意這裏的區域名稱是: sst.star.com. 相對名稱會在名稱以後自動加上這個。
檢測一下:
[root@localhost named]# named-checkconf [root@localhost named]# named-checkzone sst.star.com sst.star.com zone sst.star.com/IN: loaded serial 2016011001 OK [root@localhost named]#
172.16.249.218:
成功了,發往父服務器來查找子域的查詢,父服務器遞歸去找子服務器。而後返回給咱們結果。
而若是,把父服務器的遞歸功能給關閉。再看一下會返回什麼結果。
172.16.40.10主配置文件:
recursion no;
把這一項給改爲no。rndc reload 。我這裏在172.16.249.218上再看看。
如今這種狀態就跟外網的根和頂級域在返回給本地DNS服務器的答案同樣,只返回下級域的地址。
再來看下從服務器會不會找到子域:
沒問題,從服務器的主配置文件中,遞歸是打開的。
轉發器:
如今咱們能夠從父服務器找到子服務器了,可是從子服務器是找不到父服務器的。
默認狀況下,在DNS上面沒有的區域是會直接找根的。
服務器都是由咱們所控制,也不必再讓子服務器去找根,再找com,再找到star.com了。
找到外網去了,這種域名確定有人註冊啊。因此咱們要讓子服務器找父服務器去。
還有一種狀況,咱們只有二臺DNS服務器能夠上網,能夠解析外網的域名。可是如今又加了幾臺DNS,由於各類緣由這幾臺DNS不能上網,那麼如何才能解析外網的域名呢。可讓那二臺能夠解析外網域名的服務器爲咱們解析。
定義轉發:
注意:被轉發的服務器必須容許爲當前服務作遞歸;
(1) 區域轉發:僅轉發對某特定區域的解析請求;
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; };
};
(2) 全局轉發:沒有在本地定義的區域,統統轉發;
options {
... ...
forward only|first;
forwarders { SERVER_IP; };
.. ...
};
only 是隻轉發給目標主機,目標主機不能解析也不會再轉發給根。
first 轉發給目標主機,若是目標主機不能解析就再轉發給根。
所轉發的服務器, 要充許遞歸才行。 這樣服務器才能爲你遞歸找到結果並返回。
172.16.40.12: 子服務器。在/etc/named.rfc1912.zones文件中添加一個轉發區域。
zone "star.com" IN { type forward; forward only; forwarders { 172.16.40.10;172.16.40.11; }; };
rndc reload 就能夠了。如今直接再查詢可能會出現兩種地址,一個是轉到父服務器獲得的地址,還有是剛纔查詢結果的緩存。能夠在40.12服務器上執行 rndc flush。 來清空緩存。
172.16.:249.218:
這種區域轉發,只能轉發單獨的區域。 全局的域能夠轉發本地不存在的全部區域,來解決咱們上面的第2種狀況。
加這兩項就能夠了。
全局性的總配置優先級低於各個區域,因此總轉發只會轉發不存在的區域。
安全控制:
acl:訪問控制列表;把一個或多個地址歸併一個命名的集合,隨後經過此名稱便可對此集合內的全部主機實現統一調用;
ACL必需要定義後才能使用, 一般放在named.conf文件中最上方(不要在options內)。值若是有空格要用括號引發來。
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所屬的網絡;
訪問控制指令,有些能夠在zone中單獨使用。
allow-query {}; 容許查詢的主機;白名單;不指定則默認容許全部。
allow-transfer {}; 容許向哪些主機作區域傳送;默認爲向全部主機;應該配置僅容許從服務器;
allow-recursion {}; 容許哪此主機向當前DNS服務器發起遞歸查詢請求;
定義遞歸白名單。測試只能在options中使用。要把recursion yes; 註釋掉。
allow-update {}; DDNS,容許動態更新區域數據庫文件中內容;容許動態更新區域數據庫文件中內容。爲了安全,最好是none。這個跟區域傳送沒有關係。
recursion yes; 給任何人遞歸。即然這裏明確指定爲yes。那麼默認應該是會不給遞歸纔對,並且上課也說是默認不給遞歸。但剛纔測試的倒是給遞歸,不知道嘍。
172.16.40.10:主服務器
定義幾個控制項:
上面定義的只有172.16.40.11也就是從服務器能夠區域傳送。
在172.16.249.218上面:
[root@localhost mnt]# dig -t axfr star.com @172.16.40.10 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.5 <<>> -t axfr star.com @172.16.40.10 ;; global options: +cmd ; Transfer failed. [root@localhost mnt]#
直接失敗了。遞歸經測經也是生效的。用法也就這種方式。如今這裏只是修改的主服務器,從服務器也要修改。
最後再補充一點:
泛域名解析
* IN A 172.16.0.1
*星號表明若是沒有所要查詢的記錄,就以這個結果爲準。不用放到最後。不過感受仍是放到最後爲好。
域是一個邏輯的概念。而區域是域的兩種解析方式(正向解析區域,反向解析區域),就是咱們上面所說的兩種不一樣的樹。咱們平常所說的域名只是正向解析區域的,根固然也是了。
最高級的域(最外面的方框)包含這兩種區域(裏面的兩個長方形),而子域(裏面的實體長方形)又也這兩個區域的裏面,而後子域又有兩個區域(黑色長方形),依此類推。
區域能夠說是物理存在的,在咱們這裏它是文件,提供了各類解析記錄。
這裏挺亂的,並且我我的理解可能也是錯的,因此暫時也不要管它了。只要知道咱們是由物理存在的區域數據文件來提供解析的。
rndc 子命令
status | 統計數據 |
reload | 重讀配置文件和區域文件 |
reload ZONE | 指定重讀的區域 |
retransfer ZONE | 手動區域徹底傳送,不用管區域數據文件序列號是多少 |
notify ZONE | 手動向外發送區域的同步通知 |
reconfig | 重讀配置文件並加載新增的區域。在有很是多的區域數據文件的時候很是有用。普通的重讀配置文件,會從新加載全部區域,區域多了之後會卡死的。 |
stats | 把服務器的統計數據寫入statisics 文件中。 |
querylog | 關閉或開啓查詢日誌,每條查詢都會記錄日誌,會產生大量I/O,正常狀況下不要開啓,調試的時候再開啓。 |
stop | 關閉named進程。 |
flush | 清空服務器端的緩存。有時候頗有用。 |
flushname NAME | 只清除指定的緩存。 |
trace [LEVEL] | 開啓調試模式,能夠指定級別。屢次開啓就是增長級別。詳細記錄日誌信息。一樣的會產生大量I/O操做。 |
debug | 是有級別的, 調試級別。 |
notrace | 等同於 trace 0 |
謝謝瀏覽。歡迎朋友們提出建議。