服務部署 - DNS域名解析服務配置
目錄

一、DNS
1.1 DNS 服務介紹
DNS(Domain Name System,域名系統),因特網上作為域名和 IP 地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。
- DNS 協議運行在
UDP和TCP之上,使用53號端口 - 其中在DNS解析查詢時用到
UDP協議,而在主從傳遞區域數據庫文件時,用到TCP協議
1.2 互聯網域名結構
一般結構
- 主機名.二級域名.頂級域名.根
- www.wsescape.com.
管理方式
Internet的頂級域名由 Internet 網絡協會域名注冊查詢負責網絡地址分配的委員會進行登記和管理- 它還為 Internet 的每一臺主機分配唯一的
IP地址

1.3 DNS 的功能
每個 IP 地址都可以有一個主機名,主機名由一個或多個字符串組成,字符串之間用小數點隔開。有了主機名,就不要死記硬背每臺 IP 設備的 IP 地址,只要記住相對直觀有意義的主機名就行了。
主機名到 IP 地址映射的兩種方式
- 靜態映射
/etc/hosts文件
在每臺設備上都有主機到IP的映射關系,只供此設備使用
- 動態映射
/etc/resolv.conf文件
指通過DNS服務器配置主機到IP的映射關系
# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # cat /etc/resolv.conf nameserver 172.16.242.2
解析方式 - FQDN(Full Qualified Domain Name)
- 正向 ==> FQDN --> IP
- 反向 ==> IP --> FQDN
- 權威
- 非權威
解析順序
- 在解析域名時,首先采用
靜態域名解析的方法,如果靜態域名解析不成功,再采用動態域名解析的方法

一次完整的查詢請求經過的流程

1.4 技術實現
DNS通過允許一個名稱服務器把他的一部分名稱服務,眾所周知的zone,委托給子服務器而實現了一種層次結構的名稱空間,成為子域授權機制。
DNS還提供了一些額外的信息,例如系統別名、聯系信息以及哪一個主機正在充當系統組或域的郵件樞紐- 任何一個使用
IP的計算機網絡可以使用DNS來實現他自己的私有名稱系統。
實現 DNS 的軟件
- BIND
- DJBDNS
- MaraDNS
- Name Server Daemon
- PowerDNS
- Dnsmasq
DNS 查詢類型
- 迭代查詢
- 遞歸查詢


1.5 DNS 的類型
- (1)Primary DNS Server(Master)
一個域的主服務器保存著該域的zone配置文件,該域所有的配置、更改都是在該服務器上進行,本篇隨筆要講解的也是如何配置一個域的主DNS服務器。
- (2)Secondary DNS Server(Slave)
域從服務器一般都是作為冗余負載使用,一個域的從服務器是從該域的主服務器上抓取zone配置文件,從服務器不會進行任何信息的更改,zone配置文件的修改只能在主DNS服務器上進行,所有的修改都有主服務器同步。
- (3)Caching only Server(Cache)
DNS緩存服務器不存在任何的zone配置文件,僅僅依靠緩存來為客戶端提供服務,通常用于負載均衡及加速訪問操作。
- (4)轉發服務器
只負責轉發功能
注解說明:
主 DNS 服務器
- 維護所負責解析的區域內解析庫服務器
- 解析庫由管理維護,可以是手工也可以是自動的
- 通知機制
- 一旦主 DNS 服務器解析庫發生改變會立即通知從服務器
從 DNS 服務器
- 從主DNS服務器或其他的從DNS服務器那里復制(區域傳送)一份解析庫
序列號- 來表示解析庫的版本號
- 前提是,主服務器解析庫內容發生改變,其序列遞增
刷新時間- 從服務器從主服務器請求同步解析庫的時間間隔
重試時間- 從服務器從服務器請求同步解析庫失敗的時候,再次嘗試的時間間隔
過期時長- 從服務器始終聯系不到主服務器時,多久后放棄從服務器角度,停止提供服務
區域傳送
全量傳送
- 傳送整個解析庫
增量傳送
- 傳送解析庫變化的那部分內容
1.6 資源記錄類型
DNS 系統中,常見的資源記錄類型:
主機記錄(A記錄)- FQDN --> IP
- A記錄是用于名稱解析的重要記錄,它將特定的主機名映射到對應主機的IP地址上
指針記錄(PTR記錄)- IP --> FQDN
- 引導至一個規范名稱(Canonical Name),最常用來運行反向DNS查找
權威記錄的起始(SOA記錄)- 一個區域解析庫有且僅能有一個SOA記錄,而必須為解析庫的第一條記錄
名稱服務器記錄(NS記錄)
專用于標明當前區域的DNS服務器
別名記錄(CNAME記錄)
CNAME記錄用于將某個別名指向到某個A記錄上,這樣就不需要再為某個新名字另外創建一條新的A記錄
MX 記錄(MX記錄)
引導域名到該域名的郵件傳輸代理(Message Transfer Agents)列表
IPv6 主機記錄(AAAA記錄)- FQDN --> IP
- 與 A 記錄對應,用于將特定的主機名映射到一個主機的IPv6地址。
服務位置記錄(SRV記錄)
用于定義提供特定服務的服務器的位置,如主機hostname,端口port
NAPTR 記錄
它提供了正則表達式方式去映射一個域名。NAPTR記錄非常著名的一個應用是用于ENUM查詢。

1.7 資源記錄格式
語法
name [TTL] IN rr_type value
- (1) TTL如果從全局繼承可以省略,為緩存時長
- (2)IN表示Internet
- (3)rr_type表示資源記錄類型
- (4) @可用于引用當前區域的名字
- (5) 同一個名字可以通過多條記錄定義多個不同的值,此時DNS服務器會以輪詢方式響應
- (6) 同一個值也可能有多個不同的定義名字,通過多個不同的名字指向同一個值進行定義,此僅表示通過多個不同的名字可以找到同一個主機而已
SOA
name: 當前區域的名字,例如wsescape.com.value: 有多部分組成:- (1) 當前區域的主DNS服務器的
FQDN,也可以使用當前區域的名字 - (2) 當前區域管理員的郵箱地址,但地址中不能使用@符號,一般用.替換,例如linuxmail.wsescape.com
- (3) 主從服務協調屬性的定義以及否定的答案的統一的
TTL
# 86400為TTL值,單位為秒鐘 # 主DNS服務器地址為ns.wsescape.com. # 郵箱地址為nsadmin.wsescape.com. # 第一版為2016052201,標識版本號 wsescape.com.86400INSOAns.nsadmin.wsescape.com.( 2016052201 ;序列號 2H ;刷新時間,2小時 10M;重試時間,10分鐘 1W;過期時間,一周 1D;否定答案的TTL值,一天 )
NS
name: 當前區域的名字value: 當前區域的某DNS服務器的名字,例如ns.wsescape.com.- 注意:
- (1) 相鄰的兩個資源記錄的
name相同時,后續的可省略 - (2) 對
NS記錄而言,任何一個NS記錄后面的服務器名字,都應該在后續有一個A記錄
# 一個區域可以有多個NS記錄 # ns1.wsescape.com.和ns2.wsescape.com.都應該在后續有一個A記錄 wsescape.com.INNS ns1.wsescape.com. wsescape.com.INNS ns2.wsescape.com.
MX
name: 當前區域的名字value: 當前區域的某郵件服務器(smtp服務器)的主機名- (1)一個區域內,MX記錄可以有多個
- (2)但每個記錄的value之前應該有一個數字(0-99),表示此服務器的優先級
- (3)數字越小優先級越高
- 注意
- (1) 相鄰的兩個資源記錄的
name相同時,后續的可省略 - (2) 對
MX記錄而言,任何一個MX記錄后面的服務器名字,都應該在后續有一個A記錄
# mx1.wsescape.com.和mx2.wsescape.com.都應該在后續有一個A記錄 wsescape.com.IN MX 10 mx1.wsescape.com. INMX 20 mx2.wsescape.com.
A
name: 某主機的FQDN,例如www.wsescape.com.value: 主機名對應主機的 IP 地址;- 注意
- 避免用戶寫錯名稱時給錯誤答案,可通過泛域名解析進行解析至某特定地址
# 輪詢 www.wsescape.com.IN A1.1.1.1 www.wsescape.com.IN A 1.1.1.2 # 一個主機有多個名稱而已 mx1.wsescape.com.IN A 1.1.1.3 mx2.wsescape.com. IN A 1.1.1.3 # 避免用戶寫錯名稱時給錯誤答案,可通過泛域名解析進行解析至某特定地址 *.wsescape.com.IN A 1.1.1.4 wsescape.com.IN A 1.1.1.4
AAAA
與 `A` 記錄類似,這是只是表示IPv6地址而已 # 輪詢 www.wsescape.com.IN AAAA1.1.1.1 www.wsescape.com.IN AAAA 1.1.1.2 # 一個主機有多個名稱而已 mx1.wsescape.com.IN AAAA 1.1.1.3 mx2.wsescape.com. IN AAAA 1.1.1.3 # 避免用戶寫錯名稱時給錯誤答案,可通過泛域名解析進行解析至某特定地址 *.wsescape.com.IN AAAA 1.1.1.4 wsescape.com.IN AAAA 1.1.1.4
PTR
name: 這里的name表示的是IP地址IP地址有特定格式,把IP地址反過來寫,如果是1.2.3.4需要寫作4.3.2.1- 還有特定后綴
in-addr.arpa.,完整寫法為4.3.2.1.in-addra.arpa. value: 這里的value值為FQDN- 注意
- 網絡地址及后綴可省略,主機地址依然需要反著寫
# 實例 4.3.2.1.in-addr.arpa.INPTRwww.wsescape.com. # 如果3.2.1是網絡地址簡寫成為 4 IN PTRwww.wsescape.com. # 如果2.1是網絡地址簡寫成為 4.3 IN PTRwww.wsescape.com.
CNAME
name: 別名的FQDNvalue: 正工名字的FQDN
web.escapelife.com.IN CNAME www.escapelife.com.
1.8 個人使用
子域授權就是每個域的名稱服務器,都是通過其上級名稱服務器在解析庫進行授權
類似根域授權tld
.com.INNS ns1.com. .com. IN NSns2.com. ns1.com.INA 2.2.2.1 ns2.com. INA2.2.2.2
這里以wsescape.com為例
# wsescape.com. 在.com的名稱服務器上,解析庫中添加資源記錄 wsescape.com.INNSns1.wsescape.com. wsescape.com.INNSns2.wsescape.com. wsescape.com.INNSns3.wsescape.com. ns1.wsescape.com.INA 3.3.3.1 ns2.wsescape.com.INA 3.3.3.2 ns3.wsescape.com.INA 3.3.3.3
域名注冊
- 代理商
- 萬網
- 新網
- godaddy
綁定服務器
- 注冊完成以后,想自己用專用服務來解析?
- 管理后臺,把 NS 記錄指向的服務器名稱和 A 記錄指向的服務器地址
二、常用命令
2.1 dig命令
dig用于測試dns系統,因此不會查詢hosts文件進行解析
- 用于詢問 DNS 域名服務器的靈活的工具
- 除非被告知請求特定域名服務器,dig將嘗試 /etc/resolv.conf中列舉的任何服務器
- 當未指定任何命令行參數或選項時,dig將對.(根)執行NS查詢
格式
dig [-t type] name [@SERVER] [query options]
語法
- 類型查詢
dig -t NS wsescape.com @172.16.242.178 dig -t MX wsescape.com @172.16.242.178 dig -t A www.baidu.com
- 查詢選項
+[no]trace:跟蹤解析過程 +[no]recurse:進行遞歸解析 測試反向解析: dig -x IP @SERVER dig -x 172.16.100.11 @172.16.242.178
- 模擬區域傳送:
dig -t axfr ZONE_NAME @SERVER dig -t axfr wsescape.com @172.16.242.178
2.2 host命令
host命令用于查詢DNS的工具
- 它通過常轉換指定主機名稱的主機名稱為 IP 地址
- 當不指定參數時,它顯示host命令的幫助信息
格式
host [-t type] name [SERVER]
語法
- -a
等同于-v -t
- -C
在需要認證的域名服務器上查找 SOA 記錄
- -l
列出一個域內所有的主機
- -i
反向查找
- -r
不使用遞歸處理
- -v
運行時顯示詳細的處理信息
- -4
用于 IPv4 的查詢
- -6
用于 IPv6 的查詢
- -t <類型>
指定類型,包括a、all、mx、ns等
實例展示
[root@localhost ~]# host -t A www.wsescape.com 172.16.242.178 Using domain server: Name: 172.16.242.178 Address: 172.16.242.178#53 Aliases: www.wsescape.com has address 172.16.100.11 www.wsescape.com has address 172.16.100.12 [root@localhost ~]# host -t A www.wsescape.com 172.16.242.178 Using domain server: Name: 172.16.242.178 Address: 172.16.242.178#53 Aliases: www.wsescape.com has address 172.16.100.12 www.wsescape.com has address 172.16.100.11 [root@localhost ~]# host --help host: illegal option -- - Usage: host [-aCdlriTwv] [-c class] [-N ndots] [-t type] [-W time] [-R number] [-m flag] hostname [server] -a is equivalent to -v -t ANY -c specifies query class for non-IN data -C compares SOA records on authoritative nameservers -d is equivalent to -v -l lists all hosts in a domain, using AXFR -i IP6.INT reverse lookups -N changes the number of dots allowed before root lookup is done -r disables recursive processing -R specifies number of retries for UDP packets -s a SERVFAIL response should stop query -t specifies the query type -T enables TCP/IP mode -v enables verbose output -w specifies to wait forever for a reply -W specifies how long to wait for a reply -4 use IPv4 query transport only -6 use IPv6 query transport only -m set memory debugging flag (trace|record|usage)
2.3 nslookup命令
nslookup 命令用于查找域名服務器的程序,有兩種模式為互交和非互交
格式
nslookup [-option] [name | -] [server]
語法
- 非交互模式
- 直接查詢即可
- 交互式模式
nslookup> server IP: 指明使用哪個DNS server進行查詢; set q=RR_TYPE: 指明查詢的資源記錄類型; NAME: 要查詢的名稱;
實例展示
[root@localhost ~]# nslookup > server 172.16.242.178 Default server: 172.16.242.178 Address: 172.16.242.178#53 > set q=A > www.wsescape.com Server:172.16.242.178 Address:172.16.242.178#53 Name:www.wsescape.com Address: 172.16.100.11 Name:www.wsescape.com Address: 172.16.100.12 > set q=NS > wsescape.com Server:172.16.242.178 Address:172.16.242.178#53 wsescape.comnameserver = ns2.wsescape.com. wsescape.comnameserver = ns1.wsescape.com. # 非交互模式查詢 [root@rudder ~]# nslookup baidu.com Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: baidu.com Address: 123.125.114.144 Name: baidu.com Address: 220.181.111.85 Name: baidu.com Address: 220.181.111.86 # 非交互模式查詢 [root@rudder ~]# nslookup > www.baidu.com Server:172.17.0.254 Address:172.17.0.254#53 Non-authoritative answer: #非權威答案,表明是在緩存中讀取的 www.baidu.comcanonical name = www.a.shifen.com. Name:www.a.shifen.com Address: 61.135.169.105 #返回第一個IP地址 Name:www.a.shifen.com Address: 61.135.169.125 #返回第二個IP地址 > server 8.8.8.8 #設置域名服務器為 8.8.8.8 Default server: 8.8.8.8 Address: 8.8.8.8#53 > www.baidu.com #再次請求百度的IP地址 Server:8.8.8.8 Address:8.8.8.8#53 Non-authoritative answer: www.baidu.comcanonical name = www.a.shifen.com. Name:www.a.shifen.com Address: 220.181.111.147 #不同的DNS獲取的IP地址是不同的。
2.4 rndc命令
rndc客戶端是通過建立套接字連接服務端,監聽在TCP的953端口,來對服務端的named進行修改操作,但由于安全考慮,所以rndc的客戶端和服務端安裝在同一臺主機之上。
語法 1
-b
source-address 使用 source-address 作為連接服務器的源地址允許多個實例設置 IPv4 和 IPv6 源地址
-c config-file
使用config-file 作為缺省的配置文件/etc/rndc.conf 的替代
-k key-file
使用 key-file 作為缺省的密鑰文件/etc/rndc.key 的替代 如果config-file 不存在,/etc/rndc.key 中的密鑰將用于認證發向服務器的命令
-s server server
是與rndc的配置文件中server語句匹配的服務器的名字或地址 如果命令行沒有提供服務器,會使用rndc配置文件中options語句中的default-server子句所命名的主機
-p port
發送命令到TCP端口port,以取代BIND 9的缺省控制通道端口 953
-V
打開冗余日志
-y key_id
使用配置文件中的密鑰key_id
語法 2
reload
重載主配置文件和區域解析庫文件
reload zone
重載區域解析庫文件
refresh zone
安排區域的立即維護
retransfer zone
手動啟動區域傳送過程,而不管序列號是否增加
notify zone
重新對區域傳送發通知
reconfig
重載主配置文件
status
將服務器統計信息寫入統計文件中
querylog
開啟或關閉查詢日志
建議調試的時候開啟,否則日志消耗太多性能
dumpdb
將高速緩存轉儲到轉儲文件 (named_dump.db)
stop
將暫掛更新保存到主文件并停止服務器
halt
停止服務器,但不保存暫掛更新
trace
將調試級別增加一級
建議調試的時候開啟,否則日志消耗太多性能
trace level
更改調試級別
notrace
將調試級別設置為0
flush
刷新服務器的所有高速緩存
status
顯示服務器的狀態
restart
重新啟動服務器
實例展示
# rndc工具能夠幫助我們輸出系統信息 [root@localhost ~]# rndc status version: 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 CPUs found: 1 worker threads: 1 number of zones: 20 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running # rndc不重啟加載區域文件 [root@localhost ~]# rndc reload
三、BIND的安裝配置
DNS服務,程序包名bind,程序名named。
3.1 程序包
只需要安裝bind、bind-libs和bind-utils即可
bind
主包
bind-libs
依賴的庫文件,包括 32 位和 64 位
bind-utils
提供客戶端工具,例如dig、host、nslookup和nsupdate
bind-chroot
建立不要安裝,很容易被入侵
bind-chroot 包的作用是提高安全性,將 DNS 服務的配置文件/etc/named.conf 等,創建一個硬鏈接轉到/var/named/chroot/etc/ 文件夾下面,而且使用服務帳號登錄,不使用root用戶登錄
注意,修改配置文件要修改/etc/下面的,這樣會自動同步到chroot下面的鏈接文件中
bind-sdb
bind-dyndb-ldap
以上這兩種方式,是將解析庫文件放在不同的數據庫中進行存儲
3.2 BIND配置文件
配置文件
- 服務啟動腳本
在CentOS6下
/etc/rc.d/init.d/named
- 主配置文件
/etc/named.conf
/etc/rndc.key
為rndc的秘鑰共享文件,提供認證用的
rndc是什么?
遠程名稱控制器
默認與bind安裝在同一主機,且只能通過本地回環地址127.0.0.1來連接named進程
提供輔助性的管理功能,如查看解析狀態等
默認工作在 953/tcp 端口上
/etc/named.rfc1912.zones
請求注解文檔
- 解析庫文件
/var/named/ZONE_NAME.ZONE
在/var/named/目錄下存在多個解析庫文件
/var/named/named.ca
指向根DNS該文件不需要管理員更改,而是系統自帶
/var/named/named.local
本地子域解析,將localhost反向解析為127.0.0.1
- 注意
(1) 一臺物理服務器可同時為多個區域提供解析
(2) 必須要有根區域文件,在named.ca中包含13根節點地址,由dig命令生成而來的
(3) 應該有兩個(如果包括ipv6的,應該更多)實現localhost和本地回環地址的解析庫
# 在CentOS6下 [root@localhost ~]# rpm -ql bind | less /etc/NetworkManager/dispatcher.d/13-named /etc/logrotate.d/named /etc/named /etc/named.conf /etc/named.iscdlv.key /etc/named.rfc1912.zones /etc/named.root.key /etc/portreserve/named /etc/rc.d/init.d/named /etc/rndc.conf /etc/rndc.key /etc/sysconfig/named /usr/lib64/bind /usr/sbin/arpaname ...... # @表示當前區域的區域名稱,在主配置文件/etc/named.conf中定義的 # TTL的值沒寫,因為定義了宏$TTL 1D,直接繼承 # rname.invalid.表示管理員的郵箱地址 # 后面的如NS、A等缺省,因為繼承前者的 [root@localhost named]# cat /var/named/named.localhost $TTL 1D @IN SOA@ rname.invalid. ( 0; serial 1D; refresh 1H; retry 1W; expire 3H ); minimum NS@ A127.0.0.1 AAAA::1 [root@localhost named]# cat /var/named/named.loopback $TTL 1D @IN SOA@ rname.invalid. ( 0; serial 1D; refresh 1H; retry 1W; expire 3H ); minimum NS@ A127.0.0.1 AAAA::1 PTRlocalhost.
主配置文件
- 全局配置
options {}
- 日志子系統配置
logging {}
- 區域定義
本機能夠為哪些zone進行解析,就要定義哪些zone
如zone "ZONE_NAME" IN {}
- 注意
任何服務程序如果期望其能夠通過網絡被其它主機訪問,至少應該監聽在一個能與外部主機通信的IP地址上
[root@localhost ~]# cat /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; };
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 { localhost; };
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";
};
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";
# localhost.localdomain就是區域名稱,也就是@
[root@localhost ~]# cat /etc/named.rfc1912.zones
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
3.3 緩存名稱服務器配置
安裝上bind之后,其實就算的上是一個緩存名稱服務器,只需要進行少許的配置即可完成
- 修改
listen-on port 53 - 修改
allow-query - 修改
recursion
(1)安裝
[root@localhost ~]#yum install bind
(2)啟動
[root@localhost ~]# service named start Generating /etc/rndc.key: [ OK ] Starting named: [ OK ]
(3)查看
# 為了安全,安裝上bind之后,默認只會監聽本地,不對外提供服務
# 任何服務程序如果期望其能夠通過網絡被其它主機訪問,至少應該監聽在一個能與外部主機通信的`IP`地址上
# 編輯主配置文件即可
[root@localhost ~]# ss -tunlp | grep :53
udp UNCONN 0 0 127.0.0.1:53 *:* users:(("named",39822,512))
udp UNCONN 0 0 ::1:53 :::* users:(("named",39822,513))
tcp LISTEN 0 3 ::1:53 :::* users:(("named",39822,21))
tcp LISTEN 0 3 127.0.0.1:53 *:* users:(("named",39822,20))
(4)修改
# 修改之前先備份一下
# 逗號之前沒有內容,默認為前一個的名稱,后面為復制的內容
[root@localhost ~]# cp /etc/named.conf{,.bak}
[root@localhost ~]# ll /etc/named*
-rw-r-----. 1 root named 984 11月 20 2015 /etc/named.conf
-rw-r-----. 1 root root 984 6月 20 21:53 /etc/named.conf.bak
# //表示單行注釋,注釋ipv6
# /**/表示多行注釋
# 修改的時候必須以;結尾且{}的兩端必須有空格,否則為語法錯誤
# directory用來定義區域解析庫文件存放位置
# 建議關閉dnssec功能
# 將dnssec-enable和dnssec-validation改為no,并注釋key文件即可
# 把能夠以外網進行通信的地址寫在listen-on port 53之后,如果有多個可以多個添加,不能省略
# 如果將listen-on port 53進行注釋或者刪除,默認是監聽在所有
# 將allow-query注釋或改為allow-query { any; };
# 是否允許遞歸recursion,必須為yes
[root@localhost ~]# vim /etc/named.conf
options {
listen-on port 53 { 172.16.242.178; 127.0.0.1; };
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 { localhost; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};
(5)重啟生效
# 重啟之后才能生效配置
[root@localhost ~]# service named restart
Stopping named: . [ OK ]
Starting named: [ OK ]
[root@localhost ~]# ss -tunlp | grep :53
udp UNCONN 0 0 172.16.242.178:53 *:* users:(("named",40086,513))
udp UNCONN 0 0 127.0.0.1:53 *:* users:(("named",40086,512))
udp UNCONN 0 0 ::1:53 :::* users:(("named",40086,514))
tcp LISTEN 0 3 ::1:53 :::* users:(("named",40086,22))
tcp LISTEN 0 3 172.16.242.178:53 *:* users:(("named",40086,21))
tcp LISTEN 0 3 127.0.0.1:53 *:* users:(("named",40086,20))
3.4 主 DNS 名稱服務器配置
主 DNS 名稱服務器配置就是在緩存DNS服務器的基礎之上增加zone配置文件就可以了
- 在/etc/named.rfc1912.zones添加zone記錄
- 在/var/named/增加zone文件
(1) 在主配置文件中定義區域
格式
# master表示主DNS
# slave表示從DNS
# hint表示根
# forward做轉發
# file使用的是主配置文件directory定義的路徑
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
修改配置
# 在/etc/named.rfc1912.zones文件內定義域名
# named-checkconf用來檢查語法錯誤
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "wsescape.com" IN {
type master;
file "wsescape.com.zone";
};
[root@localhost ~]# named-checkconf
(2) 定義區域解析庫文件
格式
出現的內容: 宏定義; 資源記錄;
修改配置
# 這里$TTL用于定義TTL的值,86400為秒,可以使用1D來代替 # $ORIGIN用于指定域名詞尾,如ns以及mx都為缺省了 # named-checkzone # 兩個www,在訪問的時候會進行輪詢操作的 # 泛域名解析這里的*,表示無論用戶輸入什么都不報錯 # 或者寫成* IN A 172.16.100.11,因為CNAME不能輸入ip地址 [root@localhost ~]# cd /var/named/ [root@localhost named]# vim wsescape.com.zone $TTL 86400 $ORIGIN wsescape.com. @ IN SOA ns1.wsescape.com. admin.wsescape.com ( 2016042201 1H 5M 7D 1D ) IN NS ns1 IN NS ns2 IN MX 10 mx1 IN MX 20 mx2 ns1 IN A172.16.100.11 ns2 IN A172.16.100.12 mx1 IN A172.16.100.13 mx2 IN A172.16.100.14 www IN A172.16.100.11 www IN A172.16.100.12 ftp INCNAMEwww * IN CNAME www [root@localhost named]# named-checkzone "wsescape.com" /var/named/wsescape.com.zone zone wsescape.com/IN: loaded serial 2016042201 OK
更改權限
# 可以查出進程是以named運行的 # 其中/etc/named.conf文件的屬主為root,屬組為named # 為了安全起見,對自己創建的文件進行權限修改 [root@localhost named]# ps -aux | grep named named 40086 0.0 1.1 160072 11736 ? Ssl 22:07 0:00 /usr/sbin/named -u named root 40785 0.0 0.0 103324 864 pts/0 S+ 23:19 0:00 grep named [root@localhost named]# ll /etc/named.conf -rw-r-----. 1 root named 1004 6月 20 22:23 /etc/named.conf [root@localhost named]# id named uid=25(named) gid=25(named) 組=25(named) [root@localhost named]# ll 總用量 32 drwxrwx---. 2 named named 4096 6月 20 21:45 data drwxrwx---. 2 named named 4096 6月 20 21:45 dynamic -rw-r-----. 1 root named 3171 1月 11 22:12 named.ca -rw-r-----. 1 root named 152 12月 15 2009 named.empty -rw-r-----. 1 root named 152 6月 21 2007 named.localhost -rw-r-----. 1 root named 168 12月 15 2009 named.loopback drwxrwx---. 2 named named 4096 5月 11 07:07 slaves -rw-r--r--. 1 root root 408 6月 20 22:53 wsescape.com.zone [root@localhost named]# chmod 640 wsescape.com.zone [root@localhost named]# chown :named wsescape.com.zone [root@localhost named]# ll 總用量 32 drwxrwx---. 2 named named 4096 6月 20 21:45 data drwxrwx---. 2 named named 4096 6月 20 21:45 dynamic -rw-r-----. 1 root named 3171 1月 11 22:12 named.ca -rw-r-----. 1 root named 152 12月 15 2009 named.empty -rw-r-----. 1 root named 152 6月 21 2007 named.localhost -rw-r-----. 1 root named 168 12月 15 2009 named.loopback drwxrwx---. 2 named named 4096 5月 11 07:07 slaves -rw-r-----. 1 root named 408 6月 20 22:53 wsescape.com.zone
重啟生效
[root@localhost ~]# service named restart Stopping named: . [ OK ] Starting named: [ OK ] # 使用dig命令來幫助我們驗證信息 # 因為之前的配置,這里會進行輪詢操作 [root@localhost ~]# dig -t A wsescape.com @172.16.242.178
3.5 反向區域
反向解析和正向解析各為獨立的系統,所以可以部署在不同的或者是相同的機器之上,都是可以
- 一個區域只能有一個主服務器,無論是正向還是反向
- 一個主服務器可以有多個從服務器
根據配置文件中定義的主機地址,來確定網絡地址
- 如果都為172.16.100內的主機,那么網絡地址就是172.16.100.
- 存在多種地址,如172.16.100.12、172.16.200.121等,那么網絡地址就是172.16.
- 以此類推
什么是反向區域
不變的部分用來當做區域名稱,變化的部分用來當做實現解析時候的name
格式
- 區域名稱:網絡地址反寫.in-addr.arpa.
- 如172.16.100. ==> 100.16.172.in-addr.arpa.
如何定義反向區域
(1) 定義區域
# file同樣是一個相對路徑,/var/named/
# 如果有多個正向域對應同一個網絡的話,多個區域就重名了,所以這里的網絡地址其實自己可以隨意定義,如"網絡地址1.zone"、"網絡地址2.zone"等
# 如果只有一個反向區域的話,就只需要書寫一個反向解析庫,就可以"網絡地址.zone"這樣命名了
zone "ZONE_NAME" IN {
type {master|slave|forward};
file "網絡地址.zone";
};
# 因為172.16.242.178和我們的其他服務器(172.16.100.12/172.16.100.11),所以只能寫成"16.172.in-addr.arpa"和"172.16.zone"
# 最后添加如下內容
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.zone";
};
(2) 區域解析庫文件
- 以PTR記錄為主
- 不需要MX和A以及AAAA記錄
# $TTL表示宏定義的TTL值 # $ORIGIN這里表示反向區域的名稱 # 反向的主機名稱不能省略 # 這里的11和12會自動補充上16.172.in-addr.arpa. # 別名記錄不用反解,所以ftp沒有書寫反向解析 # 這里可以使用vim -o wsescape.com.zone 16.172.zone來同時編輯兩個文件的 [root@localhost ~]# cd /var/named/ [root@localhost named]# vim 100.16.zone $TTL 86400 $ORIGIN 16.172.in-addr.arpa. @IN SOAns1.wsescape.com. admin.wsescape.com. ( 2016042201 1H 5M 7D 1D ) IN NSns1.wsescape.com. IN NSns2.wsescape.com. 11.100IN PTRns1.wsescape.com. 11.100IN PTRwww.wsescape.com. 12.100IN PTRmx1.wsescape.com. 12.100IN PTRwww.wsescape.com. 13.100IN PTRmx2.wsescape.com. # 反向解析如果沒有$ORIGIN的情況下,也可以這樣寫 [root@localhost named]# vim 100.16.zone $TTL 86400 @IN SOAns1.wsescape.com. admin.wsescape.com. ( 2016042201 1H 5M 7D 1D ) 16.172.in-addr.arpa.IN NSns1.wsescape.com. IN NSns2.wsescape.com. 11.100IN PTRns1.wsescape.com. 11.100IN PTRwww.wsescape.com. 12.100IN PTRmx1.wsescape.com. 12.100IN PTRwww.wsescape.com. 13.100IN PTRmx2.wsescape.com.
(3) 修改權限并重啟
[root@localhost named]# chmod 640 16.172.zone [root@localhost named]# chmod :named 16.172.zone # 語法 [root@localhost named]# named-checkconf [root@localhost named]# named-checkzone "16.172.inaddr-addr" 16.172.zone ok [root@localhost named]# service named reload # 檢測 [root@localhost named]# host -t PRT 172.16.100.12 172.16.242.178 [root@localhost named]# dig -x 172.16.100.12 @172.16.242.178
3.6 從 DNS 名稱服務器配置
定義從 DNS 服務器就是在緩存服務器的基礎上,進行修改配置
- 在/etc/named.rfc1912.zones添加zone記錄
主從復制
(1)應該為一臺獨立的名稱服務器
(2)主服務器的區域解析庫文件中必須有一條 NS 記錄是指向從服務器
(3)從服務器只需要定義區域,而無須提供解析庫文件;解析庫文件應該放置于/var/named/slaves/目錄中
(4)主服務器得允許從服務器作區域傳送
(5)主從服務器時間應該同步,可通過ntp進行
(6)bind程序的版本應該保持一致;否則,應該從高逐低
定義從區域的方法
- 正向從服務器格式
# 從服務器同步主服務器的解析文件會放在/var/named/slaves/中
zone "ZONE_NAME" IN {
type slave;
masters { MASTER_IP; };
file "slaves/ZONE_NAME.zone";
};
- 反向從服務器格式
# 從服務器同步主服務器的解析文件會放在/var/named/slaves/中
zone "Reverse_Net_Addr.in-addr.arpa" IN {
type master;
file "SOMEFILE.zone";
};
- (1)正向從服務器的實例
# 注意這里的從DNS服務器,需要在主DNS服務器中定義上NS記錄
# 這樣才能在主DNS的解析庫發生改變的時候通知從DNS服務器進行同步,否則不會同步的
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "wsescape.com" IN {
type slave;
masters { 172.16.242.178; };
file "slaves/wsescape.com.zone";
};
# 重起服務即可成效
[root@localhost ~]# rndc reload
# 可以通過log進行查看
[root@localhost ~]# tail /var/log/messages
- (2)反向從服務器的實例
# 注意這里的從DNS服務器,需要在主DNS服務器中定義上NS記錄
# 這樣才能在主DNS的解析庫發生改變的時候通知從DNS服務器進行同步,否則不會同步的
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "16.172.in-addr.arpa" IN {
type slave;
masters { 172.16.242.178; };
file "slaves/172.16.zone";
};
# 重起服務即可成效
[root@localhost ~]# rndc reload
# 可以通過log進行查看
[root@localhost ~]# tail /var/log/messages
四、高級功能之子域授權
4.1 子域授權的特點
子域授權其實就是在你有域名的情況下,進行細分的狀況。比如說,你注冊了wsescap.com這個域名,由于業務關系等,你需要分開為ops部門和fin部門,分別使用自己的DNS服務器,這個時候你就需要進行子域授權了。
特點
- 分布式數據庫
- 正向解析區域的子域授權比較常見,而反向的相對來說比較難做
4.2 子域授權的方法
正向解析區域子域方法
# 定義一個子區域 # 在/var/named/下的指定文件中進行配置,如這里的/var/named/wsescape.com.zone # 在我們授權了wsescape.com的前提下,定義兩個子域,分別為ops和fin兩個 ops.wsescape.com.INNSns1.ops.wsescape.com. ops.wsescape.com.INNSns2.ops.wsescape.com. ns1.ops.wsescape.com.INA1.1.1.1 ns2.ops.wsescape.com.INA1.1.1.2 fin.wsescape.com.INNSns1.fin.wsescape.com. fin.wsescape.com.INNSns2.fin.wsescape.com. ns1.fin.wsescape.com.INA3.1.1.1 ns2.fin.wsescape.com.INA3.1.1.2
4.3 解析方式
前提:如果在wsescape.com下,定義了一個子域為ops,并在ops下創建了一個www的服務。
外部解析
(1)當www.test.org中的一臺主機需要訪問ops下的www主機時,就需要進過以下幾個階段:
- 先找根(.),根說你去找com
- 再找com,com說你去找wsescape
- 再找wsescape,wsescape說你去找ops
- 最后ops返回需要的信息
內部解析
(1)當wsescape.com下的一臺主機需要訪問ops下的www主機時,雖然wsescape.com的DNS主機不給于解析,但是它知道子域的位置,所以會立即指向ops的DNS服務器。
(2)當ops下的一臺主機需要訪問wsescape.com下的www主機時,就需要進過以下幾個階段:
- 先找ops,ops說你找根
- 再找根(.),根說你去找com
- 再找com,com說你去找wsescape
- 最后wsescape返回需要的信息
我們會發現這個饒了一大圈,為了避免這樣的問題,就需要定義轉發服務器。
4.4 定義轉發服務器
注意
(1)關閉dnssec功能
dnssec-enable no dnssec-validation no
(2)被轉發的服務器需要能夠為請求者做遞歸,否則轉發請求不予進行
(3)即定義了全局轉發又定義了區域轉發,優先級為能夠精確匹配到的先通過區域轉發,不能再通過全局轉發
轉發模式
(1) 全局轉發
凡是對非本機所有負責解析的區域的請求,統統轉發給指定的服務器
# forward定義轉發模式
# first表示先轉發給指定解析服務器,如無響應的話再找根服務器,即先遞歸在迭代
# only表示轉發給指定解析服務器,僅僅遞歸
# fowwarders定義轉發給誰
Options {
forward { first|only };
forwarders;
}
(2) 區域轉發
僅轉發對特定的區域的請求至某服務器
需要自己定義區域和區域類型等信息
# forward定義轉發模式
# first表示先轉發給指定解析服務器,如無響應的話再找根服務器,即先遞歸在迭代
# only表示轉發給指定解析服務器,僅僅遞歸
# fowwarders定義轉發給誰
zone "ZONE_NAME" IN {
type forward;
forward { first|only };
forwarders;
}
4.5 子域父域配置
前提:
- 父域IP地址 ==> 172.16.100.11
- 子域IP地址 ==> 172.16.100.12
- 能訪問互聯網的IP地址 ==> 172.16.0.1
(1)父域服務器配置
# 一臺獨立的主機,這里配置父域就是在主服務器配置的基礎上,添加子域而已
# 注釋的話,默認監聽所有
# 如果發現測試無法成功,查看/etc/named.conf中的dnssec改為no而非注釋掉,否則導致本地客戶端不接受
[root@localhost ~]# yum installl -y bind
[root@localhost ~]# vim /etc/named.conf
options {
// listen-on port 53 { 172.16.242.178; 127.0.0.1; };
// 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 { localhost; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};
[root@localhost ~]# service named start
[root@localhost ~]# ss -tunl | grep :53
udp UNCONN 0 0 127.0.0.1:53 *:*
udp UNCONN 0 0 ::1:53 :::*
tcp LISTEN 0 3 ::1:53 :::*
tcp LISTEN 0 3 127.0.0.1:53 *:*
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "wsescape.com" IN {
type master;
file "wsescape.com.zone";
};
# ops、ns2.ops和ns1.ops都會自動補全wsescape.com.
# 這里沒有定義ns2.ops的A記錄,是因為ns2.ops我們沒有配置主機
# 如果父域需要查找子域的時候,可能會跑到我們這個沒有配置的機器上,導致服務解析,所以這就是沒有定義的原因
[root@localhost ~]# vim /var/named/wsescape.com.zone
$TTL 1D
$ORIGIN wsescape.com.
@ IN SOA ns1.wsescape.com. admin.wsescape.com (
2016042201
1H
5M
7D
1D )
IN NS ns1
IN NS ns2
ns1 IN A 172.16.100.11
ns2 IN A 172.16.100.18
www IN A 172.16.100.11
* IN A 172.16.100.11
ops IN NS ns1.ops
ops IN NS ns2.ops
ns1.ops IN A 172.16.100.12
[root@localhost ~]# cd /var/named/
[root@localhost named]# chown :named wsescape.com.zone
[root@localhost named]# chmod 640 wsescape.com.zone
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# tail /var/log/messages
(2)子域服務器配置
# 配置子域服務器,即一臺獨立的主機,和父域配置沒什么大的差別
# 注釋的話,默認監聽所有
# 如果發現測試無法成功,查看/etc/named.conf中的dnssec改為no而非注釋掉,否則導致本地客戶端不接受
[root@localhost ~]# yum installl -y bind
[root@localhost ~]# vim /etc/named.conf
options {
// listen-on port 53 { 172.16.242.178; 127.0.0.1; };
// 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 { localhost; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};
[root@localhost ~]# service named start
[root@localhost ~]# ss -tunl | grep :53
udp UNCONN 0 0 127.0.0.1:53 *:*
udp UNCONN 0 0 ::1:53 :::*
tcp LISTEN 0 3 ::1:53 :::*
tcp LISTEN 0 3 127.0.0.1:53 *:*
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "ops.wsescape.com" IN {
type master;
file "ops.wsescape.com.zone";
};
# ns1和ns2都會自動補全ops.wsescape.com.
# 這里也省略了ns2的定義,因為沒有這里機器,如果父域需要查找子域的時候
# 可能會跑到我們這個沒有配置的機器上,導致服務解析,所以這就是沒有定義的原因
[root@localhost ~]# vim /var/named/ops.wsescape.com.zone
$TTL 1D
$ORIGIN ops.wsescape.com.
@ IN SOA ns1.ops.wsescape.com. admin.ops.wsescape.com (
2016042201
1H
5M
7D
1D )
IN NS ns1
IN NS ns2
ns1 IN A 172.16.100.12
www IN A 172.16.100.20
* IN A 172.16.100.20
[root@localhost ~]# cd /var/named/
[root@localhost named]# chown :named wsescape.com.zone
[root@localhost named]# chmod 640 wsescape.com.zone
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# tail /var/log/messages
(3)測試配置
# 當這里,我們會發現如下問題 # 在子域服務器中,執行命令后可以查看ops的信息 # 172.16.100.12為子域服務器 [root@localhost ~]# dig -t A www.ops.wsescape.com @172.16.100.12 # 在子域服務器中,執行命令后在無網絡的情況下不能查看父域的信息,在有網的情況下會根據根返回的信息來定位父域信息 [root@localhost ~]# dig -t A www.wsescape.com @172.16.100.12 # 在父域服務器中,執行命令后可以查看子域ops的信息 # 這里dig命令默認執行一個遞歸操作,所以這里需要加上+norecurse非遞歸即可 # 172.16.100.11為父域服務器 [root@localhost ~]# dig -t A ops.wsescape.com @172.16.100.11 +norecurse [root@localhost ~]# dig -t A www.ops.wsescape.com @172.16.100.11 +norecurse
4.6 定義轉發域
注意
- 如果發現測試無法成功,查看/etc/named.conf中的dnssec改為no而非注釋掉,否則導致本地客戶端不接受
- 如果測試應該為不能解析但是還是解析了,可能需要清空緩存rndc flush
服務配置
(1)全局轉發
# 在父域中配置
# 全局轉發,就是通通轉發給172.16.0.1來查詢
# 在父域服務器上編輯/etc/named.conf,在options添加如下信息
# 由于上述的機器沒有連接互聯網,所以可以通過172.16.0.1進行解析
[root@localhost ~]# vim /etc/named.conf
Options {
forward first;
forwarders { 172.16.0.1; };
}
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# tail /val/log/messages
# 父域中測試可以
[root@localhost ~]# dig -t A www.baidu.com @172.16.100.11
(2)區域轉發
# 在子域中配置
# 區域轉發,就是將wsescape.com這個域內的查詢轉發給172.16.100.11來查詢
# 在子域服務器上編輯/etc/named.rfc1912.zones最后添加一個zone
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "wsescape.com" IN {
type forword;
forward only;
forwarders { 172.16.100.11; };
};
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# tail /val/log/messages
# 子域中測試可以,成功
[root@localhost ~]# dig -t A www.wsescape.com @172.16.100.12
(3)測試配置
# 父域中測試,成功 [root@localhost ~]# dig -t A www.ops.wsescape.com @172.16.100.11 [root@localhost ~]# dig -t A www.baidu.com @172.16.100.11 # 子域中測試,子域知道父域在哪里,成功 # 在子域中還是無法解析,因為指定要了定義區域wsescape.com可以解析 # 如果在子域中,即定義了全局轉發有定義了區域轉發,優先級為能夠精確匹配到的先通過區域轉發,不能再通過全局轉發 [root@localhost ~]# dig -t A www.wsescape.com @172.16.100.12 # 子域解析失敗 [root@localhost ~]# dig -t A www.baidu.com @172.16.100.12
五、高級功能之view視圖
5.1 BIND中基礎的安全相關的配置
(1)acl機制
- 把一個或多個地址歸并為一個集合,并通過一個統一的名稱調用
- 只能先定義后使用,其一般定義在配置文件中options的前面
(2)acl格式
# acl表示關鍵字,acl_name表示自定義名稱
# ip表示單個的IP地址,net表示網絡,意思就是單個IP和網絡都可以定義
acl acl_name {
ip;
ip;
net/prelen;
};
(3)四個內置的acl
因為這四個是內置的acl,所以在我們自己定義的時候不能使用這幾個名稱,否則會導致誤用發生。
- none ==> 沒有一個主機
- any ==> 任意主機
- local ==> 本機
- localnet ==> 本機的IP同掩碼運算后得到的網絡地址
(4)訪問控制的指令
以下的這幾個指令,可以用在/etc/named.conf中表示全局生效,也可以用在/etc/named.rfc1912.zones中,定義在單獨的zone中表示局部生效。同時,{}內可以包含定義的acl或者主機IP地址,包括內置的和我們自己定義的。
- allow-query {} ==> 允許查詢的主機,即白名單
- allow-transfer {} ==> 允許區域傳送的主機,即白名單
- allow-recursion {} ==> 允許遞歸的主機
- allow-update {} ==> 允許更新區域數據庫中的內容,建議設置為none
(5)演示示例
# 這里我們定義的acl,可以在主配置文件/etc/named.conf中的option中使用,可以在`/etc/named.rfc1912.zones`中使用
# 定義自己的acl
acl mynet {
172.16.1.100;
172.16.0.0/16;
}
# 在/etc/named.conf中的option中使用
[root@localhost ~]# vim /etc/named.conf
acl mynet {
172.16.1.100;
172.16.0.0/16;
}
options {
// listen-on port 53 { 172.16.242.178; 127.0.0.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 { mynet; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
};
...
# 在`/etc/named.rfc1912.zones`中使用
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "wsescape.com" IN {
type master;
file "wsescape.com.zone";
allow-query { mynet; };
};
...
5.2 BIND view
用途:
主要適用于對于用戶的分類,提高網站訪問效率。
- 如按照內、外網指定不同訪問方式來訪問網站
- 如按照運營商類型制定不同用戶訪問指定的服務器來訪問網站
- 其實
BIND view就是實現分布式緩存,類似于CDN的一致方式
解析過程
- 當一個用戶請求接收之后,首先判斷用戶的來源,然后自上而下逐個與各個
view自己的用戶節系列表進行匹配,最終來確定view系統解析功能,返回指定的區域解析庫文件 - 一般用
view1匹配第一個網絡, 用view2匹配第二個網絡, 用view3匹配其余網絡,保證不會有缺漏
(1)視圖
- 一個
bind服務器可定義多個view,每個view中可定義一個或多個zone區域 - 每個
view用來匹配一組請求的客戶端 - 多個
view內可能需要對同一個區域進行解析,但使用不同的區域解析庫文件
(2)格式
view是自上而下,逐一匹配- 大多數用在
option中的指令,都可以用在view中
view VIEW_NAME {
match-clients { };
}
(3)注意
(1)一旦啟用了view,所有的zone都只能定義在view中,一個都不允許例外
(2) 僅有必要在匹配到允許遞歸請求的客戶所在view中定義根區域
(3)客戶端請求到達時是自上而下檢查每個view所服務的客戶端列表
(4)實驗演示

- 將來自172.16網絡并訪問www.wsescape.com的用戶,使用172.16.100.11這個DNS服務器來指定www服務器的地址
- 將非來自172.16網絡并訪問www.wsescape.com的用戶,使用公網2.2.2.1這個DNS服務器來指定www服務器的地址
# 在172.16.100.11的主機中
# 定義acl并將/etc/named.conf中定義的根zone刪除
[root@localhost ~]# vim /etc/named.conf
# 刪除如下根zone
zone "." IN {
type hint;
file "named.ca";
};
# 添加acl
acl mynet {
172.16.0.0/16;
127.0.0.0/8;
};
# 在172.16.100.11的主機中
# 將根移到/etc/named.rfc1912.zones中,并將所有的zone包含在view中
# 并添加內部訪問配置internal
[root@localhost ~]# vim /etc/named.rfc1912.zones
# 添加view,限制mynet用戶可以訪問并允許遞歸
view internal {
match-chlients { mynet; };
allow-recursion { mynet; };
# 添加根
zone "." IN {
type hint;
file "named.ca";
};
# 由于之前的設置,這里是有wsescape.com,并配置了wsescape.com.zone文件
zone "wsescape.com" IN {
type master;
file "wsescape.com.zone";
}
...
};
# 在172.16.100.11的主機中
# 如果我們在/etc/named.conf中增加192.168.0.0/24網絡,就可以在192.168.0.13中可以解析,這里沒有添加進去
[root@localhost ~]# named-checkconf
[root@localhost ~]# service named restart
# 在172.16.100.11主機上,成功
[root@localhost ~]# dig -t A www.wsescape.com @172.16.100.11
# 如果配置了,在192.168.0.13主機上,成功
[root@localhost ~]# dig -t A www.wsescape.com @172.16.100.11
# 在172.16.100.11的主機中
# 在/etc/named.rfc1912.zones中,添加外部訪問配置
# 這里對沒有匹配到的主機,不進行遞歸,所以在external就沒有添加根域
[root@localhost ~]# vim /etc/named.rfc1912.zones
view external {
match-clents { any; };
zone "wsescape.com" IN {
type master;
file "wsescape.com.external";
allow-update { none; };
};
};
[root@localhost ~]# cd /var/named/
# 歸檔復制
[root@localhost named]# cp -a wsescape.com.zone wsescape.com.external
# 這里的2.2.2.1表示的是wsescape.com網站的公網DNS服務器
[root@localhost named]# vim wsescape.com.external
$TTL 1D
$ORIGIN wsescape.com.
@ IN SOA ns1.wsescape.com. admin.wsescape.com (
2016042201
1H
5M
7D
1D )
IN NS ns1
IN NS ns2
ns1 IN A 172.16.100.11
ns2 IN A 172.16.100.18
www IN A 2.2.2.1
* IN A 2.2.2.1
[root@localhost ~]# service named restart
# 在172.16.100.11主機上,成功來自172.16.100.11
[root@localhost ~]# dig -t A www.wsescape.com @172.16.100.11
# 在192.168.0.13主機上,成功來自2.2.2.1
[root@localhost ~]# dig -t A www.wsescape.com @172.16.100.1
六、高級功能之編譯安裝BIND
# 最小化安裝機器
[root@localhost ~]# yum groupinstall "Development Tools" "Server Platform Development"
# 去官網isc.org下載安裝包,bind-9.10.1-P1.tar.gz
# bind9和bind10的區別很大,而且bind10還在測試階段
# 創建named用戶和組
# 安裝在同一目錄下/usr/local/bind9,系統文件放在/etc/named/
# 禁用IPv6功能,禁用chroot功能,啟動線程多核工作
# 自己手動編譯安裝bind可能會出現的問題
# (1)在/etc/named/沒有配置文件或者為空,需要自己創建
# (2)沒有任何區域解析庫文件,即/var/named,所以也沒有13個根節點,需要自己創建
# (3)沒有rndc的配置文件,需要自己創建
# (4)沒有啟動腳本,沒有/etc/init.d/named文件
# 這里由于自定義安裝到了/usr/local/bind9中,所以像dig、host等工具不能直接調用,需要完整路徑
[root@localhost ~]# tar xf bind-9.10.1-P1.tar.gz
[root@localhost ~]# cd bind-9.10.1-P1
[root@localhost ~]# groupadd -r -g 53 named
[root@localhost ~]# useradd -r -u 53 -g 53 named
[root@localhost ~]# ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --disable-chroot --enable-threads
[root@localhost ~]# make
[root@localhost ~]# make install
# 添加環境變量,就可以調用相關命令
[root@localhost ~]# vim /etc/profile.d/named.sh
export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH
[root@localhost ~]# . /etc/profile.d/named.sh
# 導出庫文件
[root@localhost ~]# vim /etc/ld.so.conf.d/named.conf
/usr/loacl/bind9/lib
# 重新載入庫文件
[root@localhost ~]# ldconfig -v
# 如果有頭文件,導出頭文件
[root@localhost ~]# ln -sv /usr/local/bind9/include /usr/include/named
# 之后就可以使用/usr/include/named來訪問/usr/local/bind9/中的頭文件了
[root@localhost ~]# ls /usr/include/named
# 在/usr/local/bind9/下有share的幫助文件,添加MANPATH將其放入man中
[root@localhost ~]# vim /etc/man.conf
MANPATH /usr/local/bind9/share/man
# 添加主配置文件,這里只添加directory就可以了
[root@localhost ~]# vim /etc/named/named.conf
option {
directory "/var/named"
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
[root@localhost ~]# mkdir /var/named/{named.ca, localhost.zone, named.local}
# 使用dig命令來生成13個根節點,172.16.0.1為網關地址,可以幫助我們連接外網的地址,獲取13個根節點
[root@localhost ~]# dig -t NS . @172.16.0.1 > /var/named/named.ca
[root@localhost ~]# vim /var/named/localhost.zone
$TTL 1D
@ IN SOA localhost. admin.localhost. (
2016042201
1H
5M
7D
1D )
IN NS localhost.
localhost. IN A 172.0.0.1
[root@localhost ~]# vim /var/named/named.local
$TTL 1D
@ IN SOA localhost. admin.localhost. (
2016042201
1H
5M
7D
1D )
IN NS localhost.
1 IN PRT localhost.
[root@localhost ~]# cd /var/named/
[root@localhost named]# chmod 640 ./*
[root@localhost named]# chown :named *
[root@localhost named]# chmod 640 /etc/named/named.conf
# 查看幫助文檔
[root@localhost ~]# man named
# 啟動named服務,調試
[root@localhost ~]# named -u named -f -g -d 3
# 啟動named服務,不調試
[root@localhost ~]# named -u named
# 查看是否啟動
[root@localhost ~]# ss -tunl named | grep :53
# 關閉named服務
[root@localhost ~]# killall named
# 添加解析區域
[root@localhost ~]# vim /etc/named/named.conf
zone "wsescape.com" IN {
type master;
file "wsescape.com.zone";
allow-update { none; };
};
[root@localhost ~]# vim /var/named/wsescape.com.zone
$TTL 1D
$ORIGIN wsescape.com.
@ IN SOA ns.wsescape.com. admin.wsescape.com. (
2016042201
1H
5M
7D
1D )
IN NS ns
ns IN A 172.16.100.11
www IN A 172.16.100.11
[root@localhost named]# chmod 640 wsescape.com.zone
[root@localhost named]# chown :named wsescape.com.zone
# 啟動
[root@localhost named]# named -u named
# 解析正常
[root@localhost named]# dig -t A www.wsescape.com @172.16.100.11
# 當我們使用rndc reload等的時候,會提示我們沒有配置文件
# 想讓rndc可用,使用rndc-confgen來生成配置文件
# 如果使用rndc-confgen發生堵塞,可以使用rndc-confgen -r /dev/urandom來生成隨機數
# 用rndc-confgen生成的文件,將#Start和#End之間的配置文件放到/etc/named/rndc.conf中,之后根據提示將后續的內容放到/etc/named/named.conf中
[root@localhost ~]# rndc-confgen
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "ZeE7NXZTprjARrGN/KRANQ==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#algorithm hmac-md5;
#secret "ZeE7NXZTprjARrGN/KRANQ==";
# };
#
# controls {
#inet 127.0.0.1 port 953
#allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
# 現在rndc reload可以使用了
[root@localhost ~]# rndc reload
# 之后就只需要給提供一個腳本來像service一樣,啟動和關閉服務,不難的
# 編譯安裝,在bind-9.10.1-P1源碼目錄下,有一個contrib目錄
# 其中包含的是第三方貢獻的補充增強bind的功能
# 其中有一個目錄為scripts包含一些腳本,我們可以參考
# 還有一個目錄為queryperf來評估查詢性能的,做壓測的,需要編譯安裝才能使用
# 編譯安裝queryperf,只需要在其目錄下執行./configure和make即可完成
# 就會生成一個queryperf的可執行文件,執行下列操作就可以直接使用了
[root@localhost queryperf]# cp queryperf /usr/local/bind9/bin/
# 在測試的時候,需要指定一個測試的文件,如test
[root@localhost ~]# vim test
www.wsescape.com A
wsescape.com NS
[root@localhost ~]# queryperf -d test -s 172.16.100.11
EN