前言
DNS(Domain Name Server,域名服務器)是進行域名(domain name)和與之相對應的IP地址 (IP address)轉換的服務器。DNS中保存了一張域名(domain name)和與之相對應的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一臺計算機或計算機組的名稱,用于在數據傳輸時標識計算機的電子方位(有時也指地理位置)。域名是由一串用點分隔的名字組成的,通常包含組織名,而且始終包括兩到三個字母的后綴,以指明組織的類型或該域所在的國家或地區。
概述
域名
域名:域名是Internet上某一臺計算機或計算機組的名稱,用于在數據傳輸時標識計算機的電子方位(有時也指地理位置)。域名是由一串用點分隔的名字組成的,通常包含組織名,而且始終包括兩到三個字母的后綴,以指明組織的類型或該域所在的國家或地區。
域名解析:
域名解析是指將域名解析為IP的過程。簡單來說,DNS就像是一個通訊錄,AnyISalIn的電話是1829888,有了通訊錄,我們只需通過輸入AnyISalIn這個名字就能夠自動撥打其電話。DNS主要是用來定義
FQDN:完整主機名。
正向解析 FQDN ---> IP
反向解析 IP--->FQDNIP地址和域名的關系。
DNS資源記錄類型
SOA:起始授權記錄,一個區域的解析庫中有且只能有一條SOA記錄,必須為解析庫中的第一條記錄,定義主DNS服務器地址和相關事件時間定義。
A :實現FQDN---->IPV4
AAAA:FQDN------>IPV6
MX:標明提供郵件服務的主機
NS:標明當前域內的DNS服務器
AAAA:FQDN ==> IPv6
CNAME:Canonical Name,別名記錄
PTR:IP ==> FQDN
DNS解析答案類型
肯定答案:正確解析了請求的內容
否定答案:請求的條目不存在等原因無法返回結果
權威答案:通過迭代的方式從所查詢域名的所在域的DNS服務器返回的結果
非權威答案:請求的DNS服務器緩存的結果
DNS資源記錄定義方法
A記錄:IP IN A Value ; 示例:192.168.1.1 IN A www.anyisalin.com.
NS記錄:domain IN NS Value; 示例:anyisalin.com. IN NS ns1.anyisalin.com. #一條NS記錄必須要有一條與之對應的A記錄
MX記錄:domain IN NS priority Value; 示例:anyisalin.com. IN MX 10 mail1.anyisalin.com. #一條MX記錄必須要有與之對應的A記錄, 優先級0-99,越低優先級越高
PTR記錄:IP.in-addr.arpa. IN PTR Value; 示例:1.1.168.192.in-addr.arpa. IN PTR www.anyisalin.com. #PTR記錄的寫法比較詭異,我們在后面進行敘述
AAAA記錄:和A記錄相似,只是將IPv4地址換為IPv6
(二)DNS域名結構
DNS域名結構
根域 ,一級域名,二級域名....... 最多27級域名
域名查詢
遞歸查詢
遞歸查詢是將查詢的封包發送出去問,就等待正確名稱的正確響應,這種方式之處理響應回來的封包是否正確響應或是說是找不到該名稱的錯誤信息。
迭代查詢
(三) BIND安裝和基礎配置
前面我們介紹了DNS的一些基礎知識,但是DNS是一種模型,需要使用軟件去實現。BIND(Berkeley Internet Name Domain)就是一伴隨著DNS出生到現在的軟件。
安裝bind
yum install -y bind bind-utils
修改配置文件:
vim /etc/named.conf #/etc/named.conf 里面有一些默認的配置,先不用管,只要改一下我們需要的配置即可
options {
listen-on port 53 { 192.168.1.80; };
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 { 192.168.1.80; };
......
將listen-on 改成本地的IP
將allow-query 添加本地的IP
配置正向解析
在 /etc/named.rfc1912.zones 里面定義一個Zone (注:原來的默認文件先不用管,直接在文件的末尾添加即可)
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
};
其中的zone文件(deepnet.com.zone)描述了域名服務器中包含的主機,所提供的服務類型等信息,BIND通過將zone文件中的信息加載到內存數據結構中并有效組織起來,然后對外部的DNS請求提供驗證和查詢請求。需要注意的是,zone文件的格式不是由BIND制定的,而是DNS標準文檔制定的(見RFC1035)。
創建區域解析庫文件。
$TTL 600
$ORIGIN deepnet.com.
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列號
1H ;刷新時間
5M ;重試時間
1W ;超時時間
10M ;否定答案緩存TTL值
)
IN NS ns1
ns1 IN A 192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.141
www IN A 192.168.1.142
cname IN CNAME www
deepnet.com.:這是區域的根。這表明該區域文件用于 deepnet.com 域名。通常,你會看到這個用 @ 代替,它只是一個占位符,表示我們之前定義的 $ORIGIN 變量的內容。
IN SOA:”IN” 部分表示互聯網(它會出現在許多記錄中)。 SOA 是表示這是開始權限記錄。
ns1.deepnet.com.:這定義了該域的主名稱服務器。名稱服務器可以是主服務器或從服務器,如果配置了動態 DNS,就像這里,則一個服務器需要是 “主服務器”。如果你未配置動態 DNS,那么這只是你其中一個主名稱服務器。
admin.deepnet.com.:這是這個區域文件管理員的郵箱地址。郵箱地址的 @ 這里用一個 . 代替。如果你的名字中也有 . 它會用 \ 代替。(比如 your.name@deepnet.com變成 your\name@deepent.com
20181207:這是區域文件的序列號。每次編輯區域文件時,必須增加此序列號以使區域文件能夠正確傳播。從服務器將檢查主服務器的區域序列號是否大于它們在系統上的序列號。如果是,它請求新的區域文件,如果不是,它繼續服務原始文件。
1h:這是區域的刷新間隔。這是從服務器向主服務器輪詢檢查區域文件是否變更之間等待的時間量。
5m:這是此區域的重試間隔。如果從機在刷新周期結束時無法連接到主機,則它將等待此時間并重試輪詢主機。
3w:這是到期時間。如果從服務器在此時間內無法與主服務器聯系,則它不再作為此區域的權威來源的返回響應。
1oM:這是名稱服務器在此文件中找不到所請求的名稱時緩存找不到結果的時間量。
IN NS ns1
ns1 IN A 192.168.1.80:表示該zone配置了一個ns1.deepnet.com的域名,該域名的ip是192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.141 該zone配置了一個郵件服務器,域名是mail1.deepnet.com,IP地址是192.168.1.141
www IN A 192.168.1.142 該zone配置了一個對外的萬維網服務器,域名www.deepnet.com,IP地址為www.deepnet.com ,別名為cname.deepnet.com
啟動測試服務
systemctl start named
dig -t A www.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33382
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Mon Dec 10 19:25:36 CST 2018
;; MSG SIZE rcvd: 94
配置反向解析
在 /etc/named.rfc1912.zones 里面定義一個Zone (注:原來的默認文件先不用管,直接在文件的末尾添加即可)
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
};
配置/var/named/1.168.192.zone 文件
$TTL 600
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列號
1H ;刷新時間
5M ;重試時間
1W ;超時時間
10M ;否定答案緩存TTL值
)
IN NS ns1.deepnet.com.
IN MX 10 mail1.deepnet.com
80 IN PTR ns1.deepnet.com.
141 IN PTR mail1.deepnet.com.
142 IN PTR www.deepnet.com.
80 IN PTR ns1.deepnet.com. 表示192.168.1.80這個地址會解析到ns1.deepnet.com.
141 IN PTR mail1.deepnet.com. 表示192.168.1.141這個地址會解析到mail1.deepnet.com.
142 IN PTR www.deepnet.com. 表示192.168.1.142這個地址會解析到www.deepnet.com.
啟動測試服務
systemctl restart named
dig -x 192.168.1.142 @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -x 192.168.1.142 @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14139
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;142.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
142.1.168.192.in-addr.arpa. 600 IN PTR www.deepnet.com.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 1 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Mon Dec 10 19:33:57 CST 2018
;; MSG SIZE rcvd: 118
(四) 主從服務器的配置
從服務器配置
從服務器的配置就比較簡單了,首先同樣在/etc/named.conf配置ip,然后在/etc/named.rfc1912.zones 配置文件下增加如下配置:
zone "deepnet.com" IN {
type slave;
file "slaves/deepnet.com.zone";
masters{192.168.1.80;};
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
file "slaves/1.168.192.zone";
masters{192.168.1.80;};
};
啟動服務驗證
systemctl restart named
dig -t A www.deepnet.com @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7.centos <<>> -t A www.deepnet.com @192.168.1.143
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22251
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:23:00 CST 2018
;; MSG SIZE rcvd: 94
dig -x 192.168.1.142 @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-37.el7.centos <<>> -x 192.168.1.142 @192.168.1.143
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53397
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;142.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
142.1.168.192.in-addr.arpa. 600 IN PTR www.deepnet.com.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 0 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:23:25 CST 2018
;; MSG SIZE rcvd: 118
主從同步數據的安全性
DNS服務器的數據同步默認是沒有限定主機的,也就是說,網絡上只要有一臺DNS服務器向你的DNS服務器請求數據,都能實現數據同步,那么這樣就相當的不安全了。我們可以使用一個選項allow-transfer,指定可以同步數據的主機IP。主DNS服務器的數據可以給別的服務器同步,相對的,輔助DNS服務器的數據也是可以給其它輔助DNS服務器同步,于是,所有的主從DNS服務器都要設置該參數。
修改主服務器上的/etc/named.rfc.1912.zones 文件
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
allow-transfer{192.168.1.143;};
};
zone "1.168.192.in-addr.arpa" IN {
type master
file "1.168.192.zone";
allow-transfer{192.168.1.143;};
};
重啟服務用dig測試
systemctl restart named
dig -t axfr deepnet.com @192.168.1.143
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t axfr deepnet.com @192.168.1.143
;; global options: +cmd
deepnet.com. 600 IN SOA ns1.deepnet.com. admin.deepnet.com. 20181207 3600 300 604800 600
deepnet.com. 600 IN NS ns1.deepnet.com.
cname.deepnet.com. 600 IN CNAME www.deepnet.com.
mail1.deepnet.com. 600 IN A 192.168.1.141
ns1.deepnet.com. 600 IN MX 10 mail1.deepnet.com.
ns1.deepnet.com. 600 IN A 192.168.1.80
www.deepnet.com. 600 IN A 192.168.1.142
deepnet.com. 600 IN SOA ns1.deepnet.com. admin.deepnet.com. 20181207 3600 300 604800 600
;; Query time: 1 msec
;; SERVER: 192.168.1.143#53(192.168.1.143)
;; WHEN: Mon Dec 10 20:47:25 CST 2018
;; XFR size: 8 records (messages 1, bytes 219)
在從服務器修改配置如下:
zone "deepnet.com" IN {
type slave;
file "slaves/deepnet.com.zone";
masters{192.168.1.80;};
allow-transfer{none};
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
file "slaves/1.168.192.zone";
masters{192.168.1.80;};
allow-transfer{none};
};
(五)子域授權
什么是子域
每一個大域,里面都會有若干個小域。比如deepnet.com就是一個大域,里面會有www域(即www.deepnet.com),會有bbs域,會有movies域,會有data域等等等等。如果土豪企業或個人,可以不用域名服務商提供的DNS服務器,而自己搭建企業DNS服務器,但是需要把自己的DNS服務器的NS指向域名服務商的DNS服務器。如果這個企業壕的過分,壕的慘無人道。可以專門給自己的子域配上DNS服務器。
父域服務器配置
在服務器下的/var/named/deepnet.com.zone文件下增加如下配置:
blog.deepnet.com. IN NS dns.blog.deepnet.com.
dns.blog.deepnet.com. IN A 192.168.1.82
子域服務器配置(192.168.1.82)
在子域(82)服務器上修改配置文件/etc/named如下:
vim /etc/named.conf #/etc/named.conf
options {
listen-on port 53 { 192.168.1.82;192.168.1.80; };
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 { 192.168.1.82;192.168.1.80; };
......
在 /etc/named.rfc1912.zones 里面定義一個Zone (注:原來的默認文件先不用管,直接在文件的末尾添加即可)
zone "blog.deepnet.com" IN {
type master;
file "blog.deepnet.com.zone";
};
創建zone文件/var/named/blog.deepneet.con.zone
$TTL 600
@ IN SOA dns.blog.deepnet.com. dnsadmin.blog.deepnet.com. (
2018120101
1H
5M
3D
1D )
@ IN NS dns.blog.deepnet.com.
dns IN A 192.168.1.82
www IN A 192.168.1.146
重啟80和82上的bind服務器,在80上運行dig命令:
dig -t NS blog.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t NS blog.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54774
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;blog.deepnet.com. IN NS
;; ANSWER SECTION:
blog.deepnet.com. 600 IN NS dns.blog.deepnet.com.
;; Query time: 3 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 11:33:16 CST 2018
;; MSG SIZE rcvd: 63
(六)ACL (Access control list)
acl顧名思義就是訪問控制列表,可以將一個或多個地址歸并為一個命名的集合,隨后通過此名稱即可對該集合內的所有主機實現統一調用。
在bind程序中,acl格式如下:
acl acl_name {
ip;
ipnet/prelen;
};
其中,acl_name是自定義名稱,ip指的是IP地址,ipnet/prelen指的是IP網段。
(七) DNS服務器View功能的實現。
什么是View功能?
View功能提供了不同用戶訪問同一個域名,把域名解析成不同的IP地址,使用戶能夠訪問離他最近的服務器上的數據。例如,當我們網站的數據同步在兩臺web服務器上時,一臺是電信服務器,一臺是網通服務器,那么我們肯定希望全國訪問我們網站的用戶在打開網站的時候,能夠自動實現,電信用戶訪問電信服務器,網通用戶訪問網通服務器。配置這種情況的前提是,web服務器必須要有一個電信的IP地址和一個網通的IP地址。DNS服務器的這種解析功能通常也被稱之為智能解析。
DNS服務器的視圖通常在配置文件中是使用view實現的。把要使用某些IP地址作單獨訪問的zone區域,統一放在一個命名的view段落中,并且在view中定義請求的IP地址或IP地址段,把IP地址寫入match-clients選項中。如果像上面說的,區分電信和網通路線的話,那么可以使用兩個acl訪問控制列表寫上電信或網通IP地址,定義電信網通路線,把acl名字寫入view段落match-clients選項中。如下所示:
acl telecomip{ tele_IP; ... };
acl netcomip{ net_IP; ... };
view telecom {
match-clients { telecomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.telecom";
};
};
view netcom {
match-clients { netcomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};
(1)、如果使用了視圖的功能,那么配置文件中的所有zone區域都要必須寫在視圖里面,如,配置文件里默認要配置的三個區域,根、127.0.0.1、1.0.0.127.in-addr.arpa都要寫入視圖。
(2)、在acl中定義IP地址,IP地址的寫法可以是單個IP地址也可以是一個IP地址段加掩碼,如:192.168.0.0/24。
(3)、視圖是根據配置文件從上往下匹配的,所以希望優先訪問的資源記錄文件,區域應該盡量寫前面。
(4)、如果定義的若干個視圖的IP地址不全的話,那么可以在最后定義一個默認視圖,match-clients選項中的IP地址寫上any,代表如果此次訪問的IP地址上面沒有一個能匹配到,則在此處歸類。
我們在主服務器的/etc/named.rfc1912.zones 修改配置如下(為了方便我們把原來默認的zone干掉)。
acl local {192.168.1.80;};
acl net {192.168.1.82;};
view newcom {
match-clients {net;};
zone "deepnet.com" IN {
type master;
file "deepnet.com.net.zone";
};
};
view localcom {
match-clients {local;};
zone "deepnet.com" IN {
type master;
file "deepnet.com.zone";
allow-transfer {192.168.1.143;};
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
allow-transfer {192.168.1.143;};
};
};
為了簡單一點/etc/named.config 訪問控制注釋掉
// allow-query { localhost; 192.168.1.80; };
在deepnet.com.net.zone文件中配置如下:
$TTL 600
$ORIGIN deepnet.com.
@ IN SOA ns1.deepnet.com. admin.deepnet.com. (
20181207 ;序列號
1H ;刷新時間
5M ;重試時間
1W ;超時時間
10M ;否定答案緩存TTL值
)
IN NS ns1
ns1 IN A 192.168.1.80
IN MX 10 mail1
mail1 IN A 192.168.1.142
www IN A 192.168.1.141
cname IN CNAME www
可以看到對mail1和www的IP進行了一個小的調整,重啟named服務。
在80上用dig命令驗證:
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47550
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.142
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 2 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 14:35:16 CST 2018
;; MSG SIZE rcvd: 94
在82上面執行dig
dig -t A www.deepnet.com @192.168.1.80
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A www.deepnet.com @192.168.1.80
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44323
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.deepnet.com. IN A
;; ANSWER SECTION:
www.deepnet.com. 600 IN A 192.168.1.141
;; AUTHORITY SECTION:
deepnet.com. 600 IN NS ns1.deepnet.com.
;; ADDITIONAL SECTION:
ns1.deepnet.com. 600 IN A 192.168.1.80
;; Query time: 1 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Tue Dec 11 14:26:25 CST 2018
;; MSG SIZE rcvd: 94
可以看到在80上 解析www.deepnet.com,其解析出來的地址是192.168.1.142,而在82解析出來的地址是192.168.1.141