使用 bind9 作為 GeoDNS 伺服器

在繼續前,你需要先了解GeoDNS為何物,以及bind之基本使用方式。

簡單來說,若要讓bind為不同地區的使用者返回不同的查詢結果,則需要判斷DNS請求從何而來。國家IP資料從MaxMind便能獲取到。倘若要將MaxMind的IP地址資料庫變為bind的acl,可以利用這裡的指令碼。但是為了簡化過程,我們直接下載預先做好的的acl檔案。

要如何做到呢?依舊是透過上面提供的連結。

只需要下面這一條指令就能夠下載到acl了。

curl http://phix.me/geodns/download/MaxMind/GeoIP.acl.gz | zcat > geodns.acl

下載完成了之後,進到bind的全局設定裡頭,將這個檔案include進去,然後還需要稍微做些修改。

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

// GeoDNS Configuration

// acl file sepified the IP zones of countries. 
include “/etc/bind/geodns.acl";

include "/etc/bind/named.conf.cn";
include "/etc/bind/named.conf.us";
include "/etc/bind/named.conf.any";

include “/etc/bind/named.conf.default-zones”;

在這裡,/etc/bind/named.conf.cn中指明瞭中國地區解析的地址,/etc/bind/named.conf.us則是美國,/etc/bind/named.conf.any則是任何。需要注意的是,要將any放在最後。否則any將會匹配任何查詢,換言之,在any之後的地區都不會被解析。

這裡將named.conf.cn的內容放出來作為範例:

view "china" {

	match-clients { CN; };
	recursion no;

	zone "magicnat.com" {
		type master;
		file "/etc/bind/zones-china/magicnat.com";
	};

	zone "magicnat.org" {
		type master;
		file "/etc/bind/zones-china/magicnat.org";
	};

	zone "nat.moe" {
		type master;
		file "/etc/bind/zones-china/nat.moe";
	};

	zone …
};

每一個view,就是每一個區域。這個區域要解析的國家在match-clients中定義。例如中國就是CN,美國則是US。也可以將兩個國家一併寫在match-clients中。若要匹配任何國家,則可以使用any。還有一點也是需要注意的:在使用view之後,就不能在view之外存在zones。在named.conf.default-zones中的區域就會出現問題。可以在配置檔案中將其include註釋,也可以將其加入一個view,就像這樣:

view "local" {

	match-clients { any; };
	recursion no;

	// prime the server with knowledge of the root servers
	zone "." {
		type hint;
		file "/etc/bind/db.root";
	};

	// be authoritative for the localhost forward and reverse zones, and for
	// broadcast zones as per RFC 1912

	zone "localhost" {
		type master;
		file "/etc/bind/db.local";
	};

	zone "127.in-addr.arpa" {
		type master;
		file "/etc/bind/db.127";
	};

	zone "0.in-addr.arpa" {
		type master;
		file "/etc/bind/db.0";
	};

	zone "255.in-addr.arpa" {
		type master;
		file "/etc/bind/db.255";
	};

};

最後一點:若是你像我這樣將default-zones的clients設為any的話,你得將載入default-zones的語句放在配置檔案的最末尾。原因和將any區域放在最後是一樣的。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *