linux下8種DNS功能的實現(一)


操做環境 Redhat 5.8虛擬機
一.DNS的由來
   1. 人腦老是不如計算機的,人們對文字的記憶力要比對數字的記憶力高不少。所以一個名爲 DNS 的服務,幫咱們將主機名解析爲IP地址, 例如咱們輸入www.baidu.com就能夠訪問這個網站了,而不用費力取記住IP地址
  2.  早期人們用/etc/hosts 這個文件來將主機名解析爲IP地址,可是當網絡上的主機愈來愈多,主機名與 IP 的對應沒法在全部的計算機內更 新, 另外要將主機名加入該文件內僅能向 INTERNIC 註冊,若 IP 數量太多時,該文件會很大,也就不利於其餘主機同步了。客戶端計算機每次都 得要從新下載一次文件才能順利聯網。
  3. 爲了解決這個嚴重的問題,柏克萊大學發展出管理主機名對應 IP 的系統, 咱們稱它 爲BIND (Berkeley Internet Name Domain),這個系統能夠輕鬆的進行維護的工做~太棒了!這也是目前全世界使用最普遍 的領域名系統 DNS(Domain Name System) 經過DNS ,咱們不須要知道主機的 IP ,只要知道該主機的名稱,就可以輕易的連上 該主機了。
二. DNS的組織結構  
1.如圖

   2.常見的頂級域
.com:商業機構,任何人均可以註冊
.edu:教育機構
.gov:政府部門
.int:國際組織
.mil:軍事部門
.net:網絡組織
.org:非盈利組織,任何人均可以註冊
.info:網絡信息服務組織
.au:  澳大利亞
.ca :  加拿大
.cn:   中國
.tw:   中國臺灣
.hk:  中國香港
.in:  印度
.jp:  日本
 
 
三. DNS的查詢過程
例:
1. client去找本地DNS,去問www.163.com的ip地址,若是本地DNS的緩存有www.163.com對應的ip地址,直接返回給client
 
2.若是沒有緩存:
   @1. 本地DNS去找根域服務器,問www.163.com的ip地址,根域服務器不知道,可是知道com的ip地址,返回給本地DNS。
   @2. 本地DNS去找com域服務器,問www.163.com的ip地址;
   @3. com域服務器不知道,可是知道163.com的ip地址,返回給本地DNS
   @4. 本地DNS去找163.com域服務器,問www.163.com的ip地址;
   @5. 63.com域服務器知道www.163.com的ip地址;返回給本地DNS
   @6.本地DNS把查詢到的結果返回給client,並緩存下來,供其餘的
 
3.查詢方式
 client去本地DNS直接拿到想要的結果,這種查詢方式遞歸查詢。 本地DNS去找根域、com域、163.com域查詢的過程是迭代查詢。
 
四.DNS的正向解析
 1.裝包
[root@tx1 ~]# yum install bind bind-chroot -y   //dns須要的包bind bind-chroot
 
2.與dns相關的內容
[root@tx1 ~]# rpm -ql bind ; rpm -ql bind-chroot
/etc/logrotate.d/named    DNS日誌輪滾配置文件
/etc/rc.d/init.d/named     DNS啓動腳本
/usr/sbin/dns-keygen         
/usr/sbin/named-checkconf   檢查主配置文件語法正不正確
/usr/sbin/named-checkzone   檢查區域配置文件語法正不正確
/usr/share/doc/bind-9.3.6/sample   
/var/named/chroot    安全措施,把DNS 服務器禁錮在這裏
 
3.具體配置
@1
[root@tx1 ~]# cd /var/named/chroot/          //  /var/named/chroot/ 這是一個僞目錄,至關於一個虛擬的根,爲了提升安全性
[root@tx1 chroot]# ls
dev  etc  var
[root@tx1 chroot]# cd etc
[root@tx1 etc]# ls
localtime  rndc.key      這裏沒有name.conf 這個文件,咱們手動拷貝一份
[root@tx1 etc]# rpm -ql bind
[root@tx1 etc]#  cp /usr/share/doc/bind-9.3.6/sample/etc/named.conf  ./named.conf   //不會寫能夠找模板
編輯named.conf這個文件,把文件裏面多餘的東西刪除了,而後咱們來編輯
[root@tx1 etc]# vim named.conf
zone "." IN{
     type hint;     //表示這個區域內的高速緩存的域名服器
     file "named.root";
};
因爲本人在虛擬機裏作實驗,因此這幾行沒有加
[root@tx1 etc]# vim named.conf
options
{
        listen-on port 53 {any;};     //any表示監聽全部客戶端發來的信息 
        directory "/var/named";    //  /--> /var/named/chroot 保存區域配置文件
        dump-file               "data/cache_dump.db";  
        statistics-file         "data/named_stats.txt";   
        memstatistics-file      "data/named_mem_stats.txt";  
        allow-query     {any;};   //any表示容許全部客戶端進行dns查詢
};
IN 是internet記錄
type是類型 主的類型是master,從類型是slave
file是根區域文件
zone "tx.com"  IN{
      type master;
      file "tx.com.zone";
};
 
@2.  寫區域配置文件
[root@tx1 ~]# cd /var/named/chroot/var/named/
[root@tx1 named]# rpm -ql bind
[root@tx1 named]# cp /usr/share/doc/bind-9.3.6/sample/var/named/localhost.zone ./tx.com.zone 
//不會寫能夠找模板
[root@tx1 named]# cat -n tx.com.zone    //先看一下這個文件
     1$TTL86400
     2@IN SOA@       root (
     342; serial (d. adams)
     43H; refresh
     515M; retry
     61W; expiry
     71D ); minimum
     8
     9        IN NS@
    10 IN A127.0.0.1
    11IN AAAA::1
    12
第一行 :TTL是生存期,單位是秒 ,$TTL是全局定義的 
第二行: @表示當前域,IN指internet ,SOA起始受權機構,@取代在/etc/named.conf中指定的域名。 SOA段中的數字,分別爲:序列號、刷新、重試、過時、生存期
第三行:序列號用於Slave與Master的更新用
第四行:除了序列號外還能夠用它規定多久slave進行一次主動更新
第五行:重試一旦Slave嘗試鏈接Master失敗,規定多久嘗試下一次鏈接
第六行:過時若是Slave沒法連通Master規定多久後不在嘗試鏈接
第七行:生存期服務器回答 ‘無此域名’ 的間隔時間。
數字的默認單位爲秒。不然:W= 周、D= 日、H= 小時、M= 分鐘。
第九行:NS指定域名服務器,NS後面的主機名稱必須有IP對應
第十行:指定域名對應的IP
 
@3.下面咱們來寫本身的ZONE文件
$TTL    86400
@               IN SOA  ns.tx.com.  //com後的點千萬不要忘記.它表明一個完整的主機名     root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70    //指定DNS服務器的ip
www             IN A            192.168.8.64
tx              IN A            192.168.8.65
[root@tx1 etc]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]
有的時候看到OK,但不必定能成功,因此還要看一下日誌文件
[root@tx1 named]# tail -n 20 /var/log/messages | grep named
Feb  6 01:33:01 tx1 named[12350]: starting BIND 9.3.6-P1-RedHat-9.3.6-20.P1.el5 -u named -t /var/named/chroot   
 //這裏可知chroot的目錄與named啓動的參數等數據
Feb  6 01:33:01 tx1 named[12350]: found 1 CPU, using 1 worker thread
Feb  6 01:33:01 tx1 named[12350]: loading configuration from '/etc/named.conf'
 //這裏能夠知道配置文件是有哪裏加載的
Feb  6 01:33:01 tx1 named[12350]: using default UDP/IPv4 port range: [1024, 65535]
Feb  6 01:33:01 tx1 named[12350]: listening on IPv4 interface lo, 127.0.0.1#53
Feb  6 01:33:01 tx1 named[12350]: listening on IPv4 interface eth0, 192.168.8.70#53
Feb  6 01:33:01 tx1 named[12350]: command channel listening on 127.0.0.1#953
//能夠知道有哪幾個接口提供DNS的相關服務
Feb  6 01:33:01 tx1 named[12350]: zone tx.com/IN: loaded serial 42
Feb  6 01:33:01 tx1 named[12350]: running
//loaded serial的數據,這裏不能出錯
 
@4.客戶端測試
[root@tx2 ~]# cat /etc/resolv.conf 
search uplooking.com
nameserver 192.168.8.70
[root@tx2 ~]# nslookup www.tx.com
Server:192.168.8.70
Address:192.168.8.70#53
Name:www.tx.com
Address: 192.168.8.64
 
五.DNS的反向解析
1.在上一個的基礎上修改一下
[root@tx1 etc]# vim named.conf
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
};
zone "8.168.192.in-addr.arpa" IN {  //DNS的反解ip要從後往前寫而後加上in-addr.arpa表示反解結束
      type master;
      file "192.168.20.zone";
};
[root@tx1 etc]# cd ../var/named/
[root@tx1 named]# ls
data  slaves  tx.com.zone
[root@tx1 named]# vim 192.168.8.zone
$TTL    86400
@               IN SOA  ns.tx.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70
65              IN PTR           www.tx.com.
 
2.客戶端測試
[root@tx2 ~]# nslookup 192.168.8.65
Server:192.168.8.70
Address:192.168.8.70#53
65.8.168.192.in-addr.arpaname =  www.tx.com.
 
六.DNS的主從同步
1.
條件:須要兩臺 server ,主(192.168.8.70)從(192.168.8.71)。另外要注意這兩臺機器的時間
優勢:
(1)從服務器能夠分擔主服務器的查詢請求
(2)有了從服務器以後,能夠快速的響應client的請求
(3)即便主服務器出現問題,從服務器依然能夠提供查詢服務
原理:
(1)當主服務器作好配置以後,會通知從服務器
(2)從服務器收到通知以後,查詢SOA記錄查 42  序列號
(3)從服務器去和主服務器比對序列號,若是從的序列號比主的小,那麼他就要去和主進行數據同步。所以,主服務器修改完配置文件以後,都要把序列號調大,建議使用日期格式
(4)從服務器向主服務器發起數據請求;主服務器收到請求以後,開始傳輸數據
2. 具體配置
@1. Server的配置,這裏面裝包就再也不提了
 
[root@tx1 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
      allow-transfer {192.168.8.71;};//指定本身的從服務器的ip若是想實現多個從服務器,能夠在{}裏填寫,以;結束
};
[root@tx1 etc]# cd ../var/named/
[root@tx1 named]# vim tx.com.zone 
$TTL    86400
@               IN SOA  ns.tx.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70
www             IN A            192.168.8.64
//與以前的沒有什麼變化
 
@2.Slave的配置
[root@tx2 chroot]# vim named.conf
options
{
        listen-on port 53 {any;};
        directory "/var/named/slaves";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type slave;    //指定類型爲從
      file "tx.com.slave";
      masters  {192.168.8.70; }; //指定主服務器的ip
};
 
@3.啓動服務
[root@tx1 named]# service named restart
[root@tx1 ~]# tail -0f /var/log/messages 
[root@tx2 etc]# service named restart
[root@tx2 named]# cd slaves/
[root@tx2 slaves]# ls
tx.com.slave(由DNS服務器同步過來的)
[root@tx1 ~]# tail -0f /var/log/messages 
Apr 13 16:21:58 tx1 named[3195]: client 192.168.8.71#43262: transfer of 'tx.com/IN': AXFR started
Apr 13 16:21:58 tx1 named[3195]: client 192.168.8.71#43262: transfer of 'tx.com/IN': AXFR ended    //日誌裏面能夠看到傳輸的信息
 
七.DNS的主從加密傳輸
dnssec-keygen
-a :後面接的 [type] 爲演算方式的意思,主要有 RSAMD5, RSA, DSA, DH 
與 HMAC-MD5 等。建議你可使用常見的 HMAC-MD5 來演算密碼; 
-b :你的密碼長度爲多少?一般給予 512 位的 HMAC-MD5; 
-n :後面接的則是客戶端可以更新的類型,主要有底下兩種,建議給 HOST 便可: 
ZONE:客戶端能夠更新任何標誌及整個 ZONE;  
HOST:客戶端僅能夠針對他的主機名來更新
[root@tx1 named]# dnssec-keygen -a hmac-md5 -b 128 -n host txkey
Ktxkey.+157+28539
[root@tx1 named]# ls
chroot  Ktxkey.+157+28539.key      slaves
data    Ktxkey.+157+28539.private
[root@tx1 named]# cat Ktxkey.+157+28539.key 
txkey. IN KEY 512 3 157 kX7RaouImmrvdTFvoFYfxg==   要kX7RaouImmrvdTFvoFYfxg==  //在上一DNS主從同步上作就能夠
 
主:
[root@tx1 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
key  txkey {       //在上一個基礎上加上這幾行
          algorithm hmac-md5;    //algorithm運算法則
           secret "kX7RaouImmrvdTFvoFYfxg== ";
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
      allow-transfer {key txkey;};     //這裏也改動一下
};
從:
[root@tx2 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named/slaves";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
key txkey {
       algorithm hmac-md5;
       secret "kX7RaouImmrvdTFvoFYfxg== ";
};
zone "tx.com" IN {
      type slave;   
      file "tx.com.slave";
      masters  { 192.168.8.70 key txkey; };
};
從:
[root@tx2 slaves]# rm -f tx.com.slave 
[root@tx1 named]# service named restart
[root@tx1 ~]# tail -0f /var/log/messages 
從:
[root@tx2 etc]# service named restart
[root@tx2 etc]# cd ../var/named/slaves/
[root@tx2 slaves]# ls
tx.com.slave
[root@tx1 ~]# tail -0f /var/log/messages 
Apr 13 17:08:12 tx1 named[29970]: client 192.168.8.71#36850: transfer of 'tx.com/IN': AXFR started: TSIG txkey
Apr 13 17:08:12 tx1 named[29970]: client 192.168.8.71#36850: transfer of 'tx.com/IN': AXFR ended

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~未完待續~~~~~~~~~~~~~~~~~~~~~~~~~~~~算法

相關文章
相關標籤/搜索