為什么需要DNS
域名解析服務,全稱Domain Name Service,簡稱為DNS。
DNS是一項基礎服務,那他有什么用呢?我們為什么需要他?
他最主要的作用是將全稱域名轉換成IP。
試想一下,假如上網的時候,在瀏覽器上面的網址都是IP會是什么樣的一個狀況?
可能我們就需要像電話本一樣,把他們都記錄下來,需要訪問的時候再查看。
因為他們都是IP地址數字,記錄起來不像單詞一樣。
事實上也確實有這么做過,例如我們主機的hosts文件。
[root@bc ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.201 node1 node1.bc.com
192.168.2.211 node1 node1.bc.com
192.168.2.221 node1 node1.bc.com
192.168.2.202 node2 node2.bc.com
192.168.2.212 node2 node2.bc.com
192.168.2.222 node2 node2.bc.com
192.168.2.203 node3 node3.bc.com
192.168.2.213 node3 node3.bc.com
192.168.2.223 node3 node3.bc.com
192.168.2.204 node4 node4.bc.com
192.168.2.214 node4 node4.bc.com
192.168.2.224 node4 node4.bc.com
這樣我們在瀏覽器中輸入node1.bc.com
就會自動地轉換成192.168.2.201
這個地址。
這樣的話,即使這個IP地址多么難記,我們要訪問的時候只需要鍵入這個地址就可以了。
那我們有hosts文件了,為什么需要DNS服務呢?
因為hosts文件就像電話簿一樣,是寫死的。
如果有一天,對方的IP地址換了。我們鍵入同樣的域名就訪問不了了。
這個就跟別人換了電話號碼,但是你的手機上的電話簿不會即時更新一樣。
而DNS則是一個在線同步的電話簿,對方改了電話號碼,我們也能夠連通。
當我們在瀏覽器上鍵入網址,名稱解析實際上做了什么?
1.首先,為了解析域名他回去才查找本地的hosts文件。
假如hosts文件中有對應的條目,直接就解析成對應的IP地址訪問了。
2.當hosts文件中沒有對應的記錄的時候,就會去查找本地的DNS服務器。
假如你家連的是電信網絡,這個本地的DNS記錄一般是由電信維護的。
你訪問本地DNS服務器,DNS服務器有記錄并返回一個記錄。這個叫遞歸查詢。
當然,遞歸查詢在DNS服務器中是可以關閉的。
3.當本地DNS服務器中也沒有的對應記錄的時候,就回去找根服務器。
根服務器是最頂級的域,總共有13個。
例如訪問www.example.com的時候:
a.hosts文件中沒有記錄
b.本地dns服務器中也沒有記錄。
c.就會去找根服務器,從13個服務器中,從中找到管理com.域名的DNS服務器。
假如,管理com.的服務器告訴我們需要我們去找ns1.example.comDNS服務器。
最后本地dns在ns1.example.com中查找到www.example.com的域名記錄。
這個過程,就叫做迭代查詢。
舉個通俗的例子,學生問老師一個問題,老師告訴他答案。這叫遞歸查詢。
假如老師也不知道答案,這時老師去問其他老師。這叫迭代查詢。
DNS服務器中的資源類型
SOA記錄:Start Of Authority,起始授權記錄;
SOA記錄包含以下信息:
(1) 當前區域的主DNS服務器的FQDN,也可以使用當前區域的名字
(2) 當前區域管理員的郵箱地址
但地址中不能使用@符號,一般用.替換@
如bocai.example.com代表bocai@example.com
(3)主從服務協調屬性的定義以及否定的答案的統一的TTL
區域解析庫有且僅能有一個SOA記錄,而必須為解析庫的第一條記錄;
SOA記錄的一個示例:
bc.com. 86400 IN SOA ns1.bc.com. nsadmin.bc.com. (
2015042201 ;序列號
2H ;刷新時間
10M ;重試時間
1W ;過期時間
1D ;否定答案的TTL值
)
A記錄:internet Address
作用是將全稱域名解析成IP地址。
node1.bc.com. IN A 192.168.2.201
node2.bc.com. IN A 192.168.2.202
PTR記錄: PoinTeR
作用是將IP地址解析成全稱域名。
4.3.2.1.in-addr.arpa. IN PTR www.bc.com
有特定格式,把IP地址反過來寫,
1.2.3.4,要寫作4.3.2.1;而有特定后綴:in-addr.arpa.,
所以完整寫法為:4.3.2.1.in-addra.arpa.
NS記錄: Name Server,
作用是標明當前區域的DNS服務器
bc.com. IN NS ns1.bc.com.
bc.com. IN NS ns2.bc.com.
CNAME記錄:Canonical Name,別名記錄
作用是將多個名字映射到同一臺計算機。
web.bc.com. IN CNAME www.bc.com.
mail.bc.com. IN CNAME www.bc.com.
www.bc.com. IN A 1.1.1.1
這樣的話,當在瀏覽器中鍵入web.bc.com或者mail.bc.com實際上都是訪問1.1.1.1
這樣有利于修改的時候可以只修改一條A記錄就達成目的。
MX記錄: Mail eXchanger,郵件交換器
記錄是郵件交換記錄,它指向一個郵件服務器,
用于電子郵件系統發郵件時根據收信人的地址后綴來定位郵件服務器。
bc.com. IN MX 10 mx1.bc.com.
這個一般用來設置個性郵箱名字才使用的
例如你的個性域名是user1@bc.com,實際上是交給了mx1.bc.com這個郵件服務器去處理。
搭建兩個DNS服務器并配置主從復制
主機名 | 主機地址 | 角色 |
---|---|---|
node1 | 192.168.2.201 | 主DNS服務器 |
node2 | 192.168.2.202 | 從DNS服務器 |
以上節點均關閉了iptables和selinux
一、修改配置文件:
1./etc/named.conf
這個配置文件用于設置全局配置
[root@node1 named]# vim /etc/named.conf
options {
listen-on port 53 { 192.168.2.201;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 { any; };
dnssec-enable no;
dnssec-validation no;
#可以用于防止DNS毒化,但是需要購買證書。
}
#定義一個叫bc.com的域,也就是說這臺DNS服務器可以解析這個域
#這里的file使用了相對路徑,也就是需要在/var/named/bc.com.zone這個文件里面定義資源記錄。
注意:
listen-on port 寫成0.0.0.0并不能監聽在全部網址的53號端口上.
往后的相對路徑全部都是相對于directory而言的。
2./etc/named.rfc1912.zones
用于設置服務器可以解析的域
zone "bc.com" IN {
type master;
file "bc.com.zone";
};
3.定義資源記錄
[root@node1 named]# vim /var/named/bc.com.zone
$TTL 86400
$ORIGIN bc.com.
@ IN SOA ns1.bc.com. admin.bc.com (
2016042201
1H
5M
7D
1D )
IN NS ns1
IN NS ns2
ns1 IN A 192.168.2.201
ns2 IN A 192.168.2.202
node1 IN A 192.168.2.201
node1 IN A 192.168.2.211
node1 IN A 192.168.2.221
node2 IN A 192.168.2.202
node2 IN A 192.168.2.212
node2 IN A 192.168.2.222
node3 IN A 192.168.2.203
node3 IN A 192.168.2.213
node3 IN A 192.168.2.223
node4 IN A 192.168.2.204
node4 IN A 192.168.2.214
node4 IN A 192.168.2.224
* IN A 192.168.2.201
檢查腳本的語法錯誤(不檢查邏輯上的錯誤)
[root@node1 named]# named-checkconf
假如沒有問題的話,不會有任何輸出。
下面我們刪除一個分號再運行一次檢查錯誤。
[root@node1 named]# named-checkconf
/etc/named.conf:57: missing ';' before '}'
沒有問題,就可以重啟服務了。
[root@node1 named]# service named restart
Redirecting to /bin/systemctl restart named.service
需要注意的是,DNS的包名叫做bind,服務器名字叫做named
所以yum install named或者yum install dns也是沒有辦法安裝服務的。
二、測試能否解析域名
[root@node1 named]# dig -t A node1.bc.com @192.168.2.201
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -t A node1.bc.com @192.168.2.201
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12316
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;node1.bc.com. IN A
;; ANSWER SECTION:
node1.bc.com. 86400 IN A 192.168.2.211
node1.bc.com. 86400 IN A 192.168.2.221
node1.bc.com. 86400 IN A 192.168.2.201
;; AUTHORITY SECTION:
bc.com. 86400 IN NS ns2.bc.com.
bc.com. 86400 IN NS ns1.bc.com.
;; ADDITIONAL SECTION:
ns1.bc.com. 86400 IN A 192.168.2.201
ns2.bc.com. 86400 IN A 192.168.2.202
;; Query time: 0 msec
;; SERVER: 192.168.2.201#53(192.168.2.201)
;; WHEN: Wed Oct 05 03:20:59 EDT 2016
;; MSG SIZE rcvd: 157
在輸出結果中,我們需要關注的幾個字段:
;; ANSWER SECTION:
node1.bc.com. 86400 IN A 192.168.2.211
node1.bc.com. 86400 IN A 192.168.2.221
node1.bc.com. 86400 IN A 192.168.2.201
;; AUTHORITY SECTION:
bc.com. 86400 IN NS ns2.bc.com.
bc.com. 86400 IN NS ns1.bc.com.
;; ADDITIONAL SECTION:
ns1.bc.com. 86400 IN A 192.168.2.201
ns2.bc.com. 86400 IN A 192.168.2.202
首先我們的命令是向192.168.2.201這臺主機查詢node1.bc.com這個域名的IP地址。
dig -t A node1.bc.com @192.168.2.201
;; ANSWER SECTION:指的就是答案,也就是說查找得到的A記錄,也就是IP地址。
;; AUTHORITY SECTION:指的是,負責解析這個域的DNS服務器。
;; ADDITIONAL SECTION:指的是負責解析的服務器的A記錄,也就是IP地址。
三、配置node2為從服務器
從服務器安裝DNS服務的軟件包
[root@node2 ~]# yum install named -y
修改全局配置文件
[root@node2 ~]# vim /etc/named.conf
options {
listen-on port 53 { 192.168.2.202;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 { any; };
recursion yes;
dnssec-enable no;
dnssec-validation no;
}
修改區域配置文件
[root@node2 ~]# vim /etc/named.rfc1912.zones
zone "bc.com" IN {
type slave;
masters { 192.168.2.201; };
file "slaves/named.bc.com.zone";
};
重啟服務
[root@node2 ~]# service named restart
Redirecting to /bin/systemctl restart named.service
查看監聽端口是否開啟
[root@node2 ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 10 192.168.2.202:53 *:* users:(("named",4689,21))
LISTEN 0 10 127.0.0.1:53 *:* users:(("named",4689,20))
四、同步需要注意的幾點
1.主從的時間必須同步,否則容易出錯。
2.bind程序的版本應該保持一致;否則,應該從高主低;
3.dnssec功能的開啟會影響查詢。
4.主服務器一旦發生更改,主服務器會通知解析庫中有NS記錄的從服務器。
5.防火墻徐璈開放53號端口的tcp和udp連接,UDP用于查詢,TCP用于同步。
6.可以通過手動修改SOA記錄中的序列號,手動+1,可以讓主從同步。
也就是說,假如主從不同步,可以從這幾個方面檢查有沒有設置好。
五、測試從服務器是否同步成功。
向node2查詢node1.bc.com這個域名的A記錄
[root@node1 named]# dig -t A node1.bc.com @192.168.2.202
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> -t A node1.bc.com @192.168.2.202
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47173
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;node1.bc.com. IN A
;; ANSWER SECTION:
node1.bc.com. 86400 IN A 192.168.2.221
node1.bc.com. 86400 IN A 192.168.2.211
node1.bc.com. 86400 IN A 192.168.2.201
;; AUTHORITY SECTION:
bc.com. 86400 IN NS ns2.bc.com.
bc.com. 86400 IN NS ns1.bc.com.
;; ADDITIONAL SECTION:
ns1.bc.com. 86400 IN A 192.168.2.201
ns2.bc.com. 86400 IN A 192.168.2.202
;; Query time: 1 msec
;; SERVER: 192.168.2.202#53(192.168.2.202)
;; WHEN: Fri Dec 30 14:37:18 CST 2016
;; MSG SIZE rcvd: 157
成功向node2這個DNS服務器查找到node1的A記錄。
因為從服務器只配置了一個zone,資源記錄是空的。
如果沒有從master同步到資源記錄,是解析不了的。
查看node2是否同步到記錄
[root@node2 ~]# vim /var/named/slaves/named.bc.com.zone
^@^@^@^B^@^@^@^AXet<86>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@S^@^A^@^F^@^@^@^AQ<80>^@^@^@^A^@^H^Bbc^Ccom^@^@5^Cns1^Bbc^Ccom^@^Eadmin^Bbc^Ccom^Bbc^Ccom^@x+<95>u^@^@^N^P^@^@^A,^@ :<80>^@^AQ<80>^@^@^@8^@^A^@^B^@^@^@^AQ<80>^@^@^@^B^@^H^Bbc^Ccom^@^@^L^Cns1^Bbc^Ccom^@^@^L^Cns2^Bbc^Ccom^@^@^@^@$^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@
^A*^Bbc^Ccom^@^@^Dà¨^Bé^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode1^Bbc^Ccom^@^@^Dà¨^Bé^@^Dà¨^Bó^@^Dà¨^BY^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode2^Bbc^Ccom^@^@^Dà¨^Bê^@^Dà¨^B?^@^Dà¨^BT^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode3^Bbc^Ccom^@^@^Dà¨^B?^@^Dà¨^B?^@^Dà¨^B?^@^@^@4^@^A^@^A^@^@^@^AQ<80>^@^@^@^C^@^N^Enode4^Bbc^Ccom^@^@^Dà¨^Bì^@^Dà¨^B?^@^Dà¨^Bà^@^@^@&^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@^L^Cns1^Bbc^Ccom^@^@^Dà¨^Bé^@^@^@&^@^A^@^A^@^@^@^AQ<80>^@^@^@^A^@^L^Cns2^Bbc^Ccom^@^@^Dà¨^Bê
`如果不想是亂碼,zone可以定義成這樣。
zone "bc.com" IN {
type slave;
masters { 192.168.2.201; };
masterfile-format text;
file "slaves/named.bc.com.zone";
};
同步而來的slave文件,顯得十分規范。
[root@node2 ~]# cat /var/named/slaves/named.bc.com.zone
$ORIGIN .
$TTL 86400 ; 1 day
bc.com IN SOA ns1.bc.com. admin.bc.com.bc.com. (
2016122230 ; serial
3600 ; refresh (1 hour)
300 ; retry (5 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS ns1.bc.com.
NS ns2.bc.com.
$ORIGIN bc.com.
* A 192.168.2.201
node1 A 192.168.2.201
A 192.168.2.211
A 192.168.2.221
node2 A 192.168.2.202
A 192.168.2.212
A 192.168.2.222
node3 A 192.168.2.203
A 192.168.2.213
A 192.168.2.223
node4 A 192.168.2.204
A 192.168.2.214
A 192.168.2.224
ns1 A 192.168.2.201
ns2 A 192.168.2.202
這樣、我們就配置出一個簡單的DNS主從服務器了。
由于篇幅的原因,下一次我們會將域名服務器的子域授權以及智能解析。