智能 DNS 是指权威 DNS 服务器根据查询的来源 IP 地址选择不同的记录,常用于 CDN 或负载均衡。例如,查询的 IP 来自电信时,返回电信线路服务器的 IP 地址;查询的 IP 来自联通时,返回联通线路服务器的 IP 地址。利用 Bind 的 View 功能和搜集到的各运营商的 IP 地址段,即可实现简单的智能 DNS。
搜集各运营商的 IP 地址段
编写了一些 Bash 脚本来自动搜集,代码见:https://gitcafe.com/XiaoxiaoPu/ip-db,脚本还会生成直接供 Bind 使用的 ACL 配置。
acl cn_cmcc {
36.128.0.0/10;
39.128.0.0/10;
103.20.112.0/22;
103.21.176.0/22;
111.0.0.0/10;
112.0.0.0/10;
......
221.129.0.0/16;
223.4.0.0/14;
2001:e80::/32;
2400:d200::/32;
2409:8000::/20;
};
配置 Bind
配置文件中主要修改的部分如下:
include "cn_cmcc.acl";
include "cn_cernet.acl";
include "cn_unicom.acl";
include "cn_chinanet.acl";
include "cn_unknown.acl";
view cn_cmcc {
match-clients { cn_cmcc; };
zone "example.com." {
type master;
file "example.com.cn_cmcc.zone";
};
};
view cn_cernet {
match-clients { cn_cernet; };
zone "example.com." {
type master;
file "example.com.cn_cernet.zone";
};
};
view cn_unicom {
match-clients { cn_unicom; };
zone "example.com." {
type master;
file "example.com.cn_unicom.zone";
};
};
view cn_chinanet {
match-clients { cn_chinanet; };
zone "example.com." {
type master;
file "example.com.cn_chinanet.zone";
};
};
view cn_unknown {
match-clients { cn_unknown; };
zone "example.com." {
type master;
file "example.com.cn_unknown.zone";
};
};
view any {
match-clients { any; };
zone "example.com." {
type master;
file "example.com.any.zone";
};
};
然后分别编写适合各个运营商线路的 Zone,重启 Bind 即可。
测试
电信/联通/教育网
dig @202.102.213.68 +nocomments patme.net
; <<>> DiG 9.9.2-P2 <<>> @202.102.213.68 +nocomments patme.net
; (1 server found)
;; global options: +cmd
;patme.net. IN A
patme.net. 7200 IN A 202.141.160.99
patme.net. 600 IN NS ns1.patme.net.
patme.net. 600 IN NS ns2.patme.net.
ns1.patme.net. 600 IN AAAA 2001:da8:d800:71::205
ns2.patme.net. 600 IN AAAA 2605:f700:40:c00::d5e7:4da6
;; Query time: 25 msec
;; SERVER: 202.102.213.68#53(202.102.213.68)
;; WHEN: Fri Aug 15 23:48:35 2014
;; MSG SIZE rcvd: 146
移动
dig @211.138.164.6 +nocomments patme.net
; <<>> DiG 9.9.2-P2 <<>> @211.138.164.6 +nocomments patme.net
; (1 server found)
;; global options: +cmd
;patme.net. IN A
patme.net. 1778 IN A 202.141.176.99
patme.net. 578 IN NS ns1.patme.net.
patme.net. 578 IN NS ns2.patme.net.
ns1.patme.net. 578 IN AAAA 2001:da8:d800:71::205
ns2.patme.net. 578 IN AAAA 2605:f700:40:c00::d5e7:4da6
;; Query time: 66 msec
;; SERVER: 211.138.164.6#53(211.138.164.6)
;; WHEN: Fri Aug 15 23:51:30 2014
;; MSG SIZE rcvd: 146
国外
dig @8.8.8.8 +nocomments patme.net
; <<>> DiG 9.9.2-P2 <<>> @8.8.8.8 +nocomments patme.net
; (1 server found)
;; global options: +cmd
;patme.net. IN A
patme.net. 599 IN A 192.157.213.104
;; Query time: 3263 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Aug 15 23:52:37 2014
;; MSG SIZE rcvd: 54
测试成功,对来自不同运营商线路的 DNS 查询确实返回了不同的 IP 地址,智能 DNS 就搭建好了。