標籤:ip地址 使用者 伺服器
1、什麼是DNS?
(Domain Name System)網域名稱系統。
DNS其實實現的功能很簡單也很有效,它能夠讓使用者可以不用記得那些經常要訪問伺服器的ip地址,直接要你輸入類似拼音格式的就可以訪問到那些數字串的ip地址。假設以61.120.155.14(舉個例子),我們總是用這些數字進行網頁伺服器的訪問豈不是很蛋疼,畢竟很多人還是對文字甚至拼音字母更容易讓正常人記憶。這就是DNS的功能。
當然,它不僅能把那些你輸入的拼音字母轉換成ip地址的數字串,它還支援把那些數字串轉換成你想訪問的實際的網址,譬如www.baidu.com。你可以通過在一個網頁瀏覽器上輸入202.108.22.5訪問到百度,當然前提你是一個記憶達人。
2、說起那些通過我們每天都輸入的網址資訊,它究竟代表什麼呢?
舉個例子:以我們經常的新浪為例www.sina.com.
其實這裡在資訊最後有一個點兒.的,解剖一下www.sina.com.前面的www代表主機名稱字,.sina.com就代表一個域。把前面的www加上我們後面的.sina.com組合在一起www.sina.com這是一個完整的合格網域名稱,因此又稱FQDN。它就在用“.”分割展示層級的隸屬關係~。好比“我.村長.縣長.市長”一樣。一層管理一層。
3、DNS也是C/S架構的~
S(伺服器端):bind,而伺服器端一般都是被動方式開啟,通過監聽在某個通訊端等待用戶端的串連請求的。
udp53號連接埠和tcp的53號連接埠。
C(用戶端,一般由共用庫組成,裡面有多個庫檔案,通過調用庫來實現伺服器端對名稱的解析)。
而通常DNS裡面也要有儲存的,因為它要記錄很多主機、域的資訊呀。它通常用到儲存有以下三種格式的東西:
1、文字檔
2、關係型資料庫
3經常用到LDAP(輕量目錄訪問協議),通常LDAP監聽在tcp389號連接埠的,因為LDAP的速度很快。大型網站的DNS伺服器經常會用到!
但是網路飛速發展的今天,全球應該不止100億個主機名稱了吧。每天每時每秒有多少線上訪問呢?
還設想一下,因為每個用戶端的請求都可以開啟一個進程,每天每時每秒一個電腦同時開啟多少個進程?很驚駭的數字,我相信一般的電腦很快崩潰的,不是嗎?
所以我們需要多個DNS伺服器吧~這就叫做分布式!
其實早期的DNS伺服器裡面都是一個HOST檔案的,類似裡面裝著到位址解析的“路線圖”似的,而每個進程通訊時都類似串連一個共用庫的東西,於是就是進程-->共用庫查詢-->HOST檔案,再有共用庫返回給進程。於是時間發展,DNS發展到伺服器階段,用戶端通過訪問伺服器來進行DNS位址解析,用戶端的進程通過通訊端介面訪問伺服器端的進程,進而查詢服務器端的資料庫檔案,最後伺服器端進程再通過通訊端介面返回給用戶端。
DNS其實只是網路通訊的一個補充步驟,是跟目標ip地址主機或者是伺服器通訊的一個多餘的步驟,用戶端的進程最終拿到DNS解析到的ip地址再跟對方ip通訊。
其實我們的用戶端在本地上有個類似緩衝的“檔案”,裡面記錄了訪問的ip地址或者主機名稱,避免我們下一次訪問同一個網站,再去DNS伺服器端在進行多餘的遠端連線,不過如果緩衝沒有的話,再去找DNS伺服器要。
隨著互連網發展,DNS開始採取分布式分層管理。DNS有個皇帝一樣的根. DNS分成子層次,再由子層次分成子子層次。
分成
根域(root domian)
根域下在分成的叫做一級域(top-level domain)
一級域下叫做二級域:經常有公司、組織、個人(有錢的)使用
一般二級域下就能直達主機了。
我們的DNS樹狀結構是自底向上的。
假設我們要找到www.baidu.com.怎麼找
先找. 然後在找com域,找到com了,再由com找到baidu。最後baidu定位到www。DNS樹狀模型,下層是不知道上層的。但是它知道根在哪。在建立DNS伺服器時,清楚的寫著根的位置,全球一共13個根伺服器。
而尋找方式有兩種分別是遞迴和迭代,DNS檢索是遞迴+迭代的,所以本地DNS伺服器一定要給本地主機遞迴的,不然是用戶端是無法知道DNS解析出來的地址的。DNS伺服器為本地解析非本機解析的域的請求,它就出去迭代。
我們來說下快樂的話題,用類比的方法來解釋DNS的層級結構。
DNS有輪訓的功能的,其實DNS伺服器管轄的域中,多個主機可以叫同一個主機名稱的。
一個主機名稱可對對應多個IP,哪怕不在同一個網段也沒關係,而一個IP也可以對應多個名稱的。
域和地區
每個域的解析有兩個方面:正向解析、反向解析。
而解析需要解析庫,此時正向解析需要正向解析的解析庫,而反向解析也需要反向解析的解析庫。上述兩個解析庫可以代表為一個地區的解析庫。
域是邏輯概念,而地區是物理概念,域的解析是需要地區檔案實現的。
地區解析庫(物理概念)裡,有些庫是有特權的。這個地區解析庫裡,每一行一個資源記錄:rr。有類型概念的,用於標記此記錄解析的屬性。
1、SOA:起始授權記錄,標記該地區誰是老大。一個地區檔案只能有一個SOA。
2、NS:誰是名稱伺服器(很關鍵)
3、MX:用來標記一個域內誰是郵件伺服器的,郵件伺服器有優先順序的概念。0-99,優先順序越高,數字越小。
4、A:FQDN—>IP 把名稱解析成ip地址,可以理解為勞苦福士的。
5、 PTR:IP——>FQDN 反向解析 可以反向解ipv6的
A與PTR是不能出現在同一個地區解析庫中的。
6、AAAA:IPv6地址 FQDN———>IPv6
7、CNAME:Canonical Name 正式名稱
一般一個DNS伺服器都叫什麼ns.mageedu.com
每個域中權威DNS伺服器又叫做主NDS伺服器。
而有主DNS伺服器就會有從DNS伺服器,而從DNS伺服器的資料只會從主DNS伺服器上同步複製過來,它在工作的時候,會定期更新自己地區的資料,而從DNS伺服器不僅可以從主DNS伺服器上複製資料也支援從其他的從DNS伺服器上複製資料,這樣如果在一個地區內設定從DNS伺服器,可以分擔主DNS伺服器的負擔,更加快了DNS的解析速度!
rndc:remote name domain controller
遠端網域名控制器(危險)
rndc reload:重新載入設定檔而不用退出。
rndc-confgen -r /dev/urandom > /etc/named/rndc.conf 手動產生rndckey
另外這裡分享大家一個rndc的心得,筆者在安裝好了bind以後,也產生了rndckey檔案了,但我用它的時候顯示connection fused,我想半天,才發現DNS的進程沒開啟,你需要(C7環境下) systemctl start named.service
緩衝DNS伺服器:不會負責地址正常解析的伺服器,它本身不會存在任何的資料,它只協助DNS客戶機的向其他的DNS伺服器進行查詢,然後把查詢到的結果儲存在快取中,進而響應各個用戶端的查詢請求。它只負責查詢資料,不會協助你解析地址的。
還有另一種DNS轉寄伺服器,它的工作原理是這樣的,假設本地區的用戶端指定的DNS伺服器解析網域名稱不成功的話,DNS伺服器會把請求轉寄給DNS轉寄站,由它來執行網域名稱請求給其他的DNS伺服器!
一個地區內的DNS伺服器內是有緩衝的,而用戶端本身也有緩衝,緩衝對DNS很重要的。一個DNS伺服器可以幫N個網域名稱同時進行解析,就是說一個DNS伺服器即可以是mageedu.com的權威解析伺服器還是可以是cnbrass.com的權威解析伺服器為N個網域名稱提供解析服務。
如果以後在工作上配置DNS伺服器,注意要註冊個網域名稱。而且以後到生產環境做DNS伺服器,有幾個DNS伺服器就往上級那裡註冊幾個DNS伺服器。
對於DNS伺服器的解析庫檔案:主DNS伺服器是需要添加的,從DNS伺服器是同步複製的,不能手動修改的。
DNS的主從同步
注意從伺服器同步檔案是存放在/var/named/slaves/xxx.zone.
ntp:時間伺服器
在DNS搭建的外部環境,一般都有個外部的精準的NTP時間伺服器。
bind的版本
從DNS伺服器的版本一定要高於或等於主DNS伺服器的版本。
讓我們定義一個從地區。
格式:在/etc/named.rfc1912.zones
zone “ZONE_NAME” IN {
type slave;
file “slave/ZONE_NAME.zone”;
master { 主DNS伺服器的IP地址;(其他的從伺服器的IP地址) };
};
現在我們類比一個環境,假設在mageedu.com的域下,有兩個DNS伺服器,一個是主DNS伺服器,172.16.100.7,一個從DNS伺服器,172.16.200.7
而這個新環境172.16.200.7也需要安裝bind,需要在/etc/named.rfc1912.zones裡面有記錄,但無需自己產生一個具體的zone檔案,只需要從主DNS伺服器那裡同步就ok
添加從伺服器
1、先去網域名稱註冊商添加一個NS記錄,這條記錄還必須在你的上級域的地區解析庫中,而且當主DNS伺服器有變化時,它只通知本解析庫檔案裡類型為NS的伺服器。
還要注意,任何時候解析庫檔案有增加或刪減的變化,serial一定要加1。
格式如下:
首先要查看bind的版本,用yum list all bind* 或者yum info bind查看主從伺服器的bin d版本。
然後要在從伺服器端開啟crontab命令,新增工作,如
*/5 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
dig 命令
dig –t A xxxxxxxxx.com @ DNS伺服器的ip地址
正向解析 從主機名稱到ip地址
dig –x ip地址 @DNS伺服器的ip地址
反向解析 從ip地址到主機名稱
dig –t AXFR 網域名稱 (有空格) @DNS伺服器的ip地址
正向解析一個域內的ip地址
其實bind內也有acl的功能,acl 存取控制清單 access control list ,需要修改設定檔,在設定檔定義的地區,比如說:/etc/named.rfc1912.zones裡面定義的地區檔案那一塊去修改。比如說地區傳送檔案,預設是任何人都可以通過開啟DNS服務來獲得主DNS伺服器的地區庫檔案的,從DNS伺服器也是。這樣有什麼樣子的後果?假設有個不懷好意的傢伙,直接同步處理走了地區檔案,從中使壞。所以我們需要在地區檔案中做限定,添加allow-transfer { 可以被你傳送檔案的DNS伺服器ip地址; } 還有可選的選項,有none、any。
設定好了,別忘記同步遠端網域名控制,即rndc reload,讓它重新讀取下設定檔。再看,
[[email protected] ~]# dig -t AXFR mageedu.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t AXFR mageedu.com
;; global options: +cmd
; Transfer failed.
顯示transfer faild。
以上是限制主從DNS伺服器地區傳送的,假設我想限制別的不懷好意的用戶端向我這做位址解析呢???也可以設定的,還是通過修改設定檔,再這裡添加一個allow-query { !指定的ip地址; };,例如:
zone "mageedu.com" IN {
type slave;
file "slaves/mageedu.com.zone";
masters { 172.16.249.174; };
allow-transfer { 172.16.0.0/16; };
allow-query { none; };
注意最後一行 顯示none。於是我再讓主DNS伺服器通過我解析網址,你們看:
[[email protected] ~]# dig -t A www.mageedu.com @172.16.249.149
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.mageedu.com @172.16.249.149
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 37496
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.mageedu.com. IN A
它後面就不會顯示出來ip地址,哪怕其實就在DNS自己的地區解析庫裡。
由於rndc很強大,也很危險。其實這裡推薦假如企業內部想搞一個DNS伺服器或僅用於內部交流溝通的話,rndc可以啟用,不過一旦接入外網了,千萬別這樣做,會招來很多莫名的傢伙進來搞壞的。
rndc其實是發送密鑰的方式來通訊的,在我們CentOS 6.5中,rndc在/etc/下有一個rndc.key的檔案,裡面記錄著rndc的密鑰資訊,這段是基於hmac方式的完整身分識別驗證。
每一次你用rndc來向伺服器端發送資訊,伺服器端都會用同樣的加密方法對比密鑰的,一旦成功才安全讓rndc通訊。
常用的rndc 命令有
rndc reload、rndc reconfig、 rndc flush、 rndc status。
下面讓我們設想下如何在一個域中增加它的子域呢?如何建立一個子域?
假設:我們有mageedu.com
結果在mageedu.com下還有ops部門和dev部門,而隨後公司業務量大了,ops部門和dev部門下屬還有www部,即www.ops.mageedu.com
那怎麼辦呢?
其實建立子域,只需要在父域的地區解析庫裡稍作修改,類似這樣。
子網域名稱稱 IN NS 子網域名稱稱伺服器,用我們上面的例子就是 ops.mageedu.com IN NS ns.ops.mageedu.com.
當然,我們還要為它添加一個A記錄(這裡只說正向解析)就在它後面添加 ns.ops.mageedu.com. IN A 172.16.249.158(舉例)
其實DNS的解析過程是這樣的,父域知道子域,但子域確不知道父域。即,如果我們在www.mageedu.com內,我想找www.ops.mageedu.com的主機,怎麼找?
www找ops嗎?不是。而是當我們在www.mageedu.com時,顯然我們的網域名稱是mageedu.com,而非ops.mageedu.com,它會直接去找到根伺服器.
然後通過根伺服器找.com這個域,然後.com這個域告訴你.mageedu這個域在哪,然後再去找.mageedu這個域,進而找到.ops這個域。最後.ops這個域會把www.ops.mageedu.com這個主機的IP地址所在的位置告訴你,你通過這個位置來訪問到了該ip地址的。
但是雖然原理上來說是這樣的, 別忘了我們的DNS伺服器還有種功能是轉寄站,它可以讓子域找父域時,不再費勁繞到根那裡啦~而且DNS的子域和父域也可以不在同一個網段
讓我們建立一個子域先
1、先編輯/etc/named.conf
2、再次編輯/etc/named.rfc1912.zones
類似格式如下:
zone "ops.mageedu.com" IN {
type master;
file "ops.mageedu.zone";
allow-transfer { 127.0.0.1; };
};
3.編輯好以後,我們去地區解析庫裡添加點東西進去。
$TTL 3600
$ORIGIN ops.mageedu.com.
@ IN SOA ops.mageedu.com. admin.ops.mageedu.com. (
2014080604
1H
5M
3D
2H )
@ IN NS ns
ns IN A 172.16.249.155
www IN A 192.0.19.111(瞎定義的)
設定好了,rndc reload
但是有個很關鍵的一步,如果我們子域的DNS伺服器開啟了防火牆,一定要先iptable –F 表示關閉防火牆,不然子域的DNS伺服器是無法響應的。
然後我們可以測試一下子域的DNS伺服器是否能夠解析本子域的主機呢?
[[email protected] named]# dig -t A www.ops.mageedu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -t A www.ops.mageedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41709
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.ops.mageedu.com. IN A
;; ANSWER SECTION:
www.ops.mageedu.com. 3600 IN A 192.0.19.111
成功了,注意看這個有flags裡有個aa,說明這個是由權威DNS伺服器解析出來的!
讓我們看看如果從父域DNS伺服器上解析子域DNS伺服器上的主機,
[[email protected] ~]# dig -t A www.ops.mageedu.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.ops.mageedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11796
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ops.mageedu.com. IN A
;; ANSWER SECTION:
www.ops.mageedu.com. 2938 IN A 192.0.19.111
看,也可以,而且這裡的flags就沒有aa了。但是我們的目的是什麼呢??
我們是要子域解析父域中主機,我們試試,若可以的話。
[[email protected] named]# dig -t A www.mageedu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -t A www.mageedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 64006
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.mageedu.com. IN A
後面沒有,說明還是不可以。我們要想辦法呀,還記得剛說DNS有轉寄站的功能嗎?沒錯,它可以編輯
options {
…
forward {only|first} forward表面指向功能,而only和first分別表示only:如果我指向的主DNS伺服器找不到正確的答案,我們就戛然而止,認為它找到的就是那個
,first則表示如果主DNS伺服器回應我們找不到,我們子域的DNS伺服器再去找根出去迭代。
forwarders { IP(想要遞迴的主DNS的ip地址; }
而同時,還要我們的被遞迴的DNS裡面還要添加一項叫做遞迴白名單,予以響應,格式如下:
allow-recursion { }
譬如:
forward only;
forwarders { 172.16.249.174; };
編輯好了,我們再named-checkconf一下,檢查一下文法有沒有問題,ok沒問題。rndc reconfig。
於是我們測試一下,看看結果怎麼樣了
[[email protected] named]# dig -t A www.mageedu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -t A www.mageedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43071
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.mageedu.com. IN A
;; ANSWER SECTION:
www.mageedu.com. 3600 IN A 172.16.249.160
看看結果,成功啦!
最後我們再考慮一個問題,把剛才的情境放大一下,如果我們讓被轉寄的DNS伺服器僅僅解析一個地區的ip地址,怎麼辦?
注意!!!在我們的請求的子域DNS伺服器端編輯/etc/named.rfc1912.zones,然後在裡面定義想被解析到的地區,如下:
zone "mageedu.com" IN {
type forward;
forward only;
forwarders { 172.16.249.174; };
};
然後我們再rndc reconfig一下,然後測試
[[email protected] named]# dig -t A www.mageedu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -t A www.mageedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1691
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.mageedu.com. IN A
;; ANSWER SECTION:
www.mageedu.com. 2982 IN A 172.16.249.16
成功啦!但是我們要是通過父域的DNS伺服器轉寄別的主機解析請求就不可以了,看,我們以www.baidu.com為例
[[email protected] named]# dig -t A www.baidu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -t A www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31494
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN A
就是不成功的。還有這裡還有一個特別容易混的概念,因為我們是在CentOS的虛擬機器上測試的,CentOS6.5自己的/etc/resolv.conf下的DNS和你所配置開啟的DNS服務是沒有關係的!!