主從 DNS 部署 -- 超詳細實驗操作

應讀者要求,今天補充一個 DNS 主從的知識。

關於主從 DNS 部署,工作中很少會用到,但是爲了讓大家遇到時能快速搭建環境,這裏做個實踐。

安裝 dns 軟件:

[root@slave1 ~]# yum -y install bind*

配置文件解析

/etc/named.conf 這個配置文件主要分 3 段內容, options 是全局配置,logging 是日誌配置,最後是區域解析庫配置以及所包含的區域解析庫文件配置。

[root@slave1 ~]# vim /etc/named.conf
options {
        listen-on port 53 { 10.0.0.62; };
        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";
        recursing-file "/var/named/data/named.recursing";
        secroots-file "/var/named/data/named.secroots";
        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;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.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; //指定根區域類型。
        file "named.ca"; //指定根區域解析庫文件名稱所在位置,相對於/var/named
};

//指定區域文件名稱,所有的區域定義都可以寫在named.rfc1912.zones文件中
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

配置文件詳解:

listen-on port 53 {10.0.0.62;}; 表示監聽的端口和 IP 地址,其中 {} 內部兩端都要有空格,IP 地址要以; 號結尾。

directory 指定 named 的工作目錄,後面的域配置文件、日誌文件都存放在這裏。例如上面示例中的 named.ca 就是保存在 / var/named 中

allow-query 表示允許哪些主機可以訪問當前 dns 服務,改成 any 表示任何主機都可以訪問當前的 dns 服務

recursion 如果你打算構建一個遞歸(緩存)DNS 服務器,那這裏就要設置爲 yes;如果是構建權威服務器,那這裏就應該設置爲 off。

zone 用於定義 DNS 服務器所服務的區域,其中包括區域名、區域類型和區域文件名等信息。

DNS 區域分爲兩大類: 正向查找區域和反向查找區域。

正向查找區域用於 FQDN(主機名 + 域名)到 IP 地址的映射,當 DNS 客戶端請求解析某個 FQDN 時,DNS 服務器在正向查找區域中進行查找,並返回給 DNS 客戶端對應的 IP 地址;

 反向查找區域用於 IP 地址到 FQDN 的映射,當 DNS 客戶端請求解析某個 IP 地址時,DNS 服務器在反向查找區域中進行查找,並返回給 DNS 客戶端對應的 FQDN。

file:指定區域數據庫文件的名稱,應在文件名兩邊使用雙引號。這裏只寫文件名,對應的文件保存在哪呢?其實它的保存位置是由 options 部分的 directory 選項指定的,這個選項默認是 / var/named。

type:指定區域類型。有 hint、master、slave 和 forward 等類型,分別表示根區域、主區域、輔助區域和轉發區域。hint 就是交給根的意思,說明根區域類型是緩衝服務器。

遞歸 DNS 服務器、權威 DNS 服務器

  1. 遞歸服務器

當客戶端發起上網請求時,在查詢了本機各種緩存之後沒有獲得相應的解析記錄,就會向本地 DNS 服務器發起查詢請求。

本地 DNS 服務器會先查詢自己的本地緩存,如果有結果直接返給客戶端,如果沒有結果就會代替客戶端向根 DNS 服務器、頂級域名服務器、二級域名服務器等一級一級遞歸查詢下去,最終找到域名對應的權威服務器取得結果並返回給客戶端,同時將記錄保存到本地緩存中。

小結:在整個 DNS 查詢過程中,客戶端除了在一開始向本地域名服務器(或者叫本地 DNS 服務器)發起請求外,其餘時間都是由本地域名服務器代替進行遞歸查詢。這裏的本地域名服務器就是遞歸 DNS 服務器。

  1. 權威服務器

負責最終解析域名的服務器就是權威服務器。權威服務器與遞歸服務器不同,它不負責幫助客戶端進行遞歸查詢返回解析記錄,它本身的用途就是對域名進行解析。

10T 技術限時資源大放送!包括但不限於:Linux、虛擬化、容器、雲計算、網絡、Python、Go 等。在開源 Linux 公衆號內回覆「10T」,即可免費獲取!

每個特定的域名,權威 DNS 服務器可能並不相同。這種權威 DNS 服務器只對自己所擁有的域名進行域名解析,對於自己不負責域名則無法進行解析。比如遞歸 DNS 去 taobao.com 的權威 DNS 服務器查詢 baidu.com 的域名肯定會查詢失敗。

因此遞歸解析服務器是運營商搭建,幫助所屬網絡用戶去響應的權威 DNS 服務器查詢解析結果。而權威解析服務器一般是企業自建或域名服務商建設,給購買域名的企業和個人使用,方便其對域名進行解析管理。

配置主服務器

[root@slave1 ~]# vim /etc/named.conf
options {
        listen-on port 53 { 10.0.0.62; }; //主服務器的地址
        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";
        recursing-file "/var/named/data/named.recursing";
        secroots-file "/var/named/data/named.secroots";
        allow-query { any; }; //允許任何主機可以訪問本DNS服務

        /*
         - 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; //配置成遞歸DNS服務器

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.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;
        file "named.ca";
};

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


# 在/etc/named.rfc1912.zones文件末尾添加正向解析區域和反向解析區域
[root@slave1 ~]# vim /etc/named.rfc1912.zones
......
// 在文件最後添加一個正向解析區域,並定義爲主服務器
zone "test1.com" IN {
    type master; //master表示主服務器
    file "test1.com.zone"; //指明區域解析庫文件,相對於/var/named/
};

//在文件最後添加一個反向解析區域,並定義爲主服務器
zone "0.0.10.in-addr.arpa" IN {
    type master;
    file "test1.com.local";
};

創建 test1.com.zone 解析庫文件

# 複製模板來創建區域文件
[root@slave1 ~]# cd /var/named/

# 注意:複製的時候要用-a選項,以便保持用戶擁有者等屬性信息,否則named程序無法解析。當然你也可以手動修改屬性,使複製後的文件的擁有者和所屬組都是named
[root@slave1 named]# cp -a named.localhost test1.com.zone
[root@slave1 named]# cp -a named.loopback test1.com.local

# 設置正向解析
[root@slave1 named]# cat test1.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
          0  ; serial
          1D ; refresh
          1H ; retry
          1W ; expire
          3H ) ; minimum
  NS @
  A 10.0.0.62
www IN A 10.0.0.62
ftp IN A 10.0.0.62
mail IN CNAME www

# 設置反向解析
[root@slave1 named]# cat test1.com.local
$TTL 1D
@ IN SOA test1.com. rname.invalid. (
          0  ; serial
          1D ; refresh
          1H ; retry
          1W ; expire
          3H ) ; minimum
  NS test1.com.
  A 10.0.0.62
10 IN PTR www.test1.com.
11 IN PTR ftp.test1.com.

# 重新配置本機的DNS:
[root@slave2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
......
IPADDR=10.0.0.62
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.62

啓動 named 服務:

[root@slave1 ~]# systemctl start named

# 測試一下
[root@slave1 ~]# nslookup www.test1.com
Server: 10.0.0.62
Address: 10.0.0.62#53

Name: www.test1.com
Address: 10.0.0.62
[root@slave1 named]# nslookup ftp.test1.com
Server: 10.0.0.62
Address: 10.0.0.62#53

Name: ftp.test1.com
Address: 10.0.0.62

配置從服務器

# 修改主配置文件,只改兩行,其餘保持默認即可
[root@slave2 ~]# cat /etc/named.conf
......
options {
  listen-on port 53 { 10.0.0.63; }; # ip地址改成本地地址
  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";
  recursing-file "/var/named/data/named.recursing";
  secroots-file "/var/named/data/named.secroots";
  allow-query { any; }; # 任何主機都可以訪問本地dns服務
......


# 在/etc/named.rfc1912.zones文件末尾添加正向解析區域和反向解析區域
[root@slave2 ~]# vim /etc/named.rfc1912.zones
......
zone "test1.com" IN {
        type slave;
        masters { 10.0.0.62; };
        allow-notify { 10.0.0.62; };
        file "slaves/test1.com.zone";
};

zone "0.0.10.in-addr.arpa" IN {
        type slave;
        masters { 10.0.0.62; };
        allow-notify { 10.0.0.62; };
        file "slaves/test1.com.local";
};

注意事項:從服務器的區域解析庫文件應當是從主服務器加載過來的,所以無需創建區域解析庫文件。微信搜索公衆號:信安黑客技術,回覆:黑客 領取資料 。

啓動 named 服務:

[root@slave2 ~]# systemctl start named

# 重新配置本機的DNS:
[root@slave2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
......
IPADDR=10.0.0.63
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.63

# 啓動以後,會自動生成區域解析庫文件,這兩個文件來源於主服務器
[root@slave2 ~]# ll /var/named/slaves/
total 8
-rw-r--r-- 1 named named 336 Sep 5 20:02 test1.com.local
-rw-r--r-- 1 named named 319 Sep 5 20:02 test1.com.zone

# 測試驗證
[root@slave2 ~]# nslookup www.test1.com
Server: 10.0.0.63
Address: 10.0.0.63#53

Name: www.test1.com
Address: 10.0.0.62

[root@slave2 ~]# nslookup ftp.test1.com
Server: 10.0.0.63
Address: 10.0.0.63#53

Name: ftp.test1.com
Address: 10.0.0.62

客戶端驗證

# 配置DNS:客戶端需要配置多個dns,我們這裏配置主從dns的地址
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
......
IPADDR=10.0.0.61
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.62    
DNS2=10.0.0.63

# 重啓網絡使配置生效
[root@master ~]# systemctl restart network

[root@master ~]# nslookup www.test1.com
Server: 10.0.0.62
Address: 10.0.0.62#53

Name: www.test1.com
Address: 10.0.0.62

[root@master ~]# nslookup ftp.test1.com
Server: 10.0.0.62
Address: 10.0.0.62#53

Name: ftp.test1.com
Address: 10.0.0.62

主從一同工作,在客戶端會配有多個 DNS 地址,如果第一個 DNS 地址無法解析,那麼第二 DNS 地址也是無法解析的,當第一個 DNS 地址聯繫不上時(宕機)纔會聯繫第二個 DNS 地址並尋求解析。

故障測試

# 停止master DNS
[root@slave1 ~]# systemctl stop named

# 到客戶端上去驗證
[root@master ~]# nslookup www.test1.com
Server: 10.0.0.63
Address: 10.0.0.63#53

Name: www.test1.com
Address: 10.0.0.62

通過上面的實驗我們可以發現,停掉 master DNS 服務以後,客戶端還是可以繼續解析到域名, 即從 DNS 已經開始啓用了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/H2v9-eLQD6aXnHJjGV77uw