Bind 搭建智能 DNS

日期: 08 月 15日, 2014
标签:

智能 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 就搭建好了。