Bind進階

仍是出於項目的須要,把Bind比較高級的功能作一個梳理,這其中包含:DNS遞歸迭代查詢、DNS子域受權、DNS轉發、DNS主從區域傳輸、DNS數據加密,每個內容不只記錄了它的實現原理,也相應的配上了我一行一行代碼的實踐測試及結果。html

全部的測試都是基於我原來的文章:Bind服務搭建及測試上的代碼來進行的,因此下面的代碼若是有不理解的,請去看看我以前寫的文章。ios

DNS遞歸迭代查詢

爲何要把DNS的查詢稱之爲遞歸迭代查詢:算法

遞歸是由於:shell

用戶端向個人服務端發起一次查詢請求,那麼服務端若是有結果就返回,若是沒有結果就像上一級服務器再發一次請求,直到找到用戶須要的IP或者域名,這個過程能夠稱之爲遞歸。緩存

迭代是由於:安全

當服務端向上一級服務器法請求的時候,它並非一次請求就結束了,先是根域,再是二級域名這樣了,有屢次的請求跟返回動做,這個過程能夠稱之爲迭代。服務器

我在Bind搭建及測試這篇博文裏面,對它們的流程作了更詳細的敘述,這裏就很少寫了。app

參數

Bind既然有一個複雜的查詢流程,那麼與之相對應的就會有一系列的配置項來控制這個流程。下面講的參數都是基於Bind的主配置文件named.conf。測試

  • recursion : {yes|no} 是否容許遞歸請求
  • allow-recursion : {addressmatchlist|any|none} 容許遞歸請求的範圍
  • recursion-clients : {number(填數字)} 客戶端執行遞歸請求的數量

測試

named.conf配置文件的內容以下所示:加密

options {
        directory "/var/named";
        recursion yes;
    };複製代碼
zone "." {
        type hint;
        file "named.ca";
    };複製代碼
zone "liumapp.com" {
        type master;
        file "liumapp.com.zone";
    };複製代碼
zone "cnametest.com" {
        type master;
        file "cnametest.com.zone";
    };複製代碼
zone "32.29.115.in-addr.arpa" {
        type master;
        file "115.29.32.zone";
    };
能夠看到,我默認是把遞歸查詢開啓的複製代碼
開啓遞歸的狀況

隨便查詢一個域名,好比「www.qqq.com」1.jpg

能夠發現,Bind爲了找到www.qqq.com對應的IP地址,往上層域名服務器迭代了7次才找到最終結果。

關閉遞歸的狀況

如今咱們將配置文件的recursion改成no,重啓Bind以後再查詢一個新的域名,好比"www.qqqq.com"(www.qqq.com已經作了緩存)

2.jpg

能夠看到,關閉遞歸後咱們是查不到新域名的解析記錄的。

DNS子域受權

在DNS迭代查詢的狀況下,常常會用到NS記錄,一樣的,在DNS子域受權下面,NS記錄也會常常被用到。

子域受權:

好比個人一臺服務器A負責liumapp.com的權威域名解析,它再受權服務器B對liumapp.com的子域名:child.liumapp.com進行解析,這就叫作子域受權。

DNS迭代查詢利用的就是子域受權:經過根域,到二級域再依次往下迭代查詢。

測試

個人父服務器IP爲115.29.32.62,其解析的域名爲www.liumapp.com,子服務器IP爲106.14.212.41,其解析的域名爲www.test.liumapp.com

首先在父服務器上,咱們要對子服務器進行受權,具體配置liumapp.com.zone文件,添加以下內容:

test.liumapp.com. IN NS ns1.test
    ns1.test IN A 106.14.212.41複製代碼

大意就是給liumapp.com的子域名test.liumapp.com分配權限給ns1.test,而後指定ns1.test的IP爲106.14.212.41

重啓父服務器,而後進入子服務器的shell命令面板

首先咱們對named.conf作一個備份,而後把它的內容修改成:

options {
      directory "/var/named";
    };複製代碼
zone "test.liumapp.com" {
        type master;
        file "test.liumapp.com.zone";
    };
複製代碼

而後在/var/named/目錄下添加一個test.liumapp.com.zone文件,其內容爲:

$TTL 7200
    @ IN SOA test.liumapp.com. liumapp.com.gmail.com. (222 1H 15M 1W 1D)
    @ IN NS dns1.liumapp.com.
    dns1.liumapp.com. IN A 106.14.212.41
    www.test.liumapp.com. IN A 106.14.212.42
複製代碼

接下來重啓Bind。而後咱們進行測試,首先對父服務器進行解析:

dig @115.29.32.62 www.test.liumapp.com複製代碼

結果爲:

3.jpg

而後咱們對子服務器進行解析:

dig @106.14.212.41 www.test.liumapp.com複製代碼

結果爲:

4.jpg

DNS轉發

概念

假設有一個局域網,內部有兩臺DNS服務器,命名爲A和B,局域網經過防火牆對外開放,可是隻有A可以直接對外提供DNS解析服務,B只能在局域網內的內網進行訪問,那當須要用到B的DNS解析的時候,就是經過A的forwarding轉發來實現。

配置

首先看一下關於轉發的配置項

  • forwarders : {address_list} 表示轉發的服務器列表
  • forwarder only : 表示只由目的服務器權威解析
  • forwarder first : 優先轉發查詢

測試

一樣是父服務器115.29.32.62和子服務器106.14.212.41,咱們如今把父服務器用來負責DNS的某一個域做爲轉發,子服務器用來負責某一個域的權威解析。

如今咱們先配置子服務器的權威解析:

首先進入/var/named目錄,新建一個文件dnstest.com.zone(這個域名我並無擁有它,只是爲了測試方便隨便寫的),其內容爲:

$TTL 7200 
    @ IN SOA dnstest.com. liumapp.com.gmail.com. (222 1H 15M 1W 1D)
    @ IN NS dns.dnstest.com.
    dns.dnstest.com. IN A 106.14.212.41
    www.dnstest.com. IN A 6.6.6.6
複製代碼

而後修改named.conf,添加下列內容:

zone "dnstest.com" {
        type master;
        file "dnstest.com.zone";
    };複製代碼

同時刪除原來的

zone "test.liumapp.com" {
        type master;
        file "test.liumapp.com.zone";
    };複製代碼

重啓Bind。

而後進入父服務器的shell操做面板,在開始以前,咱們要注意一點,就是Bind的DNS轉發只有在Bind9版本以上才支持,因此在開始以前,咱們先使用命令查看一下Bind的版本:

nslookup -q=txt -class=CHAOS version.bind複製代碼

個人服務器上出來的結果是:

[root@iZ28vhwdq63Z ~]# nslookup -q=txt -class=CHAOS version.bind.複製代碼
Server:  10.202.72.116複製代碼
Address:  10.202.72.116#53複製代碼
version.bind  text = "9.9.9-P3-RedHat-9.9.9-2.1.alios6"複製代碼

而後修改named.conf,添加如下內容:

zone "dnstest.com" {
      type forward;
      forwarders {106.14.212.41;};
    }複製代碼

接下來咱們在父服務器上使用dig命令:

dig @127.0.0.1 www.dnstest.com複製代碼

請求解析www.dnstest.com域名,結果以下:

5.jpg

同時要注意,forward的正常使用須要遞歸查詢recursion開啓。

DNS主從區域傳輸

區域是DNS服務器的管轄範圍, 是由DNS名稱空間中的單個區域或由具備上下隸屬關係的緊密相鄰的多個子域組成的一個管理單位。 所以, DNS名稱服務器是經過區域來管理名稱空間的,而並不是以域爲單位來管理名稱空間,但區域的名稱與其管理的DNS名稱空間的域的名稱是一一對應的。或者說,一個區域對應一系列域名的解析。

DNS主從同步

假設咱們有兩臺服務器,分別爲dns主服務器Master和dns從服務器slave,那麼他們之間的dns主從同步步驟是這樣的:

  • master發送notify信息給slave
  • slave去查詢主服務器的SOA記錄
  • master將SOA記錄發送給slave
  • slave根據SOA記錄去檢查serial number是否有遞增更新
  • 若是有的話slave向master發起zone transfer請求,而後master返回響應結果,slave更新記錄。若是沒有的話就說明不須要更新。

DNS主從配置

在開始配置以前,先要注意幾個事項:

  • 確保防火牆的規則不會攔截Bind的監聽端口,默認爲53
  • 確保named用戶擁有操做相關目錄的權限(/var/named)
  • 確保主從服務器的時鐘一致
  • 搭建完畢後,若修改主服務器域的配置,serial number必須遞增
服務器配置

Master服務器

zone "liumapp.com" {
      type master;
      notify yes;
      also-notify{106.14.212.41;};
      file "liumapp.com.zone";
    }複製代碼

上面的notify yes表示開啓notify這個功能,also-notify{}裏面放的是slave服務器的IP列表。

Slave服務器

options{複製代碼
directory  "/var/named";複製代碼
allow-query  { any; };複製代碼
recursion  yes;複製代碼
};
    zone "liumapp.com" {複製代碼
type  slave;複製代碼
file  "slaves/liumapp.com.zone";複製代碼
masters {115.29.32.62;};複製代碼
};複製代碼

上面的file表示從主服務器同步過來的信息存放地址,我這裏就表示存放在/var/named/slaves/liumapp.com.zone

我把IP爲115.29.32.62的dns server做爲個人master,IP爲106.14.212.41的dns server做爲個人slave。

首先咱們按照上面兩段代碼進行主從服務器的配置。

而後重啓兩臺服務器的Bind,重啓以後,應該就可以在從服務器的/var/named/slaves/下找到一個liumapp.com.zone文件,它的內容應該跟主服務器的/var/named/liumapp.com.zone一致。

因此,這個時候咱們無論使用命令

dig @115.29.32.62 www.liumapp.com複製代碼

向主服務器請求www.liumapp.com的解析仍是

dig @106.14.212.41 www.liumapp.com複製代碼

向從服務器請求www.liumapp.com的解析,獲得的結果最終都是同樣的。

測試

如今咱們按照上面的配置走完了一遍以後,來測試一下主從服務器之間的同步。

在Master服務器的/var/named/liumapp.com.zone文件上,咱們添加一條解析記錄:

liumei.liumapp.com. IN A 8.8.5.6複製代碼

而後添加一下它的serial number值,也就是:

liumapp.com.  IN  SOA  liumapp.com.  liumapp.com.gmail.com8 (225  1H  15M  1W 1D)複製代碼

這條記錄裏面的倒數第5個數「225」,咱們把它改成226便可。

重啓服務器以後,敲命令:

dig @106.14.212.41 liumei.liumapp.com複製代碼

便可成功在子服務器上解析到liumei.liumapp.com的記錄爲8.8.5.6

DNS區域傳輸限制

首先,咱們在本地一臺電腦上使用一個命令:

dig @115.29.32.62 axfr liumapp.com複製代碼

不出意外,應該可以獲得liumapp.com在115.29.32.62這臺DNS server上的全部解析記錄

6.jpg

可是從安全角度來說,我確定不但願這樣的事情發生,因此就要用到傳輸限制。

方法

  • 基於主機的訪問控制
經過主機IP來限制訪問。複製代碼
* allow-transfer : {address_list | none}  , 容許域傳輸的機器列表
複製代碼
  • 事務簽名
經過密鑰對數據進行加密。
    事務簽名的測試我會放在後面的DNS數據加密裏面來作。
複製代碼
測試

咱們在主服務器上的named.conf配置文件中進行修改:

zone "liumapp.com" {複製代碼
type  master;複製代碼
notify  yes;複製代碼
also-notify {106.14.212.41;};複製代碼
allow-transfer{106.14.212.41;};複製代碼
file "liumapp.com.zone";複製代碼
};複製代碼

重啓Bind以後,回到本地電腦上,繼續使用命令:

dig @115.29.32.62 axfr liumapp.com複製代碼

結果以下,請求已被拒絕。

7.jpg

可是經過106.14.212.41是能夠獲取數據的:

dig @106.14.212.41 axfr liumapp.com複製代碼

結果以下:

8.jpg

DNS數據加密

加密方式

  • DES 對稱加密
* 概述:文件加密和解密使用相同的密鑰,簡單快捷。
    * 流程:假定有發送方A和接收方B,A和B有相同的密鑰,A發送明文給B以前,經過密鑰和加密算法,將明文加密成密文,發送給B,B再經過密鑰和解密算法,將密文解密成明文。複製代碼
  • IDEA 非對稱加密
* 概述:密鑰包括公鑰和私鑰,安全性較DES方式高。
    * 流程:假定有發送方A和接收方B,B有本身的私鑰和公鑰,A須要獲取B的公鑰,獲取以後,A首先本身生成一個會話密鑰,而後這個會話密鑰經過B的公鑰進行加密,加密後發送給B,B再經過本身的私鑰對它進行解密,從而獲得A生成的會話密鑰。以後,A經過本身的會話密鑰將要發送的明文進行加密,發送給B,B經過事先獲得的會話密鑰對發送過來的密文進行解密從而獲得明文。複製代碼

DNS事務簽名

事務簽名能夠經過兩種加密方式來實現,分別是:

  • TSIG:對稱方式
  • SIGO:非對稱方式

如今比較經常使用的是TSIG這種方法。

TSIG事務簽名

參數:

  • allow-transfer : {key keyfile}(key及key的文件位置); 事務簽名的key

測試

首先咱們進入主服務器,而後生成key:

在主服務器的/usr/key目錄下,注意賦予key目錄named用戶的讀權限

輸入如下命令:

dnssec-keygen -a HMAC-MD5 -b 128 -n HOST liumapp-key複製代碼
  • -a : 加密算法
  • -b : 加密位數
  • -n : 能夠選擇ZONE或者HOST
  • liumapp-key:密鑰名稱

我生成的公鑰文件和私鑰文件其內容以下所示:

9.jpg

而後咱們複製私鑰裏面的那段key的內容,再進入/var/named/chroot/etc目錄,新建一個liumapp-key文件

其內容爲:

key "liumapp-key" {複製代碼
Algorithm hmac-md5;複製代碼
secret "ghWgud4mhN11PKBIITgxbg==";複製代碼
};複製代碼

上面的secret的值是從生成的私鑰文件中複製來的。

而後編寫named.conf文件,添加如下內容:

include  "/var/named/chroot/etc/liumapp-key";複製代碼

注意,這段內容要放在zone "liumapp.com"以前。

而後修改zone "liumapp.com"的配置,最終配置結果以下:

include "/var/named/chroot/etc/liumapp-key";複製代碼
zone "liumapp.com" {
            type master;
            notify yes;
            also-notify {106.14.212.41;};
            allow-transfer{key "liumapp-key";};
            file "liumapp.com.zone";
    };複製代碼

上面的allow-transfer的key的值是我命名的那個值。

而後咱們重啓Bind,接下來是配置slave從服務器,不過在配置以前,須要先把咱們的配置文件liumapp-key拷貝過去:

使用命令:

scp liumapp-key root@106.14.212.41:`pwd`複製代碼

結果以下所示:

10.jpg

而後在從服務器的named.conf中進行配置,一個是把liumapp-key包含進去,而後配置key,最終結果以下所示:

options{複製代碼
directory  "/var/named";複製代碼
allow-query  { any; };複製代碼
recursion  yes;複製代碼
};複製代碼
include  "/var/named/chroot/etc/liumapp-key";複製代碼
server  115.29.32.62 {複製代碼
keys {"liumapp-key";};複製代碼
};複製代碼
zone "dnstest.com" {複製代碼
type  master;複製代碼
file  "dnstest.com.zone";複製代碼
};複製代碼
zone "liumapp.com" {複製代碼
type  slave;複製代碼
file  "slaves/liumapp.com.zone";複製代碼
masters {115.29.32.62;};複製代碼
};複製代碼

重啓從服務器的Bind服務,而後咱們再回到主服務器:

添加一條liumapp.com.zone下的A記錄,固然還須要遞增一下serial number也不知道加了多少,總之最後個人這個ZONE的內容以下所示:

$TTL 7200複製代碼
liumapp.com.  IN  SOA  liumapp.com.  liumapp.com.gmail.com8 (226  1H  15M  1W 1D)複製代碼
liumapp.com.  IN  NS  dns1.liumapp.com.複製代碼
dns1.liumapp.com.  IN  A  115.29.32.62複製代碼
www.liumapp.com.  IN  A  106.14.212.41複製代碼
liumei.liumapp.com.  IN  A  8.8.5.6複製代碼
heiheihei.liumapp.com.  IN  A  9.9.9.9複製代碼
@ IN  MX  10  mail複製代碼
mail  IN  A  115.29.32.63複製代碼
test.liumapp.com.  IN  NS  ns1.test複製代碼
ns1.test  IN  A  106.14.212.41複製代碼

而後重啓bind,再使用命令:

tail -f /var/log/messages複製代碼

獲得的信息以下所示:

11.jpg

能夠看到,我修改了liumapp.com.zone以後,主服務器立刻同步到了從服務器上,而他們之間的交流,就是用到了TSIG事務簽名。

相關文章
相關標籤/搜索