轉自http://sweetpotato.blog.51cto.com/533893/1598225linux
上次博文咱們討論了DNS的基礎,本次博文咱們重點來看看如何配置一臺DNS服務器。web
【本次博文的主要內容】算法
Bind是Berkeley Internet Name Domain Service的簡寫,它是一款實現DNS服務器的開放源碼軟件。Bind本來是美國DARPA資助伯克利大學(Berkeley)開設的一個研究生課題,後來通過多年的變化發展,已經成爲世界上使用最爲普遍的DNS服務器軟件,目前Internet上半數以上的DNS服務器有都是用Bind來架設的。數據庫
【什麼是「服務」及服務的特性】windows
一、什麼是套接字:緩存
套接字socket,簡單來講就是IP:port(IP地址端口對)。以電話系統爲例,電話的通話雙方至關於相互通訊的兩個進程,區號是它的IP地址;區內一個單位的交換機至關於一臺主機,主機分配給每一個用戶的局內號碼至關於socket號。任何用戶在通話以前,首先要使用一部電話,至關於申請一個socket;同時要知道對方的號碼,至關於對方有一個固定的socket。而後向對方撥號呼叫,至關於發出鏈接請求(假如對方不在同一區內,還要撥對方的區號,至關於給出網絡地址)。對方假如在場並空閒(至關於通訊的另外一主機開機且能夠接收鏈接請求),拿起電話話筒,雙方就能夠正式通話,至關於鏈接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,至關於向socket發送數據和從socket接收數據。通話結束後,一方掛起電話至關於關閉socket,撤銷鏈接。安全
端口:服務器
TCP:0~65535網絡
UDP:0~65535負載均衡
小於1024的端口爲知名端口;Linux系統中0~1023的端口只有root用戶有開放關閉的權利(服務都是以root用戶身份啓動,以後以一個系統用戶的身份運行。)
例如:DNS服務監聽在tcp的53號端口(DNS區域傳送)和udp的53號端口,Web服務監聽在TCP的80端口。
二、服務的特性:
運行於後臺,處於監聽(listen)狀態
監聽的原理:
如上圖所示,
(1)當DNS服務端程序安裝並啓動以後,它首先經過socket()系統調用向內核註冊使用一個套接字,並調用bind()系統調用將本地socket地址(包括本地主機地址和本地端口)與所建立的socket號聯繫起來。一旦註冊成功,守護進程named就處於監聽狀態(即named進程處於阻塞狀態,等待客戶端的鏈接)。注意,服務器必須首先啓動,直到它執行完socket()調用進入等待狀態後,方能接受客戶請求,假如客戶機先啓動,則connect()將返回出錯代碼,鏈接不成功。
(2)以後,DNS的請求報文發送到DNS的服務器的網卡上,而網卡是硬件,可以與硬件打交道的只有內核。內核內部的TCP/IP協議棧將請求報文解包查看其IP首部和TCP首部(即檢查請求報文中的套接字是什麼)。
(3)內核查看文件句柄fd(file deiscriptor)數據庫以確認是否有相關的應用程序進程註冊了該套接字。若是有,則將請求報文發送給該進程。
Tips:以上是我對監聽過程的簡單理解,不免有錯誤之處,如發現錯誤還望指正哈!
三、DNS服務器類型:
四、bind詳解:
包名:bind
進程:named
協議:dns
使用端口:53(tcp,udp)
相關包:
bind-chroot:將named進程的活動範圍限定在chroot目錄,保證安全性。
bind-devel:與開發相關的頭文件和庫文件(編譯安裝bind時所需)
bind-libs:bind服務器端和客戶端都使用到的公共庫文件
bind-utils : bind客戶端工具
程序文件:/usr/sbin/named
bind權限相關:
安裝完named會自動建立用戶named系統用戶
Tips:早期Linux服務都是以root權限啓動和運行的,隨着技術的發展,各類服務變得愈來愈複雜,致使BUG和漏洞愈來愈多。黑客利用服務的漏洞入侵系統,能得到root級別的權限,從而控制整個系統。爲了減緩這種攻擊所帶來的負面影響,如今服務器軟件一般設計爲以root權限啓動,而後服務器進程自行放棄root,再以某個低權限的系統帳號(named)來運行進程。這種方式的好處在於該服務被攻擊者利用漏洞入侵時,因爲進程權限很低,攻擊者獲得的訪問權限又是基於這個較低權限。
【配置文件】:
[root@CentOS01 ~]# rpm -qc bind /etc/logrotate.d/named/etc/named.conf #主配置文件 /etc/named.rfc1912.zones #區域配置文件(用include指令包含在主配置文件) /etc/named.root.key #根區域的key文件以實現事務簽名; /etc/rndc.conf #rndc(遠程名稱服務器控制器)配置文件 /etc/rndc.key #rndc加密密鑰 /etc/sysconfig/named /var/named/named.ca #13個根服務器存放文件/var/named/named.empty
/var/named/named.localhost /var/named/named.loopback
重點只須要關心主配置文件:
主配置文件:named.conf,每一個語句都要使用分號結尾;其功能以下:
【bind客戶端工具】
[root@Centos ~]# rpm -ql bind-utils
/usr/bin/dig #最經常使用的DNS服務器測試工具
/usr/bin/host #一款輕量級DNS測試工具
/usr/bin/nslookup #DNS查詢工具,在衆多平臺上都有實現(windows上也有)
/usr/bin/nsupdate #更新工具
/usr/share/man/man1/dig.1.gz
/usr/share/man/man1/host.1.gz
/usr/share/man/man1/nslookup.1.gz
/usr/share/man/man1/nsupdate.1.gz
dig命令:
語法:dig -t 資源記錄類型 名稱 @server-ip
工做機制:
不加"@server-ip":根據/etc/resolv.conf配置的解析文件來查詢
例如:
說明:
(1)加"@server-ip":根據指定的DNS服務器來解析,繞過了本地解析庫中設置的DNS服務器。
(2)注意標誌位:
注:dig命令不會查緩存,而是直接查服務器
例如:
經常使用選項:
dig -x IP @server-ip:查詢反向解析
dig - t 資源記錄類型 名稱 +trace:追蹤解析過程
[root@CentOS01 ~]# dig -t A www.baidu.com +trace ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> -t A www.baidu.com +trace ;; global options: +cmd #首先找根 . 480984 IN NS g.root-servers.net. . 480984 IN NS j.root-servers.net. . 480984 IN NS d.root-servers.net. . 480984 IN NS k.root-servers.net. . 480984 IN NS c.root-servers.net. . 480984 IN NS h.root-servers.net. . 480984 IN NS b.root-servers.net. . 480984 IN NS l.root-servers.net. . 480984 IN NS e.root-servers.net. . 480984 IN NS m.root-servers.net. . 480984 IN NS a.root-servers.net. . 480984 IN NS i.root-servers.net. . 480984 IN NS f.root-servers.net. ;; Received 496 bytes from 218.2.135.1#53(218.2.135.1) in 1654 ms #而後找.com com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 491 bytes from 128.63.2.53#53(128.63.2.53) in 921 ms #而後找baidu.com. baidu.com. 172800 IN NS dns.baidu.com. baidu.com. 172800 IN NS ns2.baidu.com. baidu.com. 172800 IN NS ns3.baidu.com. baidu.com. 172800 IN NS ns4.baidu.com. baidu.com. 172800 IN NS ns7.baidu.com. ;; Received 201 bytes from 192.55.83.30#53(192.55.83.30) in 402 ms #最後找到最終結果 www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. ;; Received 228 bytes from 61.135.165.235#53(61.135.165.235) in 81 ms
dig -t axfr zone :驗證徹底區域傳送
host命令:
語法:host -t 資源記錄類型 名稱
例如:
2、DNS(bind)服務器的配置:
通過上面關於bind服務的介紹後,下面咱們就來具體配置bind服務哈。咱們的配置分四個:
【實驗環境規劃】
VMware station 10
BIND服務器:兩臺CentOS 6.4虛擬機作主輔DNS
一臺windows server2008 R2 作輔助DNS
一臺windows 7作客戶端
Domain Name:test.com. 192.168.1.0/24
主DNS:LinuxMaster.test.com. 192.168.1.58
輔助DNS:LinuxSlave.test.com. 192.168.1.59
Win2008Slave.test.com. 192.168.80.3 (在windows 2008 R2上實現 )
web主機:www.test.com. 192.168.1.58 192.168.1.59 192.168.80.3
ftp主機:ftp.test.com. CNAME www.test.com.
mx郵件服務器:mx.test.com. 192.168.1.58
一、配置正向解析
【將一臺主機配置成可正向解析的DNS之步驟】
第一步:使用YUM安裝DNS所使用的軟件包(BIND)
第二步:建立或修改主配置文件(/etc/named.conf)
第三步:建立區域數據文件(/var/named/***.zone)
第四步:使用相關命令(named-checkconf、named-checkzone)測試配置文件及區域文件是否存在語法錯誤
第五步:確保主配置文件和各區域解析庫文件的權限爲640,屬主爲root,屬組爲named;
第六步:重啓服務或從新加載配置文件
第七步:更改iptables和selinux的設置(若是不瞭解此兩項能夠暫時關閉它們)
第八步:分別使用(dig/nslookup)在Linux/Windows主機進行查詢DNS相關資源記錄
具體配置過程以下:
第一步:經過yum安裝bind:
[root@Centos ~]# yum install -y bind
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package bind.x86_64 32:9.8.2-0.17.rc1.el6 will be installed
--> Processing Dependency: portreserve for package: 32:bind-9.8.2-0.17.rc1.el6.x86_64
--> Running transaction check
---> Package portreserve.x86_64 0:0.0.4-9.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Installing:
bind x86_64 32:9.8.2-0.17.rc1.el6 cdrom 4.0 M
Installing for dependencies:
portreserve x86_64 0.0.4-9.el6 cdrom 23 k
Transaction Summary
==========================================================================================
Install 2 Package(s)
Total download size: 4.0 M
Installed size: 7.3 M
Downloading Packages:
------------------------------------------------------------------------------------------
Total 34 MB/s | 4.0 MB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : portreserve-0.0.4-9.el6.x86_64 1/2
Installing : 32:bind-9.8.2-0.17.rc1.el6.x86_64 2/2
Verifying : 32:bind-9.8.2-0.17.rc1.el6.x86_64 1/2
Verifying : portreserve-0.0.4-9.el6.x86_64 2/2
Installed:
bind.x86_64 32:9.8.2-0.17.rc1.el6
Dependency Installed:
portreserve.x86_64 0:0.0.4-9.el6
Complete!
第二步:本身建立或修改主配置文件(/etc/named.conf)
首先咱們來看看主配置文件的內容哈:
[root@CentOS02 ~]# cat /etc/named.conf
// C/C++風格的語法,註釋用//或/* */
// 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.
//
options {
listen-on port 53 { 127.0.0.1; };
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;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging { //定義日誌
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN { //定義根區域文件名稱
type hint;
file "named.ca"; //使用的是相對路徑,默認存放在/var/named/named.ca
};
//把另外兩個文件也包含進來,做爲主配置文件的一部分
include "/etc/named.rfc1912.zones"; //定義區域配置文件
include "/etc/named.root.key"; //根區域的key文件,與事務簽名相關
註釋以下三行:
//listen-on port 53 { 127.0.0.1; };
//listen-on-v6 port 53 { ::1; };
//allow-query { localhost; };
啓動named服務:
驗證named服務是否已經啓動:
配置開機啓動:
至此,一臺緩存DNS服務器就配置好了!
【編輯區域配置文件/etc/named.rfc1912.zones】
在裏面新建一個區域,格式以下:
zone "區域名稱" IN { type master|slave|forward; //注意每一個語句要以分號結尾 file "ZONE_NAME.zone"; }; //注意要以分號結尾
咱們這裏新建的區域以下:
第三步:建立區域數據文件(/var/named/***.zone)
在/var/named下創建「ZONE_NAME.zone」文件,一般只包含宏定義和資源記錄,且第一個記錄必須是SOA記錄(格式以下);
$TTL 600;
name [TTL] IN RR_Type value
(1)一個FQDN可對應同多個IP;(負載均衡)
(2)多個FQDN可對應一個IP:(一臺主機有多個名稱,且能夠用CNAME定義)
注:以上各資源記錄的寫法及含義在上次博文中已經詳細討論過(http://sweetpotato.blog.51cto.com/533893/1596973),這裏再也不贅述了哈!
第四步:使用相關命令(named-checkconf、named-checkzone)測試配置文件及區域文件是否存在語法錯誤
第五步:確保主配置文件和各區域解析庫文件的權限爲640,屬主爲root,屬組爲named;
(1)檢查主配置文件的權限:
(2)檢查區域解析庫文件/var/named/test.com.zone的權限:
更改權限:
第六步:從新啓動服務或從新加載配置文件:
第七步:更改iptables和selinux的設置(若是不瞭解此兩項能夠暫時關閉它們)
第八步:分別使用(dig/nslookup)在Linux/Windows主機進行查詢DNS相關資源記錄
(1)使用dig命令在Linux主機上進行DNS資源查詢:
(2)使用nslookup命令在Windows系統平臺下測試DNS相關資源記錄:
至此,一臺可以正向解析的bind服務器就配置好了哈!
二、配置反向解析bind服務器:
正向解析與反向解析各自採用不一樣的解析庫,一臺DNS服務器能夠只有正向解析庫或只有反向解析庫,也能夠同時提供正向/反向解析。
反向區域的區域名稱格式:
ReverseIP.in-addr.arpa.
例如:假設網絡地址爲172.16.100.1 那麼規則命名爲100.16.172.in-addr.arpa
這裏我本地的內網IP爲192.168.1.0, 因此則寫成1.168.192.in-addr.arpa
第一步:修改配置文件/etc/named.conf,添加反向解析區域配置文件
第二步:建立反向區域解析文件168.192.zone
第三步:檢查語法錯誤
第四步:設置權限
第五步:從新加載配置文件
第六步:用windows客戶端驗證解析:
至此,咱們就把主bind服務器配置好了哈(既能夠正向解析又能夠反向解析)
3、rndc的相關知識:
一、什麼是rndc:
Remote Name Domain Controller,遠程名稱域控制器
rndc 經過一個 TCP 鏈接與名字服務器通訊,發送通過數字簽名認證的命令。在當前版本的rndc 和 named 中,惟一支持的認證算法是 HMAC-MD5,在鏈接的兩端使用共享密鑰。它爲命令請求和名字服務器的響應提供 TSIG類型的認證。全部經由通道發送的命令都必須被一個服務器所知道的 key_id 簽名。
監聽端口:953/tcp
語法:
rndc [-b address] [-c config] [-s server] [-p port]
[-k key-file ] [-y key] [-V] command
command is one of the following:
reload Reload configuration file and zones. #從新加載配置文件和區域文件
reconfig Reload configuration file and new zones only. #從新加載配置文件和新的區域文件
freeze Suspend updates to all dynamic zones.
stats Write server statistics to the statistics file. #將服務器統計信息寫入統計文件中
stop Save pending updates to master files and stop the server.
halt Stop the server without saving pending updates.
flush Flushes all of the server's caches. #清空DNS緩存
status Display status of the server. #顯示bind服務器的工做狀態
二、rndc的調試和日誌:
調試:顯示程序運行中的詳細信息(會產生I/O,正常狀況下建議關閉)
調試級別:0,1,2,3...
提高調試級別:
rndc trace
rndc trace LEVEL
rndc notrace
打開查詢日誌:記錄查詢動做(會增長磁盤I/O)
rndc querylog
例如:
4、輔助DNS服務器的配置
注意:輔助DNS是針對區域來講的;若是有多臺DNS服務器,必須爲每一個DNS服務器創建NS記錄,不然主DNS將不向其發送通知;
主輔DNS之間的區域傳送原理在上次博文中已經詳細討論過,這裏就不在贅述。想要了解的能夠看上一篇博文http://sweetpotato.blog.51cto.com/533893/1596973。
一、區域的定義:
zone 「區域名稱」 IN {
type slave; #區域類型爲輔助
file "slaves/ZONE_NAME.zone"; #區域文件必須保存在slaves目錄下,放在其餘目錄沒有權限
masters { #指出主服務器是誰,注意:花括號先後要有一個空格
MASTER_DNS_IP;
MASTER_DNS2_IP;
};
};
二、輔助DNS和區域傳送的配置:
第一步:先建立一個輔助DNS(分別在LinuxSlave和win2008的虛擬主機中實現)
(1)在LinuxSlave主機上安裝bind服務並作相應的配置:編輯/etc/named.rfc1912.zones,添加以下記錄:
檢查語法錯誤:
(2)在主DNS服務器所在的LinuxMaster主機上的區域文件/var/named/test.com.zone和/var/named/168.192.zone中添加相應的記錄:
檢查語法錯誤、重讀配置文件:
在主DNS服務器上,用dig命令作下檢測,看看新增長的記錄是否出現:
【在windows server 2008 R2上配置輔助DNS】
準備工做:配置好網絡,使得win2008虛擬機可以ping通主DNS服務器並安裝好DNS相關組件。
打開DNS管理工具,建立輔助區域:
完成後右鍵區域點擊刷新即從主DNS同步了區域:
隨便點擊幾個資源記錄看一下,發現都是灰色的沒法編輯哈(輔助DNS的數據來自於主DNS,通常是隻讀的)
在主DNS服務器上查看日誌,檢驗主輔DNS之間的區域傳送:
第二步:實現從主DNS服務器徹底同步區域數據文件,查看日誌文件驗證輔助服務器是否完成同步:
說明:如下的實驗沒有windows輔助DNS參與了,所以相應的NS記錄和A記錄被我手動刪除了哈!
在輔助DNS服務器上用dig命令檢測下是否能從主DNS服務器同步數據(徹底區域傳送)
在輔助DNS服務器上查看對應的區域文件是否已經有了:
再來看看輔助DNS上這些區域文件的內容是什麼:
查看日誌:
第三步:在主DNS服務器上新增一條資源記錄並查看日誌文件,而後到輔助DNS服務上查看日誌是否完成增量區域數據同步
查看日誌/var/log/messages發現,因爲我忘記把序列號加1了,因此報錯說序列號沒有更改,同步到輔助DNS失敗
把序列號加1後再來看日誌:
在輔助DNS服務器上查看日誌狀況:
查看輔助DNS服務器上的區域文件:
一切OK哈!
第四步:在windows客戶端用nslookup命令來驗證輔助DNS的配置:
一切OK哈!
DNS服務器的基本配置就這麼多哈,下面來簡單總結下:
一、每一個DNS服務器必需要有一個對應的NS資源記錄;
二、建立slave的時候,其配置文件類型必須是type slve; 必須指定主服務器的 IP地址 ;
三、可使用dig -t axfr test.com @server_IP 從主DNS服務器拉取全部解析庫資源記錄;
四、主輔同步完成後,將自動在slave服務器上的slaves/目錄下生成zone文件,這些區域文件是從主DNS同步過來的,通常爲只讀,不建議更改slave的zone文件;
五、在主DNS上修改區域文件時,必須將SOA記錄的serial加1 由於slave是經過serial值來進行判斷更新的(windows系統上是自動完成的);
六、DNS的日誌默認所有保存在/var/log/messege 文件中;
七、DNS的解析依賴於解析庫,因此就算是所配置的內容是徹底不存在的也能夠解析(且正向解析和反向解析的解析庫是各自獨立的)。須要注意,正向解析裏沒有PTR記錄,而反向解析庫裏不須要A記錄、MX記錄和CNAME記錄
本文出自 「技術日誌」 博客,請務必保留此出處http://sweetpotato.blog.51cto.com/533893/1598225