DNS是什么
DNS(Domain Name System,域名系統),是互聯網上存儲域名和IP映射關系的一個分布式數據庫,他負責把域名轉換為IP地址,或IP轉換為域名,工作於OSI應用層之上,DNS運行於UDP/TCP的53端口,其中,負責提供域名解析的為UDP協議的53端口,負責DNS服務器之間的區域傳送采用TCP的53端口。
BIND
BIND(Berkeley Internet Name Domain)是DNS協議的開源實現。由兩部分組成。
- 域名服務器(Name Server):
提供域名解析服務。 - 解析器(Resolver):
負責發起查詢和向調用他的應用返回IP地址或者別名等消息。
DNS服務器的分類
- 權威域名服務器
負責授權域下面的域名解析服務,由上級權威域名服務器使用NS記錄進行授權。
按照授權的層級划分,最多127層:
1)根域
使用.
表示,通常在瀏覽器輸入時省略。負責對.com
,.cn
,.org
等頂級域進行授權,全球13個邏輯根服務器。
2)頂級域
類似於.com
,.cn
,.org
3)二級域
sina.com
,baidu.com
,aliyun.com
主DNS:
每個區域名字服務器,保存着本區域的正式數據。
從DNS:
通過“區域傳送”操作,通過主服務器上獲取它的數據。
-
緩存域名服務器
通過依次查詢根域-頂級域-二級域的方式來解析dns條目,同時根據DNS條目的TTL值進行緩存。 -
轉發域名服務器
在接收查詢請求時,不向根發起請求,而是轉發到指定的上級DNS服務器,而且不進行任何緩存,僅轉發。
權威應答:由直接負責的DNS服務器返回解析。
非權威應答:從緩存中讀取記錄來回答查詢,可能數據已過期。
DNS查詢類型
遞歸查詢:
- 客戶端解析器把請求發送給本地DNS服務器;
- 本地服務器代替客戶端,向根域-頂級域-二級域查詢,並把最終結果返回給用戶。
迭代查詢:
- 客戶端向本地DNS發起查詢;
- 本地DNS不直接去幫助客戶端查詢,而是發給客戶端一個可以解析本次請求的DNS服務器的列表,再由客戶端再次向這些列表中的DNS發起請求,從而查到結果。
DNS資源記錄類型
資源記錄的定義格式:
name [TTL] IN RR_TYPE value
注意:
- TTL可以從全局繼承;
- @可用於引用當前區域的名字
- 相鄰的兩條記錄其name相同時,后面的可省略;
SOA
Start Of Authority,這種record 放在zone file 一開始的地方,每一個zone只能有一個SOA,而且一定是記錄中第一個“記錄”,它描述這個zone負責的name server,version number…等資料,以及當slave server 要備份這個zone 時的一些參數。
例:
xiaohou.com. 86400 IN SOA xiaohou.com. root.xiaohou.com. (
2017031901 ; serial
2H ; refresh
10M ; retry
1W ; expire
1D ; negative answer ttl
)
serial:序列號,作為主從更新的依據,主服務器數據庫內容發生變化時,其版本號遞增;
refresh:從服務器每多久到主服務器檢查序列號更新狀況;
retry: 從服務器從主服務器請求同步解析庫失敗時,間隔多久再次嘗試連接;
expire:過期時長,從服務器始終聯系不到主服務器時,多久之后放棄從主服務器同步數據;停止提供服務;
negative answer ttl:否定答案的緩存時長,客戶端緩存的時間,設定過長會導致無法立即生效,設定過短導致客戶端頻繁請求
NS
name server,用來指定操作的DNS服務器名稱,需注意的是不可以用IP地址表示。
例:
xiaohou.com. 86400 IN NS ns1.xiaohou.com.
xiaohou.com. 86400 IN NS ns2.xiaohou.com.
MX
mail exchanger,設定區域中郵件服務器(SMTP)的主機。 每一個值前面由一個數字,是該主機郵件傳遞時的優先次序,此值越低表示有越高的郵件處理優先權,取值范圍0-99。
例:
xiaohou.com. IN MX 10 ns1.xiaohou.com.
IN MX 20 ns2.xiaohou.com.
A
address,將域名解析到IPv4的IP地址。
例:
www.xiaohou.com. IN A 10.0.7.100
AAAA
將域名解析到IPv6的IP位址。
例:
www.xiaohou.com. 86400 IN AAAA 3ffe: :bbb:93:5
PTR
pointer,將IP地址轉換成主機的FQDN。
例:
100.7.0.10.in-addr.arpa. IN PTR www.xiaohou.com.
CNAME
canonical name,別名
例:
blog.xiaohou.com. IN CNAME www.xiaohou.com.
配置DNS服務器(BIND)
環境
IP地址 | 操作系統 | 主機名 |
---|---|---|
10.0.7.1 | Centos7 | 主DNS服務器 |
10.0.7.2 | Centos7 | 從DNS服務器 |
10.0.7.3 | Centos7 | 子域服務器 |
程序包:
bind-libs:被bind和bind-utils包中的程序共同用到的庫文件;
bind-utils:bind客戶端程序集,例如dig, host, nslookup等;
bind:提供的dns server程序、以及幾個常用的測試程序;
bind-chroot:選裝,讓named運行於jail模式下;
rndc:remote name domain controller,默認與bind安裝再同一主機,且只能通過127.0.0.1來連接named進程,提供輔助管理功能,服務監聽於tcp的953端口。
主節點 (10.0.7.1)
安裝bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
zone-statistics yes;
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作為授權域名服務器 no,作為一個遞歸DNS服務器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
//錯誤日志
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
//查詢日志
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
//正向解析
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-update { none; };
};
//反向解析
zone "7.0.10.in-addr.arpa" IN {
type master;
file "10.0.7.arpa.zone";
allow-update { none; };
};
配置正向區域/var/named/xiaohou.com.zone
$TTL 86400
;資源記錄簡寫時補全的后綴,如果不指定默認為zone中定義的
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031901 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
配置反向區域/var/named/10.0.7.arpa.zone
$TTL 1D
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
11 ; serial
1H ; refresh
5M ; retry
3M ; expire
10H ) ; minimum
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
1 IN PTR ns1.xiaohou.com.
2 IN PTR ns2.xiaohou.com.
3 IN PTR mx1.xiaohou.com.
4 IN PTR mx2.xiaohou.com.
啟動
systemctl start named
systemctl enable named
如果需要使用chroot啟動
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
從節點 (10.0.7.2)
安裝bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作為授權域名服務器 no,作為一個遞歸DNS服務器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type slave;
masters { 10.0.7.1; };
file "slaves/xiaohou.com.zone";
};
zone "7.0.10.in-addr.arpa" IN {
type slave;
masters { 10.0.7.1; };
file "slaves/10.0.7.arpa.zone";
};
啟動
systemctl start named
systemctl enable named
如果需要使用chroot啟動
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
子域授權
子域授權,是DNS的分布式的一種實現。在原有的zone上划出一個子域,並給新DNS服務器管理。如果有客戶端請求解析在此區域中的域名,則只要找新的子DNS服務器,以便減輕主DNS的壓力。
配置主服務器
首先在主域服務器添加子域:
vim /var/named/xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
記得修改版本號,保證從服務器獲取更新;
重新載入配置
rndc reload
配置子域服務器(10.0.7.3)
安裝bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作為授權域名服務器 no,作為一個遞歸DNS服務器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
zone "blog.xiaohou.com" IN {
type master;
file "blog.xiaohou.com.zone";
allow-update { none; };
};
配置/var/named/blog.xiaohou.com.zone
$TTL 1D
$ORIGIN blog.xiaohou.com.
@ IN SOA ns1.blog.xiaohou.com. root.blog.xiaohou.com. (
2017031901 ;Serial
1H ;Refresh
10M ;Retry
3D ;Expire
1D ;Minimum TTL
)
IN NS ns1
IN NS ns2
ns1 IN A 10.0.7.3
ns2 IN A 10.0.7.4
@ IN A 10.0.7.5
www IN A 10.0.7.6
mx1 IN A 10.0.7.7
mx2 IN A 10.0.7.8
啟動
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
DNS轉發
區域轉發:
配置在zone段,僅轉發對某特定區域的解析請求;
zone "ZONE_NAME" IN {
type forward;
forward first;
forwarders { 223.5.5.5;223.6.6.6; };
};
forward選項:
- first:首先轉發;轉發器不響應時,自行去迭代查詢;
- only:只轉發;
全局轉發:
配置在options段,針對凡本地沒有通過zone定義的區域查詢請求,通通轉給某轉發器;
vim /etc/named.conf
options {
forward only;
forwarders { SERVER_IP; };
};
全局轉發(10.0.7.1)
vim /etc/named.conf
options {
forward first;
forwarders { 223.5.5.5;223.6.6.6; };
};
區域轉發(10.0.7.3)
vim /etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type forward;
forward only;
forwarders { 10.0.7.1; };
};
訪問控制ACL
把一個或多個地址歸並為一個集合,並通過一個統一的名稱調用;
acl acl_name {
ip;
net/perlen;
}
四個內置的acl:
- none:沒有一個主機
- any:任意主機
- local:本機
- localnet: 本機的IP同掩碼運算后得到的地址
注意: 只能先定義,后使用,通常放置在配置文件最前面
訪問控制的指令:
- allow-query{}: 允許查詢的主機
- allow-transfer{}: 允許區域傳送
- allow-recursion{}: 通常定義在全局options段,允許遞歸的主機
- allow-update{}: 允許更新區域庫的內容,大多數情況為none
配置acl實現訪問控制,區域傳送只允許slaves定義的主機,所有主機的查詢操作都不被允許。
配置主服務器10.0.7.1
vim /etc/named.conf
acl slaves {
10.0.7.2;
};
vim /etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-query { none; };
allow-transfer { slaves; };
allow-update { none; };
};
配置允許遞歸的主機
vim /etc/named.conf
options {
recursion yes;
allow-recursion { 10.0.7.0/24; };
};
視圖view
我們一般常用視圖拿來構建智能DNS,一個bind服務器可以定義多個view,每個view中可以定義一個或多個zone,每個view用來匹配一組客戶端。
- view實現智能DNS:
多個view內可能需要對同一區域進行解析,但使用不同通的區域解析文件;
注意: view依據的來源地址並不是客戶端的最終地址,而是客戶端上配置的DNS節點的地址,如果上海聯通的用戶配置了北京電信的DNS,那么可能就會被調度到電信節點
用法:
view view_name {
match-clients { };
}
注意:
一旦啟用了view,所有的zone都只能定義在view中;
僅在允許遞歸請求的客戶端所在的view中定義根區域;
客戶端請求到達時,自上而下對符合view的客戶端列表進行匹配;
配置10.0.7.1主服務器,named.conf
vim /etc/named.conf
acl slaves {
10.0.7.2;
};
acl shanghai {
10.0.7.2;
};
acl beijing {
10.0.7.3;
};
acl office {
10.0.0.0/16;
};
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//作為授權域名服務器 no;
//作為一個遞歸DNS服務器 yes;
recursion yes;
allow-recursion { office; };
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
forwarders { 223.5.5.5;223.6.6.6; };
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置10.0.7.1主服務器,named.rfc1912.zones
vim /etc/named.rfc1912.zones
view shanghai {
match-clients { shanghai; };
zone "xiaohou.com" {
type master;
file "sh.xiaohou.com.zone";
};
};
view beijing {
match-clients { beijing; };
zone "xiaohou.com" {
type master;
file "bj.xiaohou.com.zone";
};
};
view office {
match-clients { office; };
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; };
};
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-update { none; };
allow-transfer { slaves; };
allow-query { any; };
};
zone "7.0.10.in-addr.arpa" IN {
type master;
file "10.0.7.arpa.zone";
allow-update { none; };
};
};
區域配置文件,sh.xiaohou.com.zone
vim /var/named/sh.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
區域配置文件
vim /var/named/bj.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 172.16.1.17
www IN A 172.16.1.18
mx1 IN A 172.16.1.19
mx2 IN A 172.16.1.20
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
如何分析用戶是移動還是聯通,北京還是上海?
答:我們可以使用純真IP數據庫進行解析。
DNS客戶端工具使用
dig
用法
dig [-t type] [@server] [domain] +[no]trace
示例:
dig -t A @10.0.7.1 www.xiaohou.com
dig -t NS @10.0.7.1 www.xiaohou.com
#跟蹤解析過程
dig -t A @10.0.7.1 www.biadu.com +trace
#反向解析
dig -x 10.0.7.3 @10.0.7.1
模擬完全區域傳送:
dig -t axfr @10.0.7.2 xiaohou.com
rndc
rndc監聽於tcp的953端口,用於管理員對dns服務器進行控制
[root@node2 ~]# rndc status
#服務器和軟件的版本
version: 9.9.4-RedHat-9.9.4-38.el7_3.2 <id:8f9657aa>
#cpu數量
CPUs found: 2
#工作線程數
worker threads: 2
#upd監聽的端口個數
UDP listeners per interface: 2
#zone的個數
number of zones: 8
#debug的級別
debug level: 0
#區域傳送
xfers running: 0
xfers deferred: 0
#soa的查詢情況
soa queries in progress: 0
#查詢日志是否啟用
query logging is ON
#遞歸的客戶端
recursive clients: 0/0/1000
#tcp 客戶端
tcp clients: 0/100
#服務是否正常
server is up and running
其他選項
reload 重新裝入配置文件和區域
reload zone [class [view]] 重新裝入單個區域
refresh zone [class [view]] 安排區域的立即維護
reconfig 僅重新裝入配置文件和新區域
stats 將服務器統計信息寫入統計文件中
querylog 切換查詢日志
dumpdb 將高速緩存轉儲到轉儲文件 (named_dump.db)
stop 將暫掛更新保存到主文件並停止服務器
halt 停止服務器,但不保存暫掛更新
trace 將調試級別增加一級
trace level 更改調試級別
notrace 將調試級別設置為 0
flush 刷新服務器的所有高速緩存
flush [view] 為某一視圖刷新服務器的高速緩存
status 顯示服務器的狀態
restart 重新啟動服務器(尚未實現)
bind壓測工具
wget ftp://ftp.isc.org/isc/bind9/9.11.0-P3/bind-9.11.0-P3.tar.gz
tar xf bind-9.11.0-P3.tar.gz
cd bind-9.11.0-P3/contrib/queryperf/
./configure && make
編寫測試文件
vim testdns.txt
www.baidu.com A
www.qq.com A
www.xiaohou.com A
www.sina.com A
www.youku.com A
www.aliyun.com A
測試結果
[root@node1 queryperf]# ./queryperf -d testdns.txt -s 10.0.7.1
DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $
[Status] Processing input data
[Status] Sending queries (beginning with 10.0.7.1)
[Timeout] Query timed out: msg id 1
[Timeout] Query timed out: msg id 4
[Timeout] Query timed out: msg id 5
[Timeout] Query timed out: msg id 6
[Status] Testing complete
Statistics:
Parse input file: once
Ended due to: reaching end of file
Queries sent: 6 queries
Queries completed: 6 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries
RTT max: 4.270617 sec
RTT min: 0.067555 sec
RTT average: 2.169086 sec
RTT std deviation: 2.101550 sec
RTT out of range: 0 queries
Percentage completed: 100.00%
Percentage lost: 0.00%
Started at: Tue Mar 21 23:56:27 2017
Finished at: Tue Mar 21 23:56:32 2017
Ran for: 5.000125 seconds
Queries per second: 1.199970 qps
其他詳細的配置可以查看:Bind9 管理員參考手冊
DNS監控
- 系統監控:
CPU,內存,網絡IO等監控 - named進程監控:
判斷named進程是否正常運行 - 解析服務監控:
使用dig命令進行解析,監控