用bind架设自己的智能DNS
除了使用雙通或者多通機房以外,還可以通過多臺鏡像服務(wù)器的方法來提高用戶的訪問速度
但是,如果使用的雙通機房并不是單IP的,或者使用多臺鏡像的做法,就會面臨多個不同的服務(wù)器IP的問題
最早的時候,很多鏡像服務(wù)器都是使用不同的域名的,比如說www1和www2,或者www和cnc
這樣的做法,對用戶相當(dāng)不友好,而且不方便推廣,比如說,你要告訴朋友一個網(wǎng)站,還要問他是什么線路才能給網(wǎng)址嗎,或者可能你還不知道這個網(wǎng)站有一個專為網(wǎng)通的線路所設(shè)置的鏡像
用統(tǒng)一的域名,然后根據(jù)用戶的線路自動判斷引導(dǎo)到不同的鏡像服務(wù)器,正是智能DNS的功用(智能DNS其實是CDN的其中一部分,是最前端的部分)
現(xiàn)在還是有一些地方使用多域名,比如說下載網(wǎng)站的下載鏡像服務(wù)器,因為智能DNS有一定的缺陷(并不一定選擇到正確的線路,下面說),也提供給用戶自由選擇線路的權(quán)利
目前也有一些公司提供智能DNS解釋服務(wù),把你的域名NS指到他們服務(wù)器,然后輸入網(wǎng)通和電信服務(wù)器的IP就ok了
也有一些公司提供比較完整的CDN服務(wù),比如比較出名的就是chinacache,不少中型網(wǎng)站是使用他們的服務(wù)
最初的bind是不支持通過來源選擇不同的ip的,因此只能通過iptables的輔助來實現(xiàn)智能DNS,方法也很簡單,在DNS服務(wù)器上面啟動兩 份bind,都不要用默認的端口,兩份分別解析不同的線路,然后再用iptables將默認端口的DNS請求根據(jù)來源IP發(fā)送到不同的bind實例
這種方法缺點很明顯,需要多個bind實例,如果需要更多的線路解釋那就還要再開bind實例,另外iptables對來源的解釋也會導(dǎo)致iptables太多規(guī)則
現(xiàn)在的bind支持了根據(jù)來源選擇的功能,我不確定是不是bind9的新特性,不過bind9是重寫過的,相比漏洞百出的bind8來說,穩(wěn)定和安全很多,以下的配置以bind9為基礎(chǔ)
我使用的是CentOS,由于bind服務(wù)沒有其他服務(wù)(比如apache,squid)要求那么高,所以也沒有必要自己編譯一份,我是用過yum安裝的,版本不是最新的穩(wěn)定版
裝好之后,可以用過/etc/init.d/named start成功啟動服務(wù)
有一個文件named.conf出現(xiàn)在/etc下,就是bind的主config文件,我們只要改動他
(我只說明智能DNS實現(xiàn)部分,其他的bind設(shè)置自行修改,呵呵)
另外一個小技巧,可以通過/usr/sbin/named -g -u named來啟動bind,可以立刻看到輸出信息,方便調(diào)試
我們是通過bind9的view功能來分離判斷的
首先,我們需要一份網(wǎng)通的IP列表,這是一份在網(wǎng)上流傳的列表,呵呵
acl “CNC” {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
58.22.0.0/15;
58.240.0.0/15;
58.242.0.0/15;
58.244.0.0/15;
58.246.0.0/15;
58.248.0.0/13;
60.0.0.0/13;
60.8.0.0/15;
60.10.0.0/16;
60.11.0.0/16;
60.12.0.0/16;
60.13.0.0/18;
60.13.128.0/17;
60.14.0.0/15;
60.16.0.0/13;
60.24.0.0/14;
60.30.0.0/16;
60.31.0.0/16;
60.208.0.0/13;
60.216.0.0/15;
60.218.0.0/15;
60.220.0.0/14;
61.48.0.0/13;
61.133.0.0/17;
61.134.96.0/19;
61.134.128.0/17;
61.135.0.0/16;
61.137.128.0/17;
61.138.0.0/17;
61.138.128.0/18;
61.139.128.0/18;
61.148.0.0/15;
61.156.0.0/16;
61.159.0.0/18;
61.161.0.0/18;
61.161.128.0/17;
61.162.0.0/16;
61.163.0.0/16;
61.167.0.0/16;
61.168.0.0/16;
61.176.0.0/16;
61.179.0.0/16;
61.181.0.0/16;
61.182.0.0/16;
61.189.0.0/17;
125.32.0.0/16;
125.40.0.0/13;
202.96.0.0/18;
202.96.64.0/21;
202.96.72.0/21;
202.97.128.0/18;
202.97.224.0/21;
202.97.240.0/20;
202.98.0.0/21;
202.98.8.0/21;
202.99.64.0/19;
202.99.96.0/21;
202.99.128.0/19;
202.99.160.0/21;
202.99.168.0/21;
202.99.176.0/20;
202.99.208.0/20;
202.99.224.0/21;
202.99.232.0/21;
202.99.240.0/20;
202.102.128.0/21;
202.102.224.0/21;
202.102.232.0/21;
202.106.0.0/16;
202.107.0.0/17;
202.108.0.0/16;
202.110.0.0/17;
202.111.128.0/18;
203.93.8.0/24;
203.93.192.0/18;
210.13.128.0/17;
210.14.160.0/19;
210.14.192.0/19;
210.15.32.0/19;
210.15.96.0/19;
210.15.128.0/18;
210.21.0.0/16;
210.52.128.0/17;
210.53.0.0/17;
210.53.128.0/17;
210.74.96.0/19;
210.74.128.0/19;
210.82.0.0/15;
218.8.0.0/14;
218.12.0.0/16;
218.21.128.0/17;
218.24.0.0/14;
218.56.0.0/14;
218.60.0.0/15;
218.67.128.0/17;
218.68.0.0/15;
218.104.0.0/14;
219.154.0.0/15;
219.156.0.0/15;
219.158.0.0/17;
219.158.128.0/17;
219.159.0.0/18;
220.252.0.0/16;
221.0.0.0/15;
221.2.0.0/16;
221.3.0.0/17;
221.3.128.0/17;
221.4.0.0/16;
221.5.0.0/17;
221.5.128.0/17;
221.6.0.0/16;
221.7.0.0/19;
221.7.32.0/19;
221.7.64.0/19;
221.7.96.0/19;
221.8.0.0/15;
221.10.0.0/16;
221.11.0.0/17;
221.11.128.0/18;
221.11.192.0/19;
221.12.0.0/17;
221.12.128.0/18;
221.13.0.0/18;
221.13.64.0/19;
221.13.96.0/19;
221.13.128.0/17;
221.14.0.0/15;
221.192.0.0/15;
221.194.0.0/16;
221.195.0.0/16;
221.196.0.0/15;
221.198.0.0/16;
221.199.0.0/19;
221.199.32.0/20;
221.199.128.0/18;
221.199.192.0/20;
221.200.0.0/14;
221.204.0.0/15;
221.206.0.0/16;
221.207.0.0/18;
221.207.64.0/18;
221.207.128.0/17;
221.208.0.0/14;
221.212.0.0/16;
221.213.0.0/16;
221.216.0.0/13;
222.128.0.0/14;
222.132.0.0/14;
222.136.0.0/13;
222.160.0.0/15;
222.162.0.0/16;
222.163.0.0/19;
222.163.32.0/19;
222.163.64.0/18;
222.163.128.0/17;
};
如果覺得有哪些部分不是很準確的話,可以自行修改
由于這個部分太長了,所以寫在一個專門的文件然后include進named.conf比較容易維護
例如,我們把上面這段配置保存為cnc_acl.conf
然后在named.conf寫入
include “/data/named/cnc_acl.conf”;
即可
接下來就是view的配置,假設(shè)域名是xyz.com,呵呵
view “view_cnc” {
match-clients { CNC; };
zone “xyz.com” {
type master;
file “/data/named/cnc_xyz”;
};
};
view “view_any” {
match-clients { any; };
zone “xyz.com” {
type master;
file “/data/named/any_xyz”;
};
};
就這樣就足夠了
然后我們需要cnc\_xyz和any_xyz兩個具體的zone file
兩個文件基本是一模一樣的,就是指向不同的ip
$TTL 2h
xyz.com. IN SOA ns.xyz.com. root.xyz.com. (
20071022
2h
40m
1w
2h
)
this6.com. IN NS ns.xyz.com.
this6.com. IN MX 1 mail.xyz.com.
ns IN A 1.1.1.1
mail IN A 1.1.1.1
www IN A 1.1.1.1
根據(jù)不同的線路把www指向不同的IP即可
這樣,我們就實現(xiàn)了自己的智能DNS
后話,目前許多大型網(wǎng)站都是用這個來實現(xiàn)不同的線路來源訪問不同的鏡像,甚至還做到地區(qū)級別,例如,在佛山機房部署了一臺鏡像服務(wù)器,就將廣東省的訪問都指向這臺服務(wù)器
另外,剛剛提到智能DNS也有缺陷,這里詳細描述一下,bind9通過用戶的來源IP來返回不同的解釋IP,而實際上,并不是實際用戶直接訪問我們的 DNS,而是用戶所使用的DNS(比如說廣州ADSL用戶的默認DNS)負責(zé)訪問我們的DNS,網(wǎng)通的DNS就保存有我們網(wǎng)通的IP,如果用戶自行修改了 DNS,比如說電信的用戶硬要用網(wǎng)通的DNS,或者網(wǎng)通的用戶使用國外的DNS(比如opendns之類的),就會導(dǎo)致判斷失誤
總結(jié)
以上是生活随笔為你收集整理的用bind架设自己的智能DNS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我很快乐请不要再说爱我是什么歌呢
- 下一篇: 智能DNS