目錄:
BIND簡易教程(1):安裝及基本配置
BIND簡易教程(2):BIND視圖配置(本篇)
BIND簡易教程(3):DNSSec配置html
上文書說到,咱們把aaa.apple.tree解析到192.168.4.100。那麼世界上任何一我的在請求aaa.apple.tree的時候,解析到的都是這個IP地址,以後,再訪問這個域名(固然這個IP地址只是實驗的,並且我域名也沒註冊,除了我內網以外,世界上任何一我的都訪問不到)。那麼問題來了,兩我的一個在電信,一個在聯通,都想訪問這個域名的話,個人服務器要放在哪一個運營商更好呢?畢竟,「世界上最遙遠的距離,不是你在我面前我卻不認識你,而是你在電信,我在聯通」。那麼可不能夠這樣,我如今提供兩臺服務器,一臺放在電信,一臺放在聯通,而後,讓電信的用戶查詢 aaa.apple.tree的時候,解析到電信的服務器上去,聯通的用戶查詢aaa.apple.tree的時候,解析到聯通的服務器上去?答案是,能夠的。這就是我今天要講的BIND的高級功能:視圖查詢。
配置視圖,主要須要三個步驟:ubuntu
下面,咱們假設192.168.4.x這個網段是電信的,192.168.1.x這個網段是聯通的,對比配置一下視圖。
先寫IP集合:
電信地址集合:dianxin.acl服務器
acl 「dianxin」 { 192.168.4.0/24; };
聯通地址集合:liantong.aclapp
acl 「liantong」 { 192.168.1.0/24; };
再寫視圖:
電信視圖:dianxin.view測試
include "/etc/bind/views/acls/dianxin.acl"; view "dianxin" { match-clients { "dianxin"; }; zone "apple.tree" IN { type master; file "/etc/bind/views/zones/dianxin.apple.tree.zone"; }; };
聯通視圖:liantong.viewspa
include "/etc/bind/views/acls/liantong.acl"; view "liantong" { match-clients { "liantong"; }; zone "apple.tree" IN { type master; file "/etc/bind/views/zones/liantong.apple.tree.zone"; }; };
最後是對域的解析:code
電信apple.tree域: dianxin.apple.tree.zonehtm
$TTL 86400
@ IN SOA apple.tree. apple.apple.tree. (
2016090100 ; Serial
28800 ; Refresh
7200 ; Retry
604800 ; Expire
86400 ; Negative Cache TTL
)
@ IN NS apple.tree.
@ IN A 192.168.4.43
aaa IN A 192.168.4.100
bbb IN A 192.168.4.101
ccc IN CNAME bbb
聯通apple.tree域: liantong.apple.tree.zoneblog
$TTL 86400
@ IN SOA apple.tree. apple.apple.tree. (
2016090100 ; Serial
28800 ; Refresh
7200 ; Retry
604800 ; Expire
86400 ; Negative Cache TTL
)
@ IN NS apple.tree.
@ IN A 192.168.4.43
aaa IN A 1.1.1.1
bbb IN A 2.2.2.2
ccc IN CNAME bbb
OK。這樣咱們就配置了一套電信視圖和一套聯通視圖(所謂一套就是「acl+view+zone」這三者解析)。
若是你樂意,還能夠配一套移動視圖和一套移不動視圖,大概就都是醬嬸的。先測試一下吧(別忘了sudo rndc reload加載):
當我從電信的機器(192.168.4.43)查詢時:教程
$ dig aaa.apple.tree @192.168.4.43
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> aaa.apple.tree @192.168.4.43
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57758
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aaa.apple.tree. IN A
;; ANSWER SECTION:
aaa.apple.tree. 86400 IN A 192.168.4.100
;; Query time: 4 msec
;; SERVER: 192.168.4.43#53(192.168.4.43)
;; WHEN: Mon Jan 11 08:58:28 CST 2016
;; MSG SIZE rcvd: 59
而當我從聯通的機器(192.168.1.100)查詢時:
$ dig aaa.apple.tree @192.168.4.43
; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>> aaa.apple.tree @192.168.4.43
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40018
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aaa.apple.tree. IN A
;; ANSWER SECTION:
aaa.apple.tree. 86400 IN A 1.1.1.1
;; Query time: 3 msec
;; SERVER: 192.168.4.43#53(192.168.4.43)
;; WHEN: Sun Sep 04 12:32:56 CST 2016
;; MSG SIZE rcvd: 59
視圖配置就是這樣的。有個問題我一直沒有介紹,那就是:我怎麼知道哪些IP是電信的IP,哪些是聯通的?若是你之前看過個人博客,那應該看過這篇《解析純真IP地址庫》。沒錯,寫程序來得到每一個運營商的IP集合。再開動一下腦筋,咱們還能得到些什麼呢?——除了運營商,咱們還能夠根據地域來劃分IP,寫出來各個省的視圖。
密集恐懼症患者的福音。我我的建議若是你真要配置全國各省甚至各市的視圖,就不要手動寫配置文件了,寫個腳本生成吧。並且,一臺機器的內存有可能撐不住,可能要考慮主從。甚至,咱們還能夠用地域和運營商相結合。固然,這種不一樣維度結合的時候,須要有化解衝突的方式,好比,電信解析到P地址,而北京解析到Q地址。那麼你讓北京電信的用戶怎麼想?實際上,對於這種狀況,BIND是這麼處理的:首先,咱們收集IP集合的時候,一個北京電信的IP就既在北京的IP集合中,又在電信的IP集合中,當客戶端訪問DNS服務器時,BIND首先對客戶端IP進行匹配,找到這個IP屬於某一個集合,就會去查詢這個集合對應的視圖。誰先誰後?那就要看兩個acl在named.conf加載時候的前後順序了。誰寫在前面,誰先加載。BIND不認爲這種衝突是錯誤。話說這原本也不是錯誤,北京電信的用戶既屬於北京,也屬於電信,這沒錯啊!視圖配置大概就講這些。