1. 程式人生 > >Centos DNS服務(二)-bind主從配置與基於TSIG加密的動態更新

Centos DNS服務(二)-bind主從配置與基於TSIG加密的動態更新

保持 none ase mas 分號 摘要 tp服務器 pro 命令

DNS的主從配置

DNS從服務器也叫輔服DNS服務器,如果網絡上某個節點只有一臺DNS服務器的話,首先服務器的抗壓能力是有限的,當壓力達到一定的程度,服務器就可能會宕機罷工,
其次如果這臺服務器出現了硬件故障那麽服務器管理的區域的域名將無法訪問。為了解決這些問題,最好的辦法就是使用多個DNS服務器同時工作,
並實現數據的同步,這樣兩臺服務器就都可以實現域名解析操作。

從服務器要點

1、應該為一臺獨立的名稱服務器
2、主DNS服務器的區域解析庫文件中必須有一條NS記錄指向從服務器
3、從DNS服務器只需要定義區域,而無須提供解析庫文件;解析庫文件自動生成文件放置於/var/named/slaves/目錄中,並且有寫權限。
4、主DNS和輔助DNS服務器設置區域復制權限。防止使用 dig -t axfr hunk.tech 抓取信息。
5、主DNS和輔助DNS服務器時間應該同步,可通過ntp進行;
6、bind程序的版本應該保持一致;否則,應該輔助DNS版本高,主DNS版本低
定義從區域的方法:
zone "ZONE_NAME" IN {
type slave;
masters { 主DNS服務器IP; };
file "slaves/ZONE_NAME.zone";
};

主DNS服務器架設好後,輔助的DNS服務器的架設就相對簡單多了。

很重要的一點:主從服務器時間不同步的話,則會導致各種意想不到的問題發生。因此,先配置NTP時間同步吧。

NTP服務器網址http://www.pool.ntp.org/zone/cn
ntp.sjtu.edu.cn 202.120.2.101 (上海交通大學網絡中心NTP服務器地址)
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org

自行選擇快而穩定的。

創建從DNS步驟

1.記錄下主DNS服務器的/etc/named.rfc1912.zones中需要進行主從設置的區域信息

2.在輔助的DNS服務器的/etc/named.rfc1912.zones文件,添加需要進行同步的區域記錄,這兩個記錄是主DNS服務器配置文件裏已經存在的記錄。

zone "hunk.tech" IN {
        type slave;                     #type類型修改為slave
        masters { 192.168.4.200; }        #定義主DNS服務器IP
        file "slaves/named.hunk.tech";  #定義輔助DNS數據庫文件
};

zone "4.168.192.in-addr.arpa" IN {
        type slave;                     #type類型修改為slave
        masters { 192.168.4.200; };        #定義主DNS服務器IP
        file "slaves/named.192.168.4";  #定義輔助DNS數據庫文件
};

3. 主DNS服務器設置允許輔助DNS服務器作區域傳送

在主DNS的/etc/named.conf全局屬性中options {}
添加 allow-transfer { 允許的輔助DNS服務器IP; };防止未授權的區域復制。
如:allow-transfer { 192.168.4.201; } ;     
options {
                allow-transfer { 192.168.4.201; } ;
            }

4. 輔助DNS服務器設置禁止從本服務器作區域傳送

輔助DNS服務器/etc/named.conf全局屬性中options {}
添加 allow-transfer { none; };視情況不再允許未授權區域復制。
allow-transfer  { none; };

5.使用命令檢查主配置文件和區域數據庫

6.重新加載主配置文件和區域數據庫文件

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
如果報以上錯誤,請重新啟動服務#service named restart

7.測試

會自動生成區域文件
#ll ../slaves/
-rw-r--r--. 1 named named 481 Jan 19 02:25 named.192.168.4
-rw-r--r--. 1 named named 536 Jan 19 02:25 named.hunk.tech

生成的文件的格式比較規範

$ORIGIN .
$TTL 600        ; 10 minutes
hunk.tech               IN SOA  6-DNS-1.hunk.tech. admin.hunk.tech. (
                                0          ; serial
                                7200       ; refresh (2 hours)
                                600        ; retry (10 minutes)
                                86400      ; expire (1 day)
                                10800      ; minimum (3 hours)
                                )
                        NS      6-DNS-1.hunk.tech.
                        NS      6-DNS-2.hunk.tech.
                        MX      10 mail.hunk.tech.
$ORIGIN hunk.tech.
*                       A       192.168.0.206
6-DNS-1                 A       192.168.4.200
6-DNS-2                 A       192.168.4.201
6-WEB-1                 A       192.168.4.205
                        A       192.168.4.206
7-WEB-2                 A       192.168.4.206
mail                    A       192.168.4.205
www                     CNAME   6-WEB-1

其他情況

A.把輔助DNS的區域文件刪除了
    1.重啟輔助DNS的named服務後可以恢復
    2.主DNS服務器版本更新並重新加載時,輔助DNS會同步生成文件
    3.rndc retransfer 區域名稱
    如:rndc retransfer 4.168.192.in-addr.arpa
        rndc retransfer hunk.tech
B.版本更新後,只要reload,會立即發生同步    

C.輔助DNS輔助器生成的區域文件,Centos 6 可以使用cat等文本工具查看,Centos 7 已經使用data格式存放,
    需要使用這個命令配合參數查看 #named-compilezone -f raw -o - zone name  zone文件

D.端口使用。
查詢單條記錄時,使用UDP 53
區域傳輸的時候 需要使用TCP 53 和 UDP 53

基於TSIG加密的主從設置

Transaction signatures(TSIG)通常是一種確保DNS消息安全,並提供安全的服務器與服務器之間通訊(通常用在主從服務器之間)的機制。

TSIG可以保護以下類型的DNS服務器:Zone區域傳送、Notify、動態更新、遞歸查詢郵件。

TSIG適用於BIND v8.2及以上版本。TSIG使用共享秘密和單向散列函數來驗證的DNS信息。

TSIG 可確認 DNS 之信息是由某特定 DNS Server 所提供。通常TSIG 應用於域名服務器間的區帶傳輸,確保數據不會被篡改或產生 dns spoofing

1. 按照上文配置好主從並測試沒問題後才執行以下步驟操作

dnssec-keygen  
DNSSEC 密鑰生成工具

-a 選擇加密算法
    對於DNSSEC 值必須是 RSAMD5, RSASHA1(強制實現), DSA(推薦), NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST
    對於TSIG/TKEY, 值必須是DH (Diffie Hellman), HMAC-MD5(強制實現),HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, HMAC-SHA512

-b 指定密鑰中的位數。
    密鑰大小的選擇取決於使用的算法。RSAMD5 和 RSASHA1 密鑰必須在 512 和 2048 位之間。
    Diffie-Hellman 密鑰必須在 128 和 4096 位之間。DSA 密鑰必須在 512 和 1024 位之間,並且必須是 64 的整數倍。HMAC-MD5 密鑰必須在 1 位和 512 位之間。

-f  在 KEY/DNSKEY 記錄的標誌字段中設置指定的標誌。唯一識別的標誌是 KSK(Key Signing Key,密鑰簽名密鑰)DNSKEY。

-h 列出 dnssec-keygen 的選項和參數的簡短摘要

-n 指定密鑰的所有者類型。nametype 的值必須是 ZONE(對於 DNSSEC 區域密鑰 (KEY/DNSKEY))、HOST 或 ENTITY(對於與主機相關的密鑰 (KEY))、USER(對於與用戶相關的密鑰 (KEY))或 OTHER (DNSKEY)。這些值不區分大小寫。缺省值是 ZONE(用於生成 DNSKEY)

-r 指定隨機源,有助與生成速度。如果操作系統不提供 /dev/random 或等效設備,則缺省的隨機源是鍵盤輸入.

-K(大寫) <directory>: 設置要寫入的密鑰文件的目錄

2. 在主DNS服務器中生成密鑰

#dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -K /root/dnskey/ -r /dev/urandom hunk-tech-key

選項解讀:
-a HMAC-SHA512  :采用HMAC-SHA512加密算法
-b 512          :生成的密鑰長度為512位
-n HOST         :指定密鑰的所有者類型為主機類型
-K /root/dnskey/:指定生成密鑰的目錄
-r /dev/urandom :指定生成密鑰使用的隨機數來源,否則將會讓你在鍵盤上敲入隨機字符,導致會非常慢。
hunk-tech-key   :密鑰的名稱

之後,會在指定的目錄/root/dnskey/生成2個文件
Khunk-tech-key.+165+40008.key     > 公鑰
Khunk-tech-key.+165+40008.private > 私鑰

內容類似如下:
#cat Khunk-tech-key.+165+40008.key 

hunk-tech-key. IN KEY 512 3 165 MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesP aVnUyv6XarzJ3ml1H2gCgR0cDf3TGg==

#cat Khunk-tech-key.+165+40008.private 

Private-key-format: v1.3
Algorithm: 165 (HMAC_SHA512)
Key: MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesPaVnUyv6XarzJ3ml1H2gCgR0cDf3TGg== (這一行內容等會用到)
Bits: AAA=
Created: 20180206083046
Publish: 20180206083046
Activate: 20180206083046

3. 在主DNS服務器上創建密鑰驗證文件

#vim /etc/named/dns-key

key "hunk-tech-key" {   > 這個雙引號內填寫的字符串可以是任意的。這個字符串主從必須要一致。這個例子使用dnssec-keygen生成時指定的密鑰的名稱
        algorithm HMAC-SHA512;   > 這個加密算法填寫的是dnssec-keygen生成時指定的加密算法
        secret "MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesPaVnUyv6XarzJ3ml1H2gCgR0cDf3TGg==";  > 這裏填寫的生成密鑰中K*.private文件中的key值。註意雙引號和分號
};

4. 修改密鑰驗證文件所有者與權限

#chown root:named /etc/named/dns-key
#chmod 640 /etc/named/dns-key

5. 修改主DNS服務器的主配置文件

# vim /etc/named.conf

include "/etc/named/dns-key"; 將此行內容添加至文件尾部

在全局options配置中修改以下內容,沒有的話就添加
        dnssec-enable yes;
        dnssec-validation yes;
        allow-update { localhost;192.168.7.253; };                    > 定義僅有本機和從DNS才可以動態更新
        allow-transfer { localhost;192.168.7.253; };    > 定義只允許本機和從DNS主機才能使用區域傳送
        notify yes;

以下行不在全局定義的範圍內,不要誤寫入options的{ }中
server 192.168.7.253 { keys hunk-tech-key; };       > 定義與從dns服務器使用密鑰通訊

6. 導入密鑰驗證文件到從DNS服務器

為了確保傳輸的文件沒有被破壞,請使用md5sum之類的哈希算法進行校驗
#md5sum /etc/named/dns-key > /etc/named/md5sum
#scp /etc/named/* 192.168.7.253:/etc/named/
dns-key                               100%
md5sum                                100%

在從DNS服務上驗證文件的完整性
#md5sum -c md5sum
/etc/named/dns-key: OK

7. 修改密鑰驗證文件所有者與權限

#chown root:named /etc/named/dns-key
#chmod 640 /etc/named/dns-key

8. 修改從DNS服務器的主配置文件

# vim /etc/named.conf

include "/etc/named/dns-key"; 將此行內容添加至文件尾部

在全局options配置中修改以下內容,沒有的話就添加
        dnssec-enable yes;
        dnssec-validation yes;
        allow-update { none; };             > 不允許客戶端動態更新
        allow-transfer { localhost; };      > 定義只允許本機才能使用區域傳送

如果只想要在某個zone中使用密鑰傳送,按以下寫法即可
        zone "hunk.tech" {
                type slave;
                masters { 192.168.7.254 key hunk-tech-key; };

如果有多個zone中需要使用密鑰傳送,保持zone的設置不更改,只需要定義一個全局的server配置項即可
server 192.168.7.254 { keys hunk-tech-key; };

9. 在主DNS服務上生效配置

#named-checkconf
#rndc reload
server reload successful

如果有情況的話,可以嘗試重啟服務

10. 在從DNS服務上生效配置

#named-checkconf
#rndc reload
server reload successful

如果有情況的話,可以嘗試重啟服務

11. 測試TSIG

在從DNS服務器
#dig -t axfr hunk.tech -k /etc/named/dns-key @192.168.7.254    > -k 指定密鑰

從日誌和傳送過來的區域中可以看出來

技術分享圖片
技術分享圖片

使用專用的動態更新工具來測試

#nsupdate -k /etc/named/dns-key 
> server 192.168.7.254
> zone hunk.tech
> update add 9.hunk.tech 600 A 9.9.9.9
> send
> quit

在主DNS服務器日誌中可以看到

client 192.168.7.254#42738: view net_192: signer "hunk-tech-key" approved
client 192.168.7.254#42738: view net_192: updating zone ‘hunk.tech/IN‘: adding an RR at ‘9.hunk.tech‘ A

在從DNS服務器日誌中可以看到

transfer of ‘hunk.tech/IN/net_192‘ from 192.168.7.254#53: connected using 192.168.7.253#34324
zone hunk.tech/IN/net_192: transferred serial 61: TSIG ‘hunk-tech-key‘
transfer of ‘hunk.tech/IN/net_192‘ from 192.168.7.254#53: Transfer completed: 1 messages, 11 records, 428 bytes, 0.006 secs (71333 bytes/sec)

在從DNS服務器傳送過來的區域中可以看到序列為61的更新記錄

技術分享圖片

最後一個測試,進入從DNS的slaves目錄把所有區域刪除,不用擔心,前面講過重啟從DNS服務後,會立即同步主DNS的區域文件。

#rm -rf *
#ls
#service named restart
Stopping named: .                                          [  OK  ]
Starting named:                                            [  OK  ]
#ls
named.192.168.7  named1.hunk.tech

至此,TSIG已經正常工作了

動態DNS更新工具nsupdate

可以向DNS服務器提交更新記錄的請求,它可以從區文件中添加或刪除資源記錄,而不需要手動進行編輯zone文件

必須的條件:指定的zone語句塊或全局中添加:allow-update { any; }; 或 allow-update { IP範圍; };

語法:
nsupdate [-dD] [-L level] [-l][-g | -o | -y keyname:secret | -k keyfile] [-v] [filename]

-d 調試模式。
-k 從keyfile文件中讀取密鑰信息。
-y keyname是密鑰的名稱,secret是以base64編碼的密鑰。
-v 使用TCP協議進行nsupdate.默認是使用UDP協議。
filename:可以從終端或文件中讀取命令.每個命令一行.一個空行或一個”send”命令,則會將先前輸入的命令發送到DNS服務器上
指定密鑰
# nsupdate -k /etc/named/dns-key

更新命令
update delete|add {domain-name} [ttl] [class] [type [data...]]
class不指定的話,默認是IN
ttl可以單獨寫一行,後面的行繼承此值
#nsupdate
> server 192.168.7.254     > 指定動態更新的DNS服務器
> zone hunk.tech            > 指定更新zone
> update add hunk.tech 600 IN A 192.168.7.204 >添加A記錄
> update delete hunk.tech A 192.168.7.204     >刪除A記錄
> send                  > 發送更新指令到DNS服務器

從文件讀取指令
#nsupdate update_dns.txt
文件中的指令與交互式是一樣的,一行一條指令

要求domain-name中不存在任何資源記錄
prereq nxdomain domain-name

要求domain-name存在,並且至少包含有一條記錄
prereq yxdomain domain-name

要求domain-name中沒有指定類別的資源記錄
prereq nxrrset domain-name [ class ] type

要求存在一條指定的資源記錄.類別和domain-name必須存在
prereq yxrrset domain-name [ class ] type

Centos DNS服務(二)-bind主從配置與基於TSIG加密的動態更新