1. DNS服務器分類
DNS服務器從業務邏輯上一般分爲權威服務器與緩存服務器。權威服務器直接負責對域名進行解析,各種記錄,比如A記錄,CNAME記錄就是寫在權威服務器的配置文件;緩存服務器負責向上級DNS服務器轉發客戶端的查詢請求,同時將查詢結果進行緩存,緩存服務器上不進行域名解析的配置。
1.1 權威服務器
權威服務器分爲主服務器,從服務器,隱形服務器。
1.1.1 主服務器
Master (Primary) Name Servers,即主服務器,負責加載本地DNS配置文件。
配置方法:
在named.conf的區域配置中進行聲明:
// example.com fragment from named.conf
// defines this server as a zone master
zone "example.com" in{
type master;
file "pri.example.com";
};
1.1.2 從服務器
Slave Name Servers,即從服務器,使用區域傳輸檢索區域的權威服務器。
從服務器通過區域傳輸(zone transfer)從主服務器或其他從服務器獲得區域數據。主服務器與從服務器的主要區別就是:從服務器通過區域傳輸獲取其區域數據,而主服務器從本地文件系統獲取其區域數據。前面兩句話好像有點囉嗦了。
那麼,什麼情況下,一臺從服務器會成爲其他從服務器的區域傳輸源呢?
如果你想隱藏主服務器,那麼就需要將從服務器放置在防火牆public區域來對外提供服務。爲了讓服務存在彈性,可以使用2臺從服務器。第2臺從服務器可以從主服務器同步數據,也可以從第1臺從服務器同步數據。當第1臺從服務器與主服務器同步數據後,默認會向第2臺從服務器發送NOTIFY消息開始配置同步,這就導致了一點點延時。
從屬服務器必須定期發送刷新查詢,以確定區域內容是否已更新。通過發送對該區域的SOA記錄的查詢並檢查序列號是否已更新來完成此操作。
配製方法:
從服務器中namd.conf配置如下
// example.com fragment from named.conf
// defines this server as a zone slave
zone "example.com" in{
type slave;
file "sec/sec.example.com";
masters {192.168.23.17;};
};
1.1.3 隱身服務器
Stealth Name Server,又名DMZ 服務器或 Hidden Master服務器。隱身服務器被定義爲沒有出現在該域的任何公共可見 NS記錄中的名稱服務器。隱身服務器可以大致定義爲具有以下特徵:
1.某組織需要一個公共DNS才能訪問其公共服務,例如Web,郵件,ftp等。
2.某組織不希望整個世界通過查詢或DNS服務而威脅到其內部主機。
上圖爲隱身服務器的拓撲。Public DNS提供權威響應,包括公共可見的服務,它不得接受來自隱身服務器的傳輸數據。
典型的Public DNS配置如下:
; public zone master file
; provides minimal public visibility of external services
example.com. IN SOA ns.example.com. root.example.com. (
2003080800 ; se = serial number
3h ; ref = refresh
15m ; ret = update retry
3w ; ex = expiry
3h ; min = minimum
)
IN NS ns1.example.com.
IN NS ns2.example.com.
IN MX 10 mail.example.com.
ns1 IN A 192.168.254.1
ns2 IN A 192.168.254.2
mail IN A 192.168.254.3
www IN A 192.168.254.4
ftp IN A 192.168.254.5
隱身服務器配置爲提供可見的內部和外部服務,提供遞歸查詢和所有其他方式的其他服務。配置文件如下:
; private zone master file used by stealth server(s)
; provides public and private services and hosts
example.com. IN SOA ns.example.com. root.example.com. (
2003080800 ; se = serial number
3h ; ref = refresh
15m ; ret = update retry
3w ; ex = expiry
3h ; min = minimum
)
IN NS ns1.example.com.
IN NS ns2.example.com.
IN MX 10 mail.example.com.
; public hosts
ns1 IN A 192.168.254.1
ns2 IN A 192.168.254.2
mail IN A 192.168.254.3
www IN A 192.168.254.4
ftp IN A 192.168.254.5
; private hosts
joe IN A 192.168.254.6
bill IN A 192.168.254.7
fred IN A 192.168.254.8
....
accounting IN A 192.168.254.28
payroll IN A 192.168.254.29
從配置文件可見,隱身服務器是出於安全需求而誕生的。
1.2 緩存服務器
Caching Name Servers,即緩存服務器。緩存服務器從另一臺服務器(主服務器)獲取信息來響應主機查詢,然後將數據緩存到本地。在第二次或更多次請求相同數據時,緩存服務器將使用其本地緩存的數據進行響應,直到響應的生存時間(TTL)值到期爲止,此時緩存服務器將刷新來自區域主服務器的數據。
如果緩存服務器直接從其區域主服務器獲取數據,則它的響應爲“權威”;如果數據是從其緩存中提供的,則響應爲“非權威”。
上圖中,2爲遞歸查詢,3,4,5爲迭代查詢。可以看出遞歸查詢與迭代查詢的不同:遞歸查詢是接受客戶端的查詢委託,並將最終的查詢結果返回給客戶端;迭代查詢只能根據每次的查詢結果逐步推導出結果。舉個不恰當的例子,相當於去飯店點了一個宮保雞丁,點菜的過程類似遞歸查詢,客戶提出需求,飯店反饋一盤已經做好的菜;廚師按照菜譜到菜市場買雞胸肉,辣椒,胡蘿蔔,再回到廚房加工好,類似迭代查詢。如果宮保雞丁做多了,剛好賣給第二個人,第三個人……和緩存服務器很像嘛。唉,餓了。
典型配置如下,注意recursion yes一定要開啓:
// options section fragment of named.conf
// recursion yes is the default and may be omitted
options {
directory "/var/named";
version "not currently available";
recursion yes;
};
// zone section
....
// the DOT indicates the root domain = all domains
zone "." IN {
type hint;
file "root.servers";
};
在生產環境中,爲了更加規範和安全,權威服務器和緩存服務器應該使用不同主機。當然,在實驗中就無所謂了,使用1臺主機就可以了。
2. bind-chroot服務配置
2.1 安裝
操作系統爲centos7,DNS服務器IP爲192.168.20.160。
按照https://linux.cn/article-4735-1.html,按部就班執行可以了。需要注意的地方有兩點:
1.因爲是chroot,所以自始至終需要修改的是/var/named/chroot/etc/named.conf,跟/etc/named.conf沒關係。/etc/namd.conf不需要修改。
2.要注意/var/named/chroot/etc/named.conf的配置,這兩個地方如果不配置爲any,DNS服務會因爲沒有權限而無法使用:
listen-on port 53 { any; };
...
allow-query { any; };
安裝包,創建文件/文件夾
# yum install bind-chroot bind -y
# cp -R /usr/share/doc/bind-*/sample/var/named/* /var/named/chroot/var/named/
# touch /var/named/chroot/var/named/data/cache_dump.db
# touch /var/named/chroot/var/named/data/named_stats.txt
# touch /var/named/chroot/var/named/data/named_mem_stats.txt
# touch /var/named/chroot/var/named/data/named.run
# mkdir /var/named/chroot/var/named/dynamic
# touch /var/named/chroot/var/named/dynamic/managed-keys.bind
# chmod -R 777 /var/named/chroot/var/named/data
# chmod -R 777 /var/named/chroot/var/named/dynamic
# cp -p /etc/named.conf /var/named/chroot/etc/named.conf
修改named.conf文件
# vi /var/named/chroot/etc/named.conf
zone "example.local" {
type master;
file "example.local.zone";
};
zone "20.168.192.in-addr.arpa" IN {
type master;
file "192.168.20.zone";
};
配置域文件/var/named/chroot/var/named/example.local.zone
;
; Addresses and other host information.
;
$TTL 86400
@ IN SOA example.local. hostmaster.example.local. (
2014101901 ; Serial
43200 ; Refresh
3600 ; Retry
3600000 ; Expire
2592000 ) ; Minimum
; Define the nameservers and the mail servers
IN NS ns1.example.local.
IN NS ns2.example.local.
IN A 192.168.20.244
IN MX 10 mx.example.local.
centos7 IN A 192.168.20.244
mx IN A 192.168.20.160
ns1 IN A 192.168.20.244
ns2 IN A 192.168.20.160
配置域文件/var/named/chroot/var/named/192.168.20.zone
;
; Addresses and other host information.
;
$TTL 86400
@ IN SOA example.local. hostmaster.example.local. (
2014101901 ; Serial
43200 ; Refresh
3600 ; Retry
3600000 ; Expire
2592000 ) ; Minimum
20.168.192.in-addr.arpa. IN NS centos7.example.local.
244.20.168.192.in-addr.arpa. IN PTR mx.example.local.
160.20.168.192.in-addr.arpa. IN PTR ns1.example.local.
244.20.168.192.in-addr.arpa. IN PTR ns2.example.local.
初始化配置並啓動
# /usr/libexec/setup-named-chroot.sh /var/named/chroot on
# systemctl stop named
# systemctl disable named
# systemctl start named-chroot
# systemctl enable named-chroot
2.2 驗證
修改服務器DNS配置:
# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.20.160
查詢結果如下:
# dig example.local
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-17.P2.el8_0.1 <<>> example.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36898
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: c76ababfcccd3ebecc4dc24b5db15e776846d6b67e7b735a (good)
;; QUESTION SECTION:
;example.local. IN A
;; ANSWER SECTION:
example.local. 86400 IN A 192.168.20.244
;; AUTHORITY SECTION:
example.local. 86400 IN NS ns1.example.local.
example.local. 86400 IN NS ns2.example.local.
;; ADDITIONAL SECTION:
ns1.example.local. 86400 IN A 192.168.20.244
ns2.example.local. 86400 IN A 192.168.20.160
;; Query time: 3 msec
;; SERVER: 192.168.20.160#53(192.168.20.160)
;; WHEN: Thu Oct 24 16:19:03 CST 2019
;; MSG SIZE rcvd: 154
因爲同時開啓了緩存服務器的選項,所以也可以DNS到其他域名:
# dig www.baidu.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-17.P2.el8_0.1 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19532
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 6
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 300f7df1701700c36fad4aaa5db15ed9c93066602704356e (good)
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 300 IN A 220.181.38.150
www.a.shifen.com. 300 IN A 220.181.38.149
;; AUTHORITY SECTION:
a.shifen.com. 1199 IN NS ns4.a.shifen.com.
a.shifen.com. 1199 IN NS ns1.a.shifen.com.
a.shifen.com. 1199 IN NS ns3.a.shifen.com.
a.shifen.com. 1199 IN NS ns5.a.shifen.com.
a.shifen.com. 1199 IN NS ns2.a.shifen.com.
;; ADDITIONAL SECTION:
ns5.a.shifen.com. 1199 IN A 180.76.76.95
ns3.a.shifen.com. 1199 IN A 112.80.255.253
ns2.a.shifen.com. 1199 IN A 220.181.33.32
ns1.a.shifen.com. 1199 IN A 61.135.165.224
ns4.a.shifen.com. 1199 IN A 14.215.177.229
;; Query time: 1567 msec
;; SERVER: 192.168.20.160#53(192.168.20.160)
;; WHEN: Thu Oct 24 16:20:41 CST 2019
;; MSG SIZE rcvd: 299
參考文檔
https://bind9.readthedocs.io/en/latest/
http://www.zytrax.com/books/dns/ch4/
https://www.isc.org/bind/
https://datatracker.ietf.org/doc/rfc1996
https://linux.cn/article-4735-1.html