服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 9744|回复: 1

智能DNS配置

[复制链接]
dirtysea 发表于 2010-4-8 23:00:27 | 显示全部楼层 |阅读模式
1。介绍
采用双线机房,Bind9作为智能DNS,通过DNS View配置,自动根据客户端IP来判断,网通的用户解析出网通的IP,电信的解析出电信IP,使用户能够访问到临近的同网的服务器,避免跨网访问,从而提高访问速度,解决南北互访问题。


2。安装步骤

软件列表:

BIND9  http://www.isc.org
Ripe-dbase-client-v3  http://www.apnic.net



3。安装Bind9

# yum install bind*
# yum install caching-nameserver
详细见:http://www.dirtysea.com/viewthread.php?tid=1150&extra=page%3D1

默认安装在:/var/named/chroot



5. 建立相关目录及文件
mkdir -p /var/named/data
mkdir -p /var/named/master/any
mkdir -p /var/named/master/cnc
mkdir -p /var/named/master/telecom
mkdir -p /var/named/slaves
mkdir -p /var/log/named
mkdir -p /var/run/named
touch /var/named/cnc_acl.conf
touch /var/named/telecom_acl.conf
touch /var/log/named/dns_warning
touch /var/log/named/dns_log
touch /var/named/master/any.def
touch /var/named/master/cnc.def
touch /var/named/master/telecom.def
wget ftp://ftp.internic.org/domain/named.root -O /var/named/named.ca
chown -R named.named /var/log/named /var/run/named     (编译安装的还需要设置/var/named)
chmod -R 770 /var/log/named /var/run/named           (编译安装的还需要设置/var/named)


4.安装IP地址段查询工具Ripe-dbase-client-v3:

wget http://ftp.apnic.net/apnic/dbase ... se-client-v3.tar.gz

解压软件包:
#tar zxvf ripe-dbase-client-v3.tar.gz
#cd whois-3.1
#./configure --prefix=/usr
#Make;make install


6.配置ACL文件
设置网通IP列表ACL文件cnc_acl.conf:
/usr/bin/whois3 -h whois.apnic.net -l -i mb MAINT-CNCGROUP | grep "descr" | grep "Reverse" | awk -F "for" '{if ($2!="") print $2}'| sort -n | awk 'BEGIN{print "acl \"CNC\" '{'"}{print $1";"}END{print "'}';"}' > /var/named/cnc_acl.conf
设置电信IP列表ACL文件telecom_acl.conf:
/usr/bin/whois3 -h whois.apnic.net -l -i mb MAINT-CHINANET | grep "descr" | grep "Reverse" | awk -F "for" '{if ($2!="") print $2}'| sort -n | awk 'BEGIN{print "acl \"TELECOM\" '{'"}{print $1";"}END{print "'}';"}' > /var/named/telecom_acl.conf

7.配置rndc和/etc/named.conf(我的是/etc/named.caching-nameserver.conf)

用命令生成rndc.conf文件:
#/usr/sbin/rndc-confgen >/etc/rndc.conf

生成/etc/rndc.key: (yum安装的默认已经有了在 /var/named/chroot/etc/rndc.key)
#/usr/sbin/rndc-confgen -a
wrote key file "/etc/rndc.key"
生成在了/etc/下

设置rndc.conf:
vi /etc/rndc.conf
==========rndc.conf begin==========
options {
       default-key “rndc-key”;
       default-server 127.0.0.1;
       default-port 953;
};
include “include "/var/named/chroot/etc/rndc.key"”;
==========rndc.conf end============


配置/etc/named.conf
==========named.conf begin==========
acl "trusted-lan" {
    127.0.0.1/8;
    192.168.0.0/24;
};
options {
    directory "/var/named";
    dump-file "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    version "";
    datasize 40M;
    allow-transfer {
     "trusted-lan";
    };
    recursion yes;
    allow-notify {
        "trusted-lan";
    };
    allow-recursion {
        "trusted-lan";
    };
    auth-nxdomain no;
    forwarders {
        202.96.209.5;
        210.22.70.3;
    };
};
logging {
    channel warning {
     file "/var/log/named/dns_warning" versions 3 size 1240k;
     severity warning;
     print-category yes;
     print-severity yes;
     print-time yes;
    };
    channel general_dns {
        file "/var/log/named/dns_log" versions 3 size 1240k;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    category default {
        warning;
    };
    category queries {
        general_dns;
    };
};
include "cnc_acl.conf";
include "telecom_acl.conf";
view "view_cnc" {
    match-clients {
          CNC;
    };
    zone "." {
          type hint;
          file "named.ca";
    };
    include "master/cnc.def";
};
view "view_telecom" {
    match-clients {
          TELECOM;
    };
    zone "." {
          type hint;
          file "named.ca";
    };
    include "master/telecom.def";
};
view "view_any" {
    match-clients {
          any;
    };
    zone "." {
          type hint;
          file "named.ca";
    };
    include "master/any.def";
};
include "/var/named/chroot/etc/rndc.key";
==========named.conf end===========

8.增加域名解析配置文件

设置网通解析配置文件:
#vi /var/named/master/cnc.def
==========cnc.def begin==========
zone "entage.net"{
     type master;
     file "master/cnc/entage.net";
};
==========cnc.def end===========  


设置电信解析配置文件:
#vi /var/named/master/telecom.def
==========telecom.def begin==========
zone "entage.net"{
     type master;
     file "master/telecom/entage.net";
};
==========telecom.def end===========
设置网通电信以外解析配置文件:
# vi /var/named/master/any.def
==========any.def begin==========
zone "entage.net"{
     type master;
     file "master/any/entage.net";
};
==========any.def end===========
9.增加域名定义文件:
设置网通域名定义文件:
# vi /var/named/master/cnc/entage.net
==========cnc/entage.net begin==========
$TTL 3600
$ORIGIN entage.net.
@ IN SOA ns.entage.net. root.entage.net. (
                       2007011701  ;Serial
                       3600    ;Refresh ( seconds )
                       900    ;Retry ( seconds )
                       68400       ;Expire ( seconds )
                       15          ;Minimum TTL for Zone ( seconds )
                       )
@       IN      NS     ns.entage.net.
@       IN      A      218.108.238.221
ns      IN      A      218.108.238.221
www     IN      A      218.108.238.221
==========cnc/entage.net end===========
设置电信域名定义文件:
#vi /var/named/master/telecom/entage.net
==========telecom/entage.net begin==========
$TTL 3600
$ORIGIN entage.net.
@ IN SOA ns.entage.net. root.entage.net. (
                        2007011701  ;Serial
                        3600   ;Refresh ( seconds )
                        900   ;Retry ( seconds )
                        68400   ;Expire ( seconds )
                        15   ;Minimum TTL for Zone ( seconds )
                        )
@      IN       NS      ns.entage.net.
@      IN       A       61.152.241.97
ns     IN       A       61.152.241.97
www    IN       A       61.152.241.97
==========telecom/entage.net end===========
设置其它区域域名定义文件:
vi /var/named/master/any/entage.net
==========any/entage.net begin==========
$TTL 3600
$ORIGIN entage.net.
@ IN SOA ns.entage.net. root.entage.net. (
                        2007011701  ;Serial
                        3600   ;Refresh ( seconds )
                        900   ;Retry ( seconds )
                        68400   ;Expire ( seconds )
                        15   ;Minimum TTL for Zone ( seconds )
                        )
@      IN       NS      ns.entage.net.
@      IN       A       61.152.241.97
ns     IN       A       61.152.241.97
www    IN       A       61.152.241.97
==========any/entage.net end===========


参考:http://www.linuxnotes.cn/?p=177  和http://bbs.linuxsun.cn/thread-348-1-1.html
 楼主| dirtysea 发表于 2010-4-16 13:11:29 | 显示全部楼层
利用Bind DLZ MySQL 构建智能DNS



【题 纲】
一、相关述语简介
二、智能DNS系统服务规划
三、安装配置Bind-DLZ (介绍Bind-dlz具体安装)
四、添加相关记录并进行测试
五、后续话题及相关参考.
一、相关术语简介:
1、智能DNS(Bind-view)
智能DNS的原理很简单:在用户解析一个域名的时候,判断一下用户的IP,然后跟DNS服务器内部的IP表匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址。目前的域名服务运营商不提供智能DNS服务,所以必须自行架设DNS服务或者使用网上免费的智能DNS服务,如DNSPOD.

2.Bind-DLZ
Bind-DLZ主页:http://bind-dlz.sourceforge.net/
DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处:
* BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。
* BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。
* BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。
* 如果近修改一条记录,那么要重新加载或者重启BIND才能生效,那么需要时间,可能会影响客户端查询。
而Bind-dlz 即将帮你解决这些问题, 对Zone文件操作也更方便了,直接对数据库操作,可以很方
便扩充及开发管理程序。

二、智能DNS系统服务规划:
1、NameServer 服务器注册(到新网或者万网后台添加)
ns1.aim18.com  211.100.72.137
ns2.aim18.com  219.232.244.11

下载 (12.5 KB)
2009-3-8 19:52



2、测试NS记录是否生效.
  • #dig ns aim18.com
  • #dig aim18.com +trace

复制代码
更多的命令技巧请参考: http://bbs.linuxtone.org/thread-2021-1-1.html

3、Bind-View规划
www.aim18.com 网通 (CNC)  210.51.36.116 (NK**)
www.aim18.com 电信(TELECOM) 221.238.249.178 (CU)
www.aim18.com 教育网(EDU) 202.205.109.207 (教育网)
www.aim18.com 电信通(ANY) 211.103.156.230 (51CTO)
【注】:由于资源问题,在此引用国内一些知名站点的IP做实验,请见谅~!
即当您是网通用户的时候,输入www.aim18.com智能DNS服务器将把你分配到210.51.36.116 (NK**) 这台服务器,其它同例。
View{CNC(网通),TELECOM(电信),EDU(教育网),ANY(其它所有)}
  • include "/usr/local/bind/etc/cnc_acl.conf";
  • include "/usr/local/bind/etc/telecom_acl.conf";
  • include "/usr/local/bind/etc/edu_acl.conf";

复制代码
【注】IP库及ACL,如果你有比较详细的按城市或者地域的IP库,在设计BIND-VIEW这个字段的时候,VIEW就可以以城市或地区来命名和规划.

三、安装配置Bind-DLZ
1、编译安装MySQL
在此不作介绍,具体的请看http://www.linuxtone.org 相关内容。
注意编译MySQL的时候禁掉线程,相关的参数如下:
  • --without-server --disable-threads --without-pthread

复制代码
2、编译安装Bind

复制代码
  • #cd bind-9.6.0-P1
  • #./configure --with-dlz-mysql --enable-largefile --enable-threads=no --prefix=/usr/local/bind --with-openssl=/usr/local/openssl/

复制代码
注:禁掉线程;--with-openssl= 你的openssl安装的相关目录有可能是/usr
  • # make && make install

复制代码
创建相关配置文件
  • cd /usr/local/bind/etc
  • ../sbin/rndc-confgen >rndc.conf
  • tail -n10 rndc.conf | head -n9 | sed -e s/#\//g >named.conf

复制代码
# vi localhost.zone
  • ttl 86400
  • @ IN SOA localhost. root.localhost. (
  • 1997022700 ; Serial
  • 28800 ; Refresh
  • 14400 ; Retry
  • 3600000 ; Expire
  • 86400 ) ; Minimum
  • IN NS localhost.
  • 1 IN PTR localhost.

复制代码
# dig > named.root
#vi named.conf 在后面加入如下:
  • include "/usr/local/bind/etc/cnc_acl.conf"; //网通ACL
  • include "/usr/local/bind/etc/telecom_acl.conf"; //电信ACL
  • include "/usr/local/bind/etc/edu_acl.conf"; //教育网ACL
  • include "/usr/local/bind/etc/view.conf"; //DLZ相关的配置

复制代码
#vi /usr/local/bind/etc/view.conf //创建view相关的配置文件
#cnc-view //贴出其中网通部分的范例,更详细的请参照view.conf配置文件.
  • view "cnc_view" {
  • match-clients { CNC; };
  • allow-query-cache { none; };
  • allow-recursion { none; };
  • allow-transfer { none; };
  • recursion no;
  • dlz "Mysql zone" {
  • database "mysql
  • {host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass= }
  • {select zone from dns_records where zone = '%zone%' and view='CNC' limit 1}
  • {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view='CNC'}
  • {}
  • {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end as mydata, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '%zone%' and view='CNC'}
  • {select zone from xfr_table where zone = '%zone%' and client = '%client%' and view='CNC' limit 1}
  • {update data_count set count = count + 1 where zone ='%zone%' and view='CNC'}";
  • };
  • };

复制代码
官方相关参考请参照: http://bind-dlz.sourceforge.net/mysql_example.html

3、DLZ相关数据库表结构建立 (//详细见提供的cdn_view.sql含测试数据.)
  • mysql>create database cdn_view; //创建数据库名为cdn_view
  • mysql>use cdn_view;
  • CREATE TABLE `dns_records` (
  • `id` int(10) unsigned NOT NULL auto_increment,
  • `zone` varchar(255) NOT NULL,
  • `host` varchar(255) NOT NULL default '@',
  • `type` enum('MX','CNAME','NS','SOA','A','PTR') NOT NULL,
  • `data` varchar(255) default NULL,
  • `ttl` int(11) NOT NULL default '800',
  • `view` enum('CNC','TELECOM','EDU','ANY') NOT NULL, //智能DNS区域范围
  • `mx_priority` int(11) default NULL,
  • `refresh` int(11) NOT NULL default '3600',
  • `retry` int(11) NOT NULL default '3600',
  • `expire` int(11) NOT NULL default '86400',
  • `minimum` int(11) NOT NULL default '3600',
  • `serial` bigint(20) NOT NULL default '2008082700',
  • `resp_person` varchar(64) NOT NULL default 'root.domain.com.',
  • `primary_ns` varchar(64) NOT NULL default 'ns1.domain.com.',
  • `data_count` int(11) NOT NULL default '0',
  • PRIMARY KEY (`id`),
  • KEY `type` (`type`),
  • KEY `host` (`host`),
  • KEY `zone` (`zone`)
  • ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

复制代码
#desc dns_records; 显示表结构.

下载 (11.19 KB)
2009-3-8 19:52



【注】直接将本文提供的cdn_vew.sql导入你的数据库即可,具体操作如下:
  • Mysql>create database cdn_view; //创建cdn_view数据库
  • #mysql cdn_view –uroot –p < cdn_view.sql 导入数据库

复制代码
4、启动bind服务.
# /usr/local/bind/sbin/named -uroot -g -d 9 //调试状态,如果没有报错说明环境配置正确。
做成启动服务. Debug的时候多用此模式启动bind.
# /usr/local/bind/sbin/rndc reload 重载named.conf相关配置文件.
# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 启动bind服务.

四、添加相关记录并进行测试
将相关解析记录添加到数据库内,以下是相关SQL范例供参考:
1、添加SQL创建相关ZONE及记录.(以网通为例,具体建我提供的测试SQL)
  • - - - - SOA
  • INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  • ('aim18.com', '@', 'SOA', 'ns1.aim18.com.', 10, 'CNC', NULL, 3600, 3600, 86400, 10, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  • - - - - NS--SOA
  • INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`,
  • `primary_ns`, `data_count`) VALUES
  • ('aim18.com', '@', 'SOA', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  • - - - - NS1
  • INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  • ('aim18.com', 'ns1', 'A', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  • - - - - NS2
  • INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  • ('aim18.com', 'ns2', 'A', '219.232.244.11', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  • - - - - A
  • INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  • ('aim18.com', 'www', 'A', '210.51.36.116', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  • - - - -CNAME
  • INSERT INTO dns_records (zone,host,type,DATA,view)
  • VALUES ('aim18.com', 'man', 'CNAME', 'www','CNC');

复制代码
2. 基本查询测试:
通过网通的机器查询,解析后得到提网通的服务器,说明智能解析是正确的。

下载 (5.46 KB)
2009-3-8 19:52



下载 (*** KB)
2009-3-8 19:52



下载 (6.03 KB)
2009-3-8 19:52


经测试解析都比较正确,能将电信用户解析到电信服务器,网通用户解析到网通服务器,教育网用户
解析到教育网网服务器,电信通用户解析到电信通服务器.
【注】本方案中的IP库抓取由(edison7500) 欣哥热情帮助分析抓取IP库,在此表示感谢!目前从测试来看IP库比较精准,能够真正做到智能DNS的智能解析

3、性能测试工具
  • # cd /usr/local/src/bind-dlz
  • # cd bind-9.6.0-P1/contrib/queryperf
  • # ./configure && make

复制代码
# vi rslist //解析记录列表写入此文件
  • www.aim18.com A
  • bbs.aim18.com A
  • man.aim18.com CNAME

复制代码
…..
#vi do.sh //建立一个循环程序对了bind服务器查询进行压力测试,同时多关注数据库状态.
  • #!/bin/bash
  • while true
  • do
  • ./queryperf –d rslist -s 211.100.72.137 -v
  • done

复制代码
/usr/local/bind/sbin/named -uroot -g -d 9 bind启为调试模式,在bind排错的时候请多用此模式来debug.
这里可以观察到查询过程中执行的SQL。
【注】在此不做深入详细的性能和压力测试报告,用户可以自己通过以上范例编写压力测试方案。

五、后续话题及相关参考
1、利用PHP程序开发一套Bind-DLZ 管理程序
目前正在编写PHP管理页面,Falcon.C版主正在帮我做这方面的工作。主要在于数据设计和优化还需要花一些时间。大家可以考虑进一步优化数据库结构,同时也希望能与我分享你的心得。
PHP页面管理参考网站:
1)、https://svn.lokkju.com/svn/dnsEditor/trunk/ 国外开源程序
2)、http://www.dnswood.com/ dnswood的管理界面
3)、http://www.dnspod.com dnspod老牌智能DNS站的管理界面,用户体验做的一流!
2、智能DNS集群构建
Bind本身也很容易构建集群,由于Zone文件是存在数据库里面,利用mysql服务
器也很容易构建多个集群,很方便扩充,在些就不做详细介绍。
相关技术点: 负载均衡:LVS, 数据库集群:MySQL Replication.
3、结合SQUID服务器,可以很轻松实现CDN.
目前国内CDN技术比较热,国内各大门户都在考虑自建CDN,利用本文提供的智能DNS构建文档可以很方便的实现智能DNS解析系统,再与SQUID集群结合,可以很轻松实现CDN。下次我将给大家介绍SQUID构建和优化的经验,同时推荐出整
套的CDN集群解决方案,请实时关注linuxtone: http://www.linuxtone.org 相关信息。
4、相关参考网址.
1)、DNS相关工具(解析排错):http://bbs.linuxtone.org/thread-2021-1-1.html
2)、Bind-DLZ国外相关资料参考:
http://projects.navynet.it/DLZ/dlz-addons/
http://svn.the-mesh.org/trac.cgi/wiki/HardyBindDlzHowto
http://svn.the-mesh.org/trac.cgi/attachment/ticket/40/bind9-dlz.sql
http://projects.navynet.it/DLZ/dlz-addons/
5、附件相关的文件说明:
bind_dlz/etc.tar.gz 为/usr/local/bind/etc配置文件含IP库,编译后直接替换此文件.
bind_dlz/cdn_view.sql 为bind-dlz数据库表结构及数据, 直接用mysql 命令导入数据库.
下载地址:http://www.linuxtone.org/project/cdn/bind-dlz.tar.gz
测试数据:http://www.linuxtone.org/project/cdn/test.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-4-17 05:06 , Processed in 0.153329 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表