你有沒有一個這樣的問題困擾的你呢?若是咱們記憶IP地址你能記住多少個?5個?10個?20個?我想你只能記住經常使用的IP對吧?可是咱們想訪問咱們想要的某個站點的頁面,你能會使用IP地址訪問麼?顯然不會,就像咱們平常使用的百度這樣的網站,你會輸入它的IP去訪問麼?確定不會,我想大部分人不知道百度的IP地址是多少的?咱們都是經過www.baidu.com這樣的方式去訪問,可是你知道,網絡中並不能直接使用字母進行解析的,那如何實現這樣的功能呢?DNS就是幫助咱們進行地址轉換,是的咱們獲取到IP地址去上網的。這樣大大減輕了咱們的記憶內存。html
DNS(Domain Name System,域名系統)是互聯網的一項服務。它將域名和IP地址相互映射的一個分佈式數據庫,可以令人方便地訪問互聯網。git
(1)53/TCP 53/UDPweb
(2)不一樣協議的端口做用是什麼呢?數據庫
53/UDP:提供客戶端查詢功能 53/TCP和53/UDP:實現dns主從複製功能
開頭咱們述說DNS是分佈式數據庫,想必你們猜到了DNS是層級結構的。 vim
從圖中能夠看出DNS的層級結構數組
(1)根域(Top Level Domain,tld)緩存
(2)頂級域安全
(a)組織域, com,org,gov,mil等 (b)國家域,cn,ca,hk,tw等 (c)反向域,arpa
(3)二級域 ...bash
(1)主DNS服務器服務器
做用:管理和維護負責解析的域內解析庫的服務器
。 (2)從DNS服務器
做用:從主服務器或從服務器「複製」(區域間傳輸)解析庫副本。 這裏咱們須要注意一下,區域傳輸分爲兩種 (a)徹底傳輸(axfr):傳送整個解析庫; (b)增量傳輸(ixfr):傳遞解析庫變化的內容;
是否是你們想,主從DNS服務器時如何工做的呢?
有兩種工做機制「PUSH」和「PULL」。當主DNS服務器配置文件中序列號發生遞增,從新DNS服務;主DNS服務器會主動向從DNS服務器同步信息;這個過程稱爲'PUSH'。若是區域傳輸終端,沒有同步成功,從服務器會根據配置文件中的」retry「指定的時間從新嘗試同步信息,這個過程稱爲「PULL」。
DNS解析分爲兩種
(a)正向解析:FQDN-->IP (b)反向解析: IP-->FQDN
注意:正向解析是兩個不一樣的名稱空間,是兩個不一樣的解析樹,若是爲子域則寫DNS服務IP。
DNS查詢類型:
(a)遞歸查詢 (b)迭代查詢
一次完整的DNS查詢請求的過程:Client-->host文件-->DNS server Local Cache -->DNS server(recursion)-->Server Cache-->Iteration(迭代)-->Root-->TLD-->二級域名-->...
區域解析庫由衆多的RR(resource record)組成。存在不一樣的類型:A,AAAA,SOA,CNAME,MX,PTR,NS。
資源記錄的格式:
NAME [TTL] IN RR_TYPE VALUE
下面有幾點須要注意的:
(a)$TTL變量,全局繼承此處的緩存週期,默認單位爲秒。
(b)@代替/etc/named.rfc1912.zones
配置的ZONE_NAME.
(c)同一個名字能夠經過多條記錄定義多個不一樣的值,此時DNS服務器會以輪詢方式進行相應。
(d)同一個值可能有多個不一樣定義的名字;經過多個不一樣的名字指向同一個值進行定義。此僅表示經過多個不一樣的名字能夠找到同一個主機。
value的構成:
(a)當前區域的主DNS服務器的 FQDN,也可使用/etc/named.rfc1912.zones
配置的ZONE_NAME。
(b)當前區域管理員的郵箱地址,但地址中不能使用」@「,通常使用「.」替代。由於在配置文件中「@」表示特殊含義 。
(c)主從服務區域傳輸相關定義以及否認的答案的同一TTL。
@ IN SOA @ rname.invalid. ( 0 ; serial #解析庫序列號,主服務器解析庫變化時,遞增,最長只能爲十位數組成,通常爲了方便管理這樣管理「當前日期+版本號」 1D ; refresh #刷新時間,從服務器從主服務器請求同步解析庫的時間 1H ; retry #重試時間,從服務器從主DNS服務器請求失敗時,再次嘗試的時間 1W ; expire #過時時長,從服務器聯繫不到主服務器時,多久後中止服務 3H ) ; minimum #錯誤解析存活時長
注意:一個區域解析庫只能有且僅有一個SOA記錄,必須位於解析庫的第一條記錄。
value:當前區域的某DNS服務器名稱
注意:
(a)相鄰的兩個資源記錄的NAME相同時,後續可省略。
(b)任何一個NS記錄後面的服務器名字,都應該在後續有一個A記錄。
value:當前區域的某郵件服務器的主機名
注意:
(1)在一個區域內能夠有多個MX記錄,可是每一個MX記錄前應該有一個數字(0-99),表示服務器的優先級,數字越小優先級越高。
(2)任何一個MX記錄後應該有一個A記錄。
value:主機名對應的IP地址
對於A記錄有如下幾種定義格式:
(a)可使用FQDN
(b)可使用泛域名 *.ZONE_NAME,這種方式的好處是避免用戶寫錯名稱時給錯誤答案,將錯誤答案指向某特性的地址。
(c)若是一個網段中地址不肯定能夠是使用 $GGENERATE #-# NAME$ 後面對應的地址也是,網段加$
示例:$GENERATE 100-150 host$ IN A 192.168.4.$
格式:IP PTR FQDN 完整格式:135.4.168.192-in.adder.arpa IN PTR dns1 若是192.168.4爲網絡地址,能夠這樣寫 135 IN PTR DNS1
注意:主機地址要反着寫。
有時候咱們訪問一個網站是www主機不必定是真正的主機。有可能使用了這種別名機制
示例: www IN CNAME websrv
咱們在訪問一個網址時,有可能爲以下地址www.test.server.com
對整個地址來講真正的,test爲server的子域。server爲com的子域。n那麼父域如何對子域進行受權呢?
子域受權:每一個域的名稱服務器,都是經過父域服務器在解析庫進行受權。
如圖所述:想必你們多DNS的名稱,過程有了必定的瞭解,下面經過看上面這張圖,能夠看出子域與父域的管理。經過觀察圖中,一個zone可有多個RR組成。能夠粗略的看出DNS的容錯功能,實現負載的做用。父域經過委派子域進行管理。
如圖所示:DNS是工做在內核中的,用戶是沒有辦法直接管理DNS服務,那要如何管理DNS服務呢?前人想出了Bind進行管理DNS服務。這樣用戶經過用戶空間藉助於Bind管理工具或配置文件就能夠管理DNS服務了。
bind-libs.x86_64 #庫包 bind-libs-lite.x86_64 # bind-license.noarch #認證包 bind-utils.x86_64 #提供對dns服務器的測試工具程序 bind-chroot #爲bind提供一個假裝的根目錄以加強安全性
服務腳本/etc/rc.d/init.d/named
和/usr/lib/systemcd/system/named.service
主配置文件/etc/named.conf
/etc/named/rfc1912.zones
存放根服務器地址 /var/named/name.ca
解析庫文件 /var/named/ZONE_NAME_ZONE
注意:
(1)一臺物理服務器可同時爲多個區域提供解析。
(2)必需要有根文件:name.ca。
(3)應該有兩個實現localhost和本地迴環的解析庫。
主配置文件/etc/namd.conf
// named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. #這個文件是一個參考例子 // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html options { #全局設置 listen-on port 53 { 127.0.0.1; }; #IPv4監聽的端口和IP地址 listen-on-v6 port 53 { ::1; }; #IPv6監聽的端口 directory "/var/named"; #zone配置文件存放目錄 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; }; #容許詢問 /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; #是否遞歸查詢 dnssec-enable yes; #是否支持DNSSEC開關 dnssec-validation yes; #是否進行DNSSEC確認開關 /* Path to ISC DLV key */ 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; #zone類型 file "named.ca"; #文件名稱 }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
建議通常不要在這個文件中配置zone,能夠在/etc/named.rfc1912.zones
文件下進行配置。
/var/named/named.localhost
文件
$TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
通常這個文件做爲一個模板文件進行zone的配置。
(1)全局轉發:對非本機所負責區域的請求,全轉發給指定的服務器。
options{ forward first|only; forwarders { IP; }; };
(2)特定區域轉發:僅轉發對特定區域的請求,比全局轉發優先級高。
zone "ZONE_NAME" IN { tyep forward; forward first|only; forwarders { IP; } };
(1)應該爲一臺獨立的名稱服務器
(2)主服務器區域解析文件中必須有一條NS記錄指向從DNS服務器
(3)從服務器只須要定義區域,而無須提供解析庫;解析庫文件應該放置於/var/named/slaves
目錄下。
(4)主服務器得容許從服務器區域傳送
(5)主從服務器的時間應該保持一致
(6)Bind程序版本應該保持一致;若是不一致,建議主服務器低,從服務器高。
(7)修改網卡配置文件/etc/sysconfig/network-scripts-ifcfg-INTERFACE
,添加DNS記錄。
若是想啓用此功能,能夠在/etc/named.rfc1912.zones
文件中定義之。
做用:只能用於測試DNS系統,不會查詢hosts文件進行解析。
格式:
dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type] [-x addr] [-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt...]
simple usage: dig @server name type
選項:
-b:綁定源IP -4:僅使用IPv4 -t:指定RR類型,默認爲A記錄,atfr(反向解析) -x:反向解析 +[no]trace:跟蹤解析過程 +[no]recure:遞歸解析
格式:
host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]
選項:
-t:指定RR類型
格式:nslookup [-option] [name | -] [server]
nslookup> server IP: 指明使用哪一個DNS server進行查詢 set q=RR_TYPE: 指明查詢的資源記錄類型 NAME: 要查詢的名稱
格式: rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}
reload:重載主配置文件和區域解析庫文件 retranfer:手動啓動區域傳送,而無論序列號是否增減; notify:從新對區域傳送發通知; reconfig:重載主配置文件 querylog:開啓或關閉查詢日誌文件`/var/log/message` trace:遞增debug一個級別 trace LEVEL:指定使用的級別 notrace:將調試級別設置爲0 flush:清空DNS服務器的全部緩存記錄
(a)[root@localhost ~]# yum install -y bind
#安裝包 (b)[root@localhost ~]# vim /etc/named.conf
#修改主配置文件
方式一:
方式二:
(c)[root@localhost ~]# vim /etc/ named.rfc1912.zones
#修改zone文件
zone "test.com" IN { type master; file "test.com.zone" #此地方能夠寫絕對路徑和相對路徑,若是寫相對路徑,默認爲`/var/named/test.com.zone`,所以在`/var/named`目錄下文件名必定要與這裏的文件名一致。 };
(d)[root@localhost ~]# named-checkconf
#使用命令對配置文件檢查
/etc/named.rfc1912.zones:27: missing ';' before '}' #此時檢查爲27行處沒有加";"修改完再檢查便可。
注意:修改rfc1912.zones文件時,要以「;」結尾;參數與選項之間必須有空格隔開。
(e)修改zone文件[root@localhost named]# cp named.localhost test.com.zone
可是這裏有一個問題,bind程序是以who的身份運行呢?下面經過命令查詢看下: [root@localhost named]# ps aux |grep named
named 4002 0.2 1.2 161124 13028 ? Ssl 09:55 0:00 /usr/sbin/named -u named
經過命令查看咱們看到是以name身份運行的,可是咱們在複製文件時,文件名時root,以下圖;因此在複製過來之後記得修改文件的權限。
方法一:修改文件的所屬組
[root@localhost named]# chgrp named test.com.zone
方法二:複製模板文件時,直接加「-p」
[root@localhost named]# cp -p named.localhost test.com.zone
[root@localhost named]# vim test.com.zone
#修改ZONE文件
$TTL 1D @ IN SOA dns1 mail.test.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 dns1 A 192.168.4.132
(f)加載zone文件
[root@localhost named]# rndc reload
(g)查看是否能夠解析
[root@localhost named]# dig-t ns test.com @192.168.4.132
#在本機測試
在另一臺機器上測試
修改這臺機器上的DNS
測試
[root@localhost/etc/sysconfig/network-scripts]#dig -t ns test.com @192.168.4.132
在主機IP地址爲192.168.4.144搭建從服務器
(a)安裝bind包
(b)編輯/etc/named.conf
(c)編輯配置zone文件/etc/named.rfc1912zones
zone "test.com" IN { type slave; #修改類型 masters { 192.168.4.132; }; #主DNS服務器的地址 file "slaves/test.com.slave.zone"; #從DNS服務文件存放的位置 };
(d)啓動bind服務,使其生效
[root@localhost~]#systemctl restart named
[root@localhost~]#ls /var/named/slaves/test.com.slave.zone
(e)測試
[root@localhost~]#dig www.test.com @192.168.4.144
假如一個公司有三臺DNS服務器,A,B,C而且這三臺主機不在同一個位置;A機器能夠直接鏈接互聯網,而B,C不能夠直接鏈接互聯網。用戶使用電腦想訪問www.qq.com,只能經過專線先到C再到A,而後才能訪問www.qq.com,經過C轉發到A。
方式一:全局轉發
(1)分別在CentOS 6和CentOS 7 主機上設置,CentOS 7爲轉發
(A)在CentOS 6主機上配置
[root@localhost ~]# vim /etc/named.conf
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN { type master; file "test.com.zone"; };
重啓服務
[root@localhost ~]# service named restart
(B)在CentOS 7主機上配置
[root@localhost~]#vim /etc/named.conf
切記,作這個實驗室必定要關閉dnssec功能;dnssec-enable no; dnssec-validation no。
重啓服務
[root@localhost~]#systemctl restart named
(C)修改客戶端機器的dns
[root@localhost~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
(D)在客戶端機器上測試
[root@localhost~]#dig www.test.com @192.168.4.148
在這裏給你們提個醒:本身搞這個明明很簡單的搞了一個多小時都沒有成功,緣由在於沒有關閉dnssce功能。
方式二:特定區域轉發
在CentOS 主機上配置
[root@localhost~]#vim /etc/named.rfc1912.zones
zone "test.com" IN { type forward; forward first; forwarders {192.168.4.132;}; };
[root@localhost~]#systemctl restart named
#重啓服務
在客戶端主機上測試
在前面實驗的基礎上,執行以下操做:
(A)在CentOS 7主機上
[root@localhost~]#vim /etc/named.rfc1912.zones
建立zone
zone "do.test.com" IN { type master; file "do.test.com.zone"; };
[root@localhost/var/named]#vim do.test.com.zone
#配置解析庫
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 dns1 A 192.168.4.148 webserver A 192.168.4.148 www CNAME webserver
(B)[root@localhost named]# vim test.com.zone
#在CentOS 6主機上修改解析庫
[root@localhost named]# service named restart
#重啓服務
(C)重啓服務測試
案例前提:準備4臺虛擬機
(A)CentOS6主機做爲主DNS服務器,同上面的配置相似,這裏就再也不闡述。
(B)在CentOS 7兩臺主機上作從DNS服務器,進行以下配置:
[root@localhost ~]# vim /etc/named.conf
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "test.com" IN { type slave; masters {192.168.4.132;}; file "slaves/test.com.slave.zone"; };
啓動bind的服務便可以同步到/var/named/slaves
目錄下
[root@localhost~]#systemctl restart named
[root@localhost~]#ll /var/named/slaves/test.com.slave1.zone
-rw-r--r--. 1 named named 382 Sep 20 19:08 /var/named/slaves/test.com.slave1.zone
若是主從服務器想指定從DNS服務器,能夠在/etc/named.conf
配置文件中添加選項 allow-transfer {IP;};
在從服務器上添加「allow-transfer {none;};」在主DNS服務器上「allow-transfer {IP;};」這樣就限制了。
注意:經過以上幾個實驗總結出須要注意的一些地方
一、在作實驗過程當中必定要關閉dnssec功能;
二、複製文件/var/named/named.localhost
作模板時,必定要加選項「-a」或「-p」選項。複製完成後必定看全部者、所屬組和權限。
如何實現上述的拓撲圖呢?先從底部網上一步一步的搭建
(1)實現主從DNS服務器
(a)修改主DNS服務器
[root@localhost~]#vim /etc/named.conf
#修改主配置文件
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "test.com" IN { type master; file "test.com.zone"; };
[root@localhost ~]# vim /var/named/test.com.zone
#建立解析庫文件
$TTL 1D @ IN SOA dns1 test.com. ( 2 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS dns1 dns1 A 192.168.4.132 webserver IN A 192.168.4.132 www IN CNAME webserver
[root@localhost~]#vim /var/named/named.ca
#修改根服務器文件
[root@localhost ~]# service named restart
#重啓bind服務
(b)配置從DNS服務器
主配置文件和配置從服務器同樣,這裏就再也不闡述[root@localhost~]#vim /etc/named.rfc1912.zones
zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; };
[root@localhost~]#systemctl restart named
#重啓服務[root@localhost~]#ll /var/named/slaves/test.com.slave.zone
#查看是否成功
(2)配置子域
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "com" { type master; file "com.zone"; };
[root@localhost~]#vim /var/named/com.zone
#建立解析庫
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 test NS dns2 dns1 A 192.168.4.147 dns2 A 192.168.4.132 www A 192.168.4.66
[root@localhost~]#systemctl restart named
#重啓bind服務
(3)根
[root@localhost~]#vim /etc/named.rfc1912.zones
zone "." IN { type master; file "root.zone"; };
刪除配置文件中/etc/named.conf
以下內容
[root@localhost/var/named]#vim root.zone
#建立解析庫
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 com NS dns2 dns1 A 192.168.4.146 dns2 A 192.168.4.147
[root@localhost/var/named]#systemctl restart named
重啓服務
這樣咱們搭建完成了。是不是頗有成就感呢?哈哈。當你們看到這裏的時候是否是發現咱們沒有對從DNS服務器作設置呢?若是主DNS掛了,那麼從DNS能工做麼?下面咱們就來講道說道。
假設主DNS服務器down(IP 192.168.4.132 )
[root@localhost ~]# ifconfig eth0 down
#將主DNS服務器down掉
[root@localhost ~]# rndc flush
#清除主DNS服務器的緩存
在Client客戶機測試 (IP 192.168.4.149)
[root@localhost~]#dig www.test.com @192.168.4.147
如圖所示,沒有解析成功,說明咱們的從DNS服務器沒有起做用,沒有實現負載均衡做用。有沒有想過爲何出現這種狀況呢?由於咱們沒有在com域中沒有添加這條域,下面咱們在com域中添加此從DNS服務器的dns記錄測試
在com域中添加以下記錄
[root@localhost/var/named]#vim com.zone
[root@localhost/var/named]#rndc flush
#清除緩存
在client客戶機上測試
[root@localhost~]#dig www.test.com @192.168.4.148
這樣說明咱們從DNS服務器起到了,達到了容錯功能。是否是有點小小的成就感呢?
你是否是有這樣的想法,只想讓某個IP或者某個IP端的地址進行訪問,實現訪問控制功能。DNS服務給咱們提供了很好的解決方法。
allow-query {}; | 容許查詢的主機,至關於白名單 |
allow-transfer {}; | 容許區域傳送的主機 |
allow-recursion{}; | 容許遞歸的主機,這個選項建議在options中使用 |
allow-update{}; | 容許更新區域數據庫中的內容 |
acl:是把某個IP或IP端合併爲一個集合,經過一個統一的名稱調用;能夠把這個理解爲bash函數的功能。
(1)acl內置的選項
none | 沒有一個主機 |
any | 任意主機 |
localhost | 本機 |
localnet | 本機的IP同掩碼運算後獲得的網絡地址 |
注意:acl只能先定義再使用;建議通常定義再options的前面。
(2)示例
[root@localhost ~]# vim /etc/named.conf
從新啓動服務而後在本機測試[root@localhost ~]# dig www.test.com @127.0.0.1
因爲咱們設置了acl功能,全部本機也不能訪問了。實現咱們的預期效果。
你們小時候去網吧的時候有沒有遇到這樣一個問題,若是你玩問道在電信1玩,而你的網絡是聯通的網絡,這樣開始玩遊戲的過程當中,咱們的屏反應會遲鈍,頻很高;可是網絡提供一個網絡轉換程序,若是你切換到電信網絡,問道遊戲運行流暢;這至關於咱們這裏view的功能。實現只能DNS解析,不過不須要咱們手動切換網絡。
(1)一個bind服務器能夠定義多個view;每一個view能夠定義多個zone。每一個view匹配一組客戶端。
(2)若是多個view對同一個zone進行解析時,使用不一樣的zone解析庫文件。
若是咱們在北京和廣州有兩臺DNS服務器,北京和廣州用戶經過訪問www.test.com的時候,我但願北京訪問直接在北京DNS解析並返回,廣州與它相同,如何實現嗯?
在一臺因爲我電腦有兩個不一樣的IP段,在一臺機器上實現這個功能
(a)修改/etc/named.conf
文件
(b)建立/etc/named.rfc1912.zones.test
和/etc/named.rfc1912.zones.app
分別修改
(3)建立zone文件/var/named/app.com.zone
和/var/named/app.com.zone
分別修改
(4)重啓dns服務 [root@localhost named]# service named restart
在Clinet客戶機上測試(IP 192.168.4.148和172.18.253.86)
噹噹噹,成功!!!