智能DNS工作原理:
在用户解析一个域名的时候,判断一下用户的IP,然后跟DNS服务器内部的IP表匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址。目前的域名服务运营商不提供智能DNS服务,所以必须自行架设DNS服务或者使用网上免费的智能DNS服务,如DNSPOD
bind 在很早以前就已经集成了bind-dlz 数据库模块,可支持sqllit、bdb MysqL Postgresql ODBC LDAP等数据源,详见:http://bind-dlz.sourceforge.net/
1、配置说明
两个view
local 内部网络
any 其他(公网)
两台DNS服务器
master dns 10.0.0.8 222.222.222.8
slave dns 10.0.0.9 222.222.222.9
create database dns_dlz;
create table dns_records(
zone character varying(256),
host character varying(256) NOT NULL default '@',u5b8bu4f53; font-size:16px">
ttl integer,u5b8bu4f53; font-size:16px">
view character varying(256),u5b8bu4f53; font-size:16px">
type character varying(256),u5b8bu4f53; font-size:16px">
mx_priority integer,u5b8bu4f53; font-size:16px">
data character varying(256),u5b8bu4f53; font-size:16px">
resp_person character varying(256),u5b8bu4f53; font-size:16px">
serial integer,u5b8bu4f53; font-size:16px">
refresh integer,u5b8bu4f53; font-size:16px">
retry integer,u5b8bu4f53; font-size:16px">
expire integer,u5b8bu4f53; font-size:16px">
minimum integer
);
create INDEX dns_records_host_index on dns_records (host);
create INDEX dns_records_type_index on dns_records ("type");
create INDEX dns_records_zone_index on dns_records ("zone");
# zone sample.com
#soa 记录
insert into dns_records(zone,host,ttl,view,type,mx_priority,data,resp_person,serial,refresh,retry,expire,minimum) values ('sample.com','@',600,'LOCAL','SOA',NULL,'sample.com.','root.sample.com.',2011083001,28800,14400,86400,86400);
#dns 记录
#A记录 time.sample.com
#A记录 ns1.sample.com
#mx记录
其他域名的添加方式类似,将zone项替换为对于的域名即可
3、bind 编译安装及配置
rpm包默认不支持dlz模式,需要使用源码编译
./configure --with-dlz-postgres --enable-threads --prefix=/usr/local/bind
或
./configure --with-dlz-postgres --build=x86_64-RedHat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --with-libtool --localstatedir=/var --enable-threads --enable-ipv6 --with-pic --disable-openssl-version-check
以下安装路径为系统默认路径
配置文件 /etc/named.conf
其他配置文件路径 /etc/named/
4、创建相关配置文件
cd /etc
rndc-confgen >rndc.conf
tail -n6 rndc.conf | head -n5 | sed -e s/#\//g >named.conf
dig > named/named.root
rndc-confgen -a -c rndc.key
key的名称一定要一致,否则会出现不能使用 rndc 刷新、不能同步的问题。
使用 dnssec-keygen 生成view TSIG key
dnssec-keygen -a hmac-md5 -b 128 -n HOST local
dnssec-keygen -a hmac-md5 -b 128 -n HOST any
将生成的key 填入named.conf 对应的位置
如:
key "any" {
algorithm hmac-md5;
secret "0bUZSQ1p3OMbX/6nGB6YPQ==";
};
及在不同的view中使用各自key进行同步。
完整 named.conf 内容
options
{
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.log";
memstatistics-file "data/named_mem_stats.log";
#listen-on port 53 { 127.0.0.1; 10.0.0.8; 222.222.222.8; };
allow-recursion { 127.0.0.1; };
allow-transfer { dns_ip; }; #使用文件存储zone时使用 slave 无需此项
also-notify { 10.0.1.9; }; #使用文件存储zone时使用 slave 无需此项
edns-udp-size 512;
include "/etc/rndc.key";
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndckey"; };
key "local" {
secret "OuhPGr+uFmSEOm04ZPJFmA==";
acl "dns_ip" {
10.0.0.8; #master
10.0.0.9; #slave
acl "LOCAL" {
10.0.0.0/8;
include "/etc/named/local_acl.conf";
include "/etc/named/any.conf";
logging {
category edns-disabled { null; };
channel query_log {
file "/var/named/data/query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category queries {
query_log;
};
};
local_acl.conf
#local network view
view "local" {
match-clients { key local; LOCAL; }; #使用文件存储zone使用,用于master slave同步
#match-clients { LOCAL; }; #使用数据库时的配置,无需同步
allow-query-cache { LOCAL; };
allow-transfer { key local; }; #使用文件存储zone使用,用于master slave同步
server 10.0.0.9 { keys { local; }; }; #使用文件存储zone使用,用于master slave同步
#允许内部ip地址递归查询
allow-recursion {
10.0.0.0/16;
127.0.0.1;
#------使用文件存储zone 配置-----------
zone "sample.com" {
type master; #slave 配置 type slave;
file "/etc/named/sample.com.in.zone"
# masters { 10.0.0.8; }; #slave 配置
zone "1.0.10.in-addr.arpa" {
file "/etc/named/0.0.10.in-addr.arpa;
#---dlz postgresql database configure----
# dlz "postgres zone" {
# database "postgres 1
# {host=10.0.1.19 port=54320 dbname=dns_dlz user=dns_query}
# {select zone from dns_records where zone = '$zone$' limit 1}
# {select ttl,case when lower(type)='txt' then '\"' || data || '\"'
# when lower(type)='soa' then data || ' ' || resp_person || ' ' || serial || ' ' || refresh || ' ' || retry || ' ' || expire || ' ' || minimum
# else data end from dns_records where zone = '$zone$' and lower(view)='local' and host = '$record$'}
# {}
# resp_person,minimum from dns_records where zone = '$zone$'}";
# };
#---dlz postgresql database configure---- };
any.conf
view "any" {
match-clients { key local; ANY; }; #使用文件存储zone使用,用于master slave同步
#match-clients { ANY; }; #使用数据库时的配置,无需同步
allow-query-cache { ANY; };
allow-transfer { key any; }; #使用文件存储zone使用,用于master slave同步
server 10.0.0.9 { keys { any; }; }; #使用文件存储zone使用,用于master slave同步
222.222.222.0/24;
type master;
file "/etc/named/sample.com.zone";
zone "222.222.222.in-addr.arpa" {
type master; #slave 配置 type slave;
file "/etc/named/222.222.222.in-addr.arpa";
# dlz "postgres zone" {
# {host=10.0.1.1 port=5432 dbname=dns_dlz user=dns_query}
# when lower(type)='soa' then data || ' ' || resp_person || ' ' || serial || ' ' || refresh || ' ' || retry || ' ' || expire || ' ' || minimum
# else data end from dns_records where zone = '$zone$' and lower(view)='any' and host = '$record$'}";
附:测试命令
rndc reload #重新加载全部配置
rndc reload sample.com IN view_name #重新加载指定的域名下指定的View
rndc status #检查服务状态
dig @10.0.0.8 www.sample.com +noauthority +noadditional | grep -Ev "^(;|$)" #域名解析测试
#测试基本dns lookup 及兼容性测试
dig +nodnssec +norec +ignore ns . @L.ROOT-SERVERS.NET
dig +nodnssec +norec +ignore ns . @L.ROOT-SERVERS.NET
dig +dnssec +norec +ignore ns . @L.ROOT-SERVERS.NET
dig +dnssec +norec +ignore any . @L.ROOT-SERVERS.NET
dig +dnssec +norec +vc any . @L.ROOT-SERVERS.NET
dig +norec +dnssec +ignore dnskey se @A.NS.se
5、配置 named-chroot
配置 named-chroot 使named运行在 chroot模式下,
安装 bind97-chroot rpm包
yum -y install bind97-chroot
该包用来创建 chroot下的目录结构及修改named 启动参数 /etc/sysconfig/named
ROOTDIR=/var/named/chroot #自动添加
这个工作应该是可以手工完成的。
由于我对chroot还不是太了解,其中的原理尚不清楚。
检查chroot方式是否启动的方法:
命令: lsof -p `pgrep named`
6、配置过程中可能出现的错误:
Aug 30 15:24:15 server135 named[2486]: dns_rdata_fromtext: buffer-0x446c1340:1: near eof: unexpected end of input
Aug 30 15:24:15 server135 named[2486]: dns_sdlz_putrr returned error. Error code was: unexpected end of input
例如:SOA记录中的 resp_person 字段为空
使用rndc reload 重新加载zone时,出现下面的警告(使用文件存储时)
WARNING: key file (/etc/rndc.key) exists,but using default configuration file (/etc/rndc.conf) rndc: get config key list: not found
日志错误
Sep 1 10:14:38 server135 named[9849]: error (network unreachable) resolving '146.46.208.203.in-addr.arpa/PTR/IN': 2001:dc0:4001:1:0:1836:0:140#53
Sep 1 10:14:38 server135 named[9849]: error (network unreachable) resolving 'dns1.telstra.net/A/IN': 2001:dc0:2001:a:4608::59#53
即在 /etc/sysconfig/named 中加上 OPTIONS="-4" 启动选项。
master log中的错误日志
Aug 31 19:03:58 server135 named[8271]: client 10.0.0.9#39084: view local: zone transfer 'sample.com/IXFR/IN' denied
Aug 31 19:03:58 server135 named[8271]: client 10.0.0.9#43464: view local: zone transfer 'sample.com/AXFR/IN' denied
该问题是在master、slave同步过程中出现的,导致同步失败。
我的配置就是因为rndc key的名称不同导致的。
http://blog.163.com/digoal@126/blog/static/163877040201110235657127/