1. 程式人生 > >DNS-VIEW的原理與配置

DNS-VIEW的原理與配置

linux dns

1.DNS系統簡介

DNS系統是個多級別的、分布的數據庫系統。它保存互連網主機名和IP地址的對應關系,也保存IP地址和主機名的對應關系,郵件路由信息,和其他一些互連網程式用到的信息。
DNS中客戶程序查找的信息叫解析庫(resolver library),他發送一個查詢到一個或多個服務器並等待回應,BIND 9包含了域名服務和解析庫。DNS中的數據是按樹型結構存儲的,或者說是按樹型管理的。樹的每個節點,稱為一個域,由一個庫文件標示。表示節點的域名相互串聯直到根域(root node)。他從右到左寫成字符串,中間用“點”(.)分隔。一個域名只需要在他的父域中名字唯一就可以了。

為了管理方便,名址空間被分隔成一些區,這些區叫做區域(zones)。每一個從一個節點開始,並且延伸至一個葉子節點,或延伸到另一個區域的開始。每一個區域的數據都存在DNS中,他通過DNS協議應答本區域的DNS查詢。相關的域名數據存儲在資源記錄中(resource records (RRs))。正確的操作域名服務器,很重要的一點是理解區域(zones)和域(domain)的區別。


區域( zone)是DNS樹中一個節點的代表。一個區域(zone)包含一個域樹(domain tree)相鄰近的部分,對他來說,一個域名服務器擁有他完整的信息,並擁有管理權。他包含從某一節點以下任何的域名,除了那些連接到其他區的部分(那些部分可能由其他更低級的服務器管理)。一個節點會被一個或多個父區域的NS 記錄(NS records )標註,他會被從根區域開始逐層匹配。

一個區域(zone)能夠精確的映射一個域(domain),也能夠只包含一個域的部分,其他部分由另一個域名服務器解釋。DNS中每一個名字都是個域,即使他是個終點(terminal),沒有子域(subdomains)。每一個子域都是個域,除了根域外任何的域也都是子域。這些術語的意義都不但是字面能夠理解的,建議閱讀RFCs 1033,1034 and 1035來完整理解這些難點和細節。

2.bind軟件簡介

最新的Bind源代碼軟件包可以在官方網站http://www.bind.com/下載。另外http://www.isc.org/index.pl/sw/bind/也是一個不錯的地方。幫助文檔你可以在http://www.isc.org/index.pl/sw/bind/找到,此站點的幫助文檔很詳細且比較全面。另外http://www.isc.org/index.pl/sw/bind/也回答了bind的常見問題。http://www.bind.com/bind.html 裏有很多bind配置的配置文件示例。

centos7自帶的是bind 9.9.4的包,我們可以直接通過yum工具來安裝它。安裝軟件的時候裝兩個包,一個bind,一個bind-chroot。有chroot環境之後,可以將所有bind 程序和配置都在/var/named/chroot目錄下。

[root@servera ~]# yum -y install bind bind-chroot

3.bind9的view視圖
從Bind 9開始,bind支持視圖功能。什麽是視圖呢?就是以某種特殊的方式根據用戶來源的不同而返回不同的查詢結果。這個技術在CDN中應用相當多,也是解決目前區域間帶寬小和延遲大問題的一種方法。

view的配置寫法如下:
view “名稱” { # 名稱可以自擬,但必須唯一
match-clients { ip/netmask; }; # 通過match-clients字段來區分不同區域
zone "domain" IN { # 當有了view字段之後,所有的zone定義字段必須出現在view字段當中
type master;
file "domain.zone";
};
};

舉例:
由於中國網絡目前分為兩個區域—南電信北聯通,2個網絡上的用戶,訪問互相網絡上的主機效率很低,所以現在一般的服務提供商都提供2個網絡的相同服務,就如www.abc.com這個網站,為了提高電信和網通2個網絡上的客戶體驗,使用戶體驗最快速的訪問速度。決定為電信和網通分別架設2臺服務器,其中一臺接入電信專線,一臺接入網通專線。但是要讓用戶透明的訪問此網站,不需要讓用戶進行人工的網站選擇。我們可以采用DNS服務器中的view功能,讓不同的IP指向在不同網絡上的主機。比如,讓瀏覽www.abc.com這個網站上的網通用戶瀏覽架設在網通線路上的主機。

實驗環境如下:
解析的主機名稱:www.abc.com
電信客戶端ip:172.25.0.11 希望其解析到結果為192.168.11.1
網通客戶端ip:172.25.0.12 希望其解析到結果為22.21.1.1
其余剩下其他運營商的客戶端解析的結果皆為1.1.1.1
配置如下:
1)定義view字段

[root@servera ~]# vim /etc/named.conf 
options {
        listen-on port 53 { any; };
        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     { any; };

        /* 
         - 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. 
         - If your recursive DNS server has a public IP address, you MUST enable access 
           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-validation yes;
        dnssec-lookaside auto;

        /* 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;
        };
};
view "dxclient" {
        match-clients { 172.25.0.11; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { 172.25.0.12; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};

include "/etc/named.root.key";

2)生成數據文件
[root@servera named]# cp -p named.localhost dx.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone wt.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone other.abc.com.zone
[root@servera named]# vim dx.abc.com.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       192.168.11.1
                           
[root@servera named]# vim wt.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       22.21.1.1                   
[root@servera named]# vim other.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       1.1.1.1

3)重啟服務
[root@servera named]# chgrp named abc.com.*
檢測語法:
[root@servera named]# named-checkconf
[root@servera named]# named-checkzone abc.com /var/named/dx.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone abc.com /var/named/wt.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone abc.com /var/named/other.abc.com.zonee
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# service named start
[root@servera named]# chkconfig named on
4)測試
[root@serverb ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 192.168.11.1

[root@serverc ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 22.21.1.1

可以看到,解析www.abc.com的請求同時交給172.25.0.10這臺服務器,然而不同的客戶端解析到的結果不一致,這就是dns-view的作用。
如果請求不來自第一個視圖規定的區域,那麽請求就會向下選取其他視圖比對,所以可以看出視圖比對是自上而下的,如果請求的區域在上一個視圖中,就不會向下一個視圖請求,即使你在下一個視圖中放入了這個區域。

4.ACL參數的配置
有些時候,我們可能匹配的IP地址範圍比較廣,由於matchclients可能需要定義非常多的網段,bind引入acl關鍵字定義變量替換,以使matchclients中僅出現最少的符號,而網段的增添可以在外部文件中進行。

可以通過以下方式去完成:
acl "foosubnet" { 192.168.1/24;192.168.2/24; };
舉例:
目前電信的客戶端為172.25.0.11和172.25.0.12這兩臺服務器
目前網通的客戶端為172.25.0.13和172.25.0.14這兩臺服務器
通過acl的方式完成相應配置,就可以通過以下寫法來實現。

1)在主配置文件裏定義外部文件的讀取配置參數
[root@servera named]# vim /etc/named.conf 
# 變更如下參數,其余參數不變
include "/etc/dx.cfg";
include "/etc/wt.cfg";
view "dxclient" {
        match-clients { "dx"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { "wt"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};

view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};
2)生成外部文件
[root@servera named]# cd /var/named/chroot/
[root@servera chroot]# ls
dev  etc  run  usr  var
[root@servera chroot]# cd etc/
[root@servera etc]# ls
localtime  named.conf        named.rfc1912.zones  pki
named      named.iscdlv.key  named.root.key       rndc.key
[root@servera etc]# pwd
/var/named/chroot/etc
[root@servera etc]# vim dx.cfg
acl "dx" {
        172.25.0.11;
        172.25.0.12;
};

[root@servera etc]# vim wt.cfg
acl "wt" {
        172.25.0.13;
        172.25.0.14;
};
3)重啟服務
[root@servera etc]# systemctl restart named-chroot
4)訪問測試略

本文出自 “Linux學習之路” 博客,請務必保留此出處http://zzclinux.blog.51cto.com/13401541/1978561

DNS-VIEW的原理與配置