- 浏览: 43213 次
- 性别:
- 来自: 北京
最新评论
-
pujing:
start G:\8娱乐\舞蹈\xiju..\
建立一个别人不能接触的文件夹 -
ivywong:
楼主你好!公司准备做样一个业务平台,看到这篇文章收益匪浅。我想 ...
业务基础平台的设计
文档内容:
1.关于本文档
2.Bind+Mysql+Mysql-bind环境搭建
3.Bind配置
4.Mysql数据库设置
5.常见问题解决
文档正文:
1. 关于本文档
本文档用于DNS和BIND结合配置域名解析和其他更深化的服务,如DNS轮询和squid反向加速结合做简单的流量动态均衡,泛解析和apachemod_rewrite结合做虚拟多级域名,应用IP视图做流量处理。偶尔涉及到源码修正是为更好提供服务和进行调试所用。如果有兴趣可以发邮件至文档头处的邮箱进行讨论。另外,在后面的文档中还有一个自动安装和简单配置bind+mysql+mysql-bind的脚本auto_bind_sdb.sh,可以方便使用者使用。
文档分五个部分:
1.关于本文档,介绍文档内容和结构。
2.Bind+Mysql+Mysql-bind环境搭建,略为介绍Bind+Mysql+Mysql-bind的获取和安装。
3.Bind配置,初略介绍Bind用于DNS轮询,泛解析和IP视图的配置。
4.Mysql数据库设置,正确设置Mysql数据库取代Bind的文档格式的分布式IP库。
5.常见问题解决,在配置过程的一些常见问题解决和分析,这是文章的重点。
如果你是带着问题前来,前往第五和第六部分即可。如果需要了解Bind,还需要参看第二和第三部分。
2. Bind+Mysql+Mysql-bind环境搭建
1.安装Mysql
安装mysql的文档很多,在这里不再赘述,无非是这么几个步骤:
引用
wget mysql*.tar.gz
tar vxzf mysql*.tar.gz && cd mysql*
./configure --prefix=/usr/local/mysql--with-charset=gbk >configure.log 2>&1
make >make.log 2>&1 && makeinstall >install.log 2>&1
然后运行mysql_install_db,注意/var/lib/mysql下的权限,然后便可以启动mysql了。需要注意的是,一定要确保mysql–uroot能直接访问进mysql (这是最简便的方法)。
2.安装bind,使用bind的mysql sdb
我使用的bind版本是9.3.4,在bind的官网ftp上可以下载到最新稳定的bind版本.Bind的mysql sdb在sf.net上可以下载到0.1版本,似乎mysql-bind(mysqlsdb)已经停止更新了.下载到bind-9.3.4.tar.gz和mysql-bind-0.1.tgz后便可以安装了.
引用 tar vxzf bind-9.3.4.tar.gz && tarvxzf mysql-bind-0.1.tgz
cp mysql-bind/mysqldb.c bind-9.3.4/bin/named-f
cp mysql-bind/mysqldb.hbind-9.3.4/bin/named/include -f
同时,修改bind-9.3.4.tar.gz/bin/named/Makefile.in文件:
将
DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =
更改为
DBDRIVER_OBJS=mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES =-I'/usr/local/mysql/include/mysql'
DBDRIVER_LIBS = -L'/usr/local/mysql/lib/mysql'-lmysqlclient -lz -lcrypt -lnsl -lm -lc -lnss_files -lnss_dns-lresolv -lc -lnss_files -lnss_dns -lresolv
同时在bind-9.3.4/bin/named/main.c中,找到
/* xxdb_init(); */
在后面添加
mysqldb_init();
再找到
/* xxdb_clear(); */
在后面添加
mysqldb_clear();
./configure –prefix=/usr/local/named–enable-threads >configure.log 2>&1
make >make.log 2>&1 && makeinstall >install.log 2>&1
如此,如果没有出错,正常的bind mysqlsdb就已经添加了.初步配置好bind和建立mysql的dns数据库后便可以做测试了.
3.启动并测试
关于bind的配置和mysql的dns数据库建立在第三和第四部分介绍.你可以先查看后面两部分再回来看bind启动和测试.
启动bind有几种模式,在调试的时候,建议采用 bind -unamed -g的方式运行,可以在终端看见详细的调试信息.也可以在mysqldb.c中加入query语句的输出和query.c中加入bind解析流程的输入,来查看bind的运行状态.
而以daemon方式运行则可以采用 bind -u named -c/etc/named.conf .建议采用named用户setuid方式运行.
如果named能够正常运作,这里的正常的运作是说named启动后没有任何fail或任何error,例如加载所有zone/db时都成功,而没有fail.那么便可以在随意一台能互相访问的机器上做测试了.设计client上的/etc/resolv.conf,在第一行添加nameservernamed_server_ip.然后便可以用安装bind时已经额外安装的工具dig/nslookup进行测试了.关于dig和nslookup命令,可以用man1 dig和man 1 nslookup查看. 最常用的dig进行正向解析:
引用dig www.mydomain.com
dig -x **.**.**.**(IP)
如果没有得到结果,却有授权信息的话,那么基本配置是正确的,问题可能在A记录或者视图是否正确上.如果连授权信息都不显示的话,那么基本配置出现了问题,如zone未能加载,db链接问题等等.可以查看调试信息分析原因.
3. Bind配置
bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为BerkeleyInternet NameDomain。它是目前世界上使用最为广泛的DNS服务器软件,也是大多数系统管理员最喜欢的DNS软件,支持各种unix平台和windows平台。
bind的配置比较繁琐,在其官方网站上有为系统管理员编写的80多页的手册,对于9.0以上的版本早有汉化版本,xplore提供下载地址在此。或者,可以直接参考鸟哥的linux私房菜中关于dns配置一章,基本上能满足所需的要求(http://linux.vbird.org/lin...
这里简单介绍bind配置IP视图,DNS轮询和泛解析.(主要是两个方面:named.conf和zone文件)
bind的IP视图是在bind9中才引用的强大功能,能实现根据ip来源定义不同域名系统的功能,解决多入口则多出口的问题.在named.conf中,IP视图的关键字是view,其定义规则和zone基本一致,只是zone没有view的一个功能,那就是对于单独的view,可以拥有zone实现域名体系.
例如:
引用view "outside" {
match-clients { outside; };
recursion yes;
zone "." IN {
type hint;
file "var/root.zone";
};
zone "test.mydomain.com.cn" IN {
type master;
database "mysqldb dnstest_mydomain_com_cn_outside localhost root rootroot";
# file "var/test.mydomain.com.cn.outside";
};
zone "10.in-addr.arpa" IN {
type master;
database "mysqldb dns10_outside localhost root rootroot";
# file "var/10.outside";
};
zone "localhost" IN {
type master;
file"var/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "var/127.0.0.zone";
allow-update { none; };
};
};
当然,上面的view_name:“outside”是在前面acl中定义的.但是需要注意的是,多个视图的并集最好是一个ip全集,不要丢掉某些ip.而且,在view视图配置中,如果定义master/slaver模式做分布式的话,slaver接受的notify和数据只会匹配slaver自己ip所在视图的数据,也就是说,如果单个ip的slaver需要和master同步数据的话,永远只能同步一个view,而其他的则不能.解决办法可以考虑在slaver的机器上进行ipalias,设置多个别名分别位于master的不同view中,在master的allow-transfer和allow-notify中添加这些ip别名,便可以完成所有view的数据同步了.更详细的信息参看这篇文档(http://www.chinaunix.net/j...).
对于DNS轮询,主要是在zone里进行设置.zone的SOA,NS记录基本不变.例如需要将www.mydomain.com关联到192.168.0.[1-4],则可以这么写:
引用
www.mydomain.com. IN A 192.168.0.1
www.mydomain.com. IN A 192.168.0.2
www.mydomain.com. IN A 192.168.0.3
www.mydomain.com. IN A 192.168.0.4
在逆向zone里可以这么写:
引用
1.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
2.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
3.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
4.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
利用bind做DNS轮询(roundrabin)可以将多个session分散到不同的ip上去减缓单台机器的链接压力.但是,它并不能真正做到负载均衡,因为一旦某个ip失效,那么在轮询到该ip的session将全部丢失,bind本身并不能多做些什么.但是,如果使用了bind的mysqlsdb的话,这个问题能够得到一定缓解.因为,基于某个协程(一段时间间隔内监听bind做round-rabin的ip)可以动态剔除失效ip,并动态加入复效ip.然而,并不能保证,bind不会将某个session分配给负载最重的ip.
泛解析在多级虚拟域名上有很好的利用.它可以将符合某个规则的域名解析到一个ip上,利用该ip上的其他应用结合(如apache的mod_rewrite),可以实现额外的功能(如多级虚拟域名).在zone配置中,对于一条这样的记录:
引用 * IN A 192.168.0.111
对于任意匹配到该zone的域名,首先都会查询和该域名完全匹配的记录,如果存在完全匹配的,则将这个域名关联到与之对应的ip上.如果没有完全匹配的,则将之关联到192.168.0.111上. 而不论* IN A192.168.0.111写在zone A记录的何处,都遵循该流程(bind9).这点在named.conf中的view和zone的访问原则是不同的,view和zone只会在第一个匹配的里面进行解析.
对于一般的bind配置,建议参看文章前面提到的鸟哥的linux私房菜关于dns部分.包括如何设置根zone和localhostzone等等,还有rndc控制bind等等.
然而,在mysql的sdb中最初并不能支持泛解析.需要进行源码修改才能支持.这个问题在第五部分给出.
4. Mysql数据库配置
需要注意的是,如果需要利用mysql的sdb,那么需要在named.conf中的zone资源中用database关键字,而不是file关键字或者其他.规则如下:
引用 database "mysqldb dns 10_outside localhostroot rootroot";
mysqldb是sdb驱动注册的名称,dns是mysql中bind使用的数据库名,10_outside是表明,对应于一个zone(里面的内容也就是zone file中的内容),localhost是mysql的host, root是登陆mysql的用户,rootroot是登陆mysql用户的密码(需要明文显示,可以自己修改即可).
看到上面的说明,那么,很显然,需要在mysql中做相应的配置.如创建一个dns的数据库;将root密码改成rootroot(就本例子而言,其实你可以不用root,同时grant权限便可以);创建一个表名10_outside;往表10_outside中按bind的要求引入数据记录,SOA/NS/A/PTR/CNAME/MX/TXT/HINFO等等.但是,需要注意的是,在sdb中,没有设计$ORIGIN和$TTL这两个全局变量,因此,$TTL一般都在记录里写明,$ORIGIN则全部默认为.(根),也就是说所有记录的第一项都必须以根作为$ORIGIN.而IN字段是sdb默认的方式,一般省略,目前,非基于inet的DNS已经很少了.
进行如下操作:
引用 mysqladmin -uroot password rootroot
mysqladmin -uroot -prootroot create dns
cat tmpfile -- MySQL dump 9.11
--
-- Host: localhost Database:dns
-- ------------------------------------------------------
-- Server version 4.0.27
--
-- Table structure for table `10_outside`
--
DROP TABLE IF EXISTS 10_outside;
CREATE TABLE 10_outside (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;
--
-- Dumping data for table `10_outside`
--
LOCK TABLES 10_outside WRITE;
INSERT INTO 10_outside VALUES('25.71.210.10.in-addr.arpa',3600,'PTR','cas1.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'SOA','test.mydomain.com.cn.zhengyu.staff.mydomain.com.cn. 20070319 1800 600 604800600');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas1.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas2.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas3.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('27.71.210.10.in-addr.arpa',3600,'PTR','cas2.test.mydomain.com.cn.');
UNLOCK TABLES;
--
-- Table structure for table `test_mydomain_com_cn_outside`
--
DROP TABLE IF EXISTS test_mydomain_com_cn_outside;
CREATE TABLE test_mydomain_com_cn_outside (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;
--
-- Dumping data for table `test_mydomain_com_cn_outside`
--
LOCK TABLES test_mydomain_com_cn_outside WRITE;
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'SOA','test.mydomain.com.cn.zhengyu.staff.mydomain.com.cn. 20070319 1800 600 604800600');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas1.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas2.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas3.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas1.test.mydomain.com.cn',3600,'A','10.210.71.25');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas2.test.mydomain.com.cn',3600,'A','10.210.71.27');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas3.test.mydomain.com.cn',3600,'A','10.210.132.80');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.191');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.192');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.193');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.194');
INSERT INTO test_mydomain_com_cn_outside VALUES('*',3600,'A','10.210.71.1');
INSERT INTO test_mydomain_com_cn_outside VALUES('conf.test.mydomain.com.cn',3600,'CNAME','cas2.test.mydomain.com.cn.');
UNLOCK TABLES;
EOF
mysql -uroot -prootroot dns rm-rf tmpfile
其中写进tmpfile中的各个ip和域名对可以自己定义便可.利用mysqlsdb有个很显著的好处,那便是做了mysql数据库里的修改,不需要对bind服务进行重新启动.当然,排除新建表的操作,如果需要新建一张表的话,也就意味着要加入一个zone,是需要在named.conf里面进行添加的.(可以考虑采用cron.d/ld.conf.d/udev.rules.d的方式include进去,呵呵.)
如果配置成功了mysql数据库后,尝试用dig/nslookup/host测试,是否能够获得解析.
5. 常见问题解决
1.让mysql sdb支持泛解析,DNS轮询和IP视图.
对于IP视图,由于sdb是用数据库表取代zonefile,那么意味着sdb无论如何是支持IP视图的,只需要在named.conf中配置好view便可.对于DNS轮询,同样在数据库中建立一个域名对应于多个ip的记录便可.而对应于泛解析,由于数据库本身并不能智能识别*的含义,因此需要在sdb程序段进行修改才能实现泛解析.因此在分析bind的sdb原理和处理流程后,很容易在mysqldb.c中加入泛解析的实现.可以下载mysql-bind-0.1-modify.tar.gz取代最开始的mysql-bind-0.1.tgz,解压后的mysqldb.c便已经实现泛解析功能.或者使用patch打上补丁,补丁:mysql-bind-modify.patch.然后在需要进行泛解析的数据库表(对应于相应的zone)中加入一条A记录:
引用 INSERT INTO your_table_name VALUES('*',3600,'A','your_ip');
这样便可以进行泛解析了.测试一下.
www.xplore.cn提供了bind-9.3.4下载,mysql-bind-0.1下载和增加了泛解析的mysql-bind-0.1-modify.tar.gz下载.
2.打开bind处理流程的调试信息.
打开bind处理流程的调试信息对于以 named -u named-g方式进行调试时有很大的作用.在bind-9.3.4/bin/named/query.c中,找到
引用#if 0(惟一一处)
将下面的内容
#if 0
#define CTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_CLIENT, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"client %p: %s", client, (m))
#define QTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_GENERAL, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"query %p: %s", query, (m))
#else
#define CTRACE(m) ((void)m)
#define QTRACE(m) ((void)m)
#endif
替换成:
#if 1
/*
#define CTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_CLIENT, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"client %p: %s", client, (m))
#define QTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_GENERAL, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"query %p: %s", query, (m))
*/
#define CTRACE(m) fprintf(stderr,"client %p:%s\n",client,(m))
#define QTRACE(m) fprintf(stderr,"query %p:%s\n",query,(m));
#else
#define CTRACE(m) ((void)m)
#define QTRACE(m) ((void)m)
#endif
所有源码操作过之后都需要重新编译,重新运行才能生效.这样在-g运行named时会将一些解析信息显示出来.
3.loading zone: creating database: failure错误处理.
如果出现这个问题,那说明bindsdb驱动和mysql链接出现了问题,诸如密码错误,dns没有建立,引用/tmp/mysql.sock错误等等.这个问题出现之后,你需要在mysqldb.c中加入一些调试信息:
在mysqldb.c的db_connect函数中修改:
引用if (mysql_real_connect ( &dbi->conn, dbi->host,dbi->user, dbi->passwd, dbi->database, 0, NULL, 0 ))
{
fprintf(stderr,"\nconnect successfully.............. \n");
return (ISC_R_SUCCESS);
}
else
{
fprintf(stderr,"\nconnect fail:%s , host %s,user%s,passwd %s,db %s,port %d...................\n",mysql_error(&dbi->conn),dbi->host,dbi->user,dbi->passwd,dbi->database);
return (ISC_R_FAILURE);
}
这样方便得到出错信息.然后根据出错信息调试mysql,使bindsdb能成功链接mysql.
4.Dig结果分析处理.
如果在执行dig xx.mydomain.com出现以下几种情况:
引用;; QUESTION SECTION:
;xx.mydomain.com. IN A
;; AUTHORITY SECTION:
*****************************************************************
;; Query time: 8 msec
这说明在bind的基本配置都正确,但是数据库表项中没有添加该A记录或者添加的记录有问题,特别是那些对file方式配置bind用熟的管理员,他们已经能很好的使用$ORIGIN进行处理,但是需要明白那就是mysql是不识别$ORIGIN的,一定需要写全称.同时第一项的最后一个点是不必要的.如果上面的分析还不能解决问题,请在mysqldb.c中凡事出现mysql_query()API之前将query的str打印出来.便可以知道问题是否出在mysql查询中.
而其他错误,如没有出现
引用;; AUTHORITY SECTION:
这一选项,说明bind的基本配置出现问题,诸如在mysql的表中是否丢失SOA/NS记录,或者SOA/NS记录出现错误.特别是SOA/NS的第一项后面多了一个小黑点.
具体原理分析请参看第四部分的第三段.自动脚本请参见下一篇文章:http://wf.xplore.cn/read.p...
本文参考了如下网络资源,谨向这些文章的作者致敬:
1. http://linux.vbird.org/lin...
2. http://www.study-area.org/...
3. 官方文档
1.关于本文档
2.Bind+Mysql+Mysql-bind环境搭建
3.Bind配置
4.Mysql数据库设置
5.常见问题解决
文档正文:
1. 关于本文档
本文档用于DNS和BIND结合配置域名解析和其他更深化的服务,如DNS轮询和squid反向加速结合做简单的流量动态均衡,泛解析和apachemod_rewrite结合做虚拟多级域名,应用IP视图做流量处理。偶尔涉及到源码修正是为更好提供服务和进行调试所用。如果有兴趣可以发邮件至文档头处的邮箱进行讨论。另外,在后面的文档中还有一个自动安装和简单配置bind+mysql+mysql-bind的脚本auto_bind_sdb.sh,可以方便使用者使用。
文档分五个部分:
1.关于本文档,介绍文档内容和结构。
2.Bind+Mysql+Mysql-bind环境搭建,略为介绍Bind+Mysql+Mysql-bind的获取和安装。
3.Bind配置,初略介绍Bind用于DNS轮询,泛解析和IP视图的配置。
4.Mysql数据库设置,正确设置Mysql数据库取代Bind的文档格式的分布式IP库。
5.常见问题解决,在配置过程的一些常见问题解决和分析,这是文章的重点。
如果你是带着问题前来,前往第五和第六部分即可。如果需要了解Bind,还需要参看第二和第三部分。
2. Bind+Mysql+Mysql-bind环境搭建
1.安装Mysql
安装mysql的文档很多,在这里不再赘述,无非是这么几个步骤:
引用
wget mysql*.tar.gz
tar vxzf mysql*.tar.gz && cd mysql*
./configure --prefix=/usr/local/mysql--with-charset=gbk >configure.log 2>&1
make >make.log 2>&1 && makeinstall >install.log 2>&1
然后运行mysql_install_db,注意/var/lib/mysql下的权限,然后便可以启动mysql了。需要注意的是,一定要确保mysql–uroot能直接访问进mysql (这是最简便的方法)。
2.安装bind,使用bind的mysql sdb
我使用的bind版本是9.3.4,在bind的官网ftp上可以下载到最新稳定的bind版本.Bind的mysql sdb在sf.net上可以下载到0.1版本,似乎mysql-bind(mysqlsdb)已经停止更新了.下载到bind-9.3.4.tar.gz和mysql-bind-0.1.tgz后便可以安装了.
引用 tar vxzf bind-9.3.4.tar.gz && tarvxzf mysql-bind-0.1.tgz
cp mysql-bind/mysqldb.c bind-9.3.4/bin/named-f
cp mysql-bind/mysqldb.hbind-9.3.4/bin/named/include -f
同时,修改bind-9.3.4.tar.gz/bin/named/Makefile.in文件:
将
DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =
更改为
DBDRIVER_OBJS=mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES =-I'/usr/local/mysql/include/mysql'
DBDRIVER_LIBS = -L'/usr/local/mysql/lib/mysql'-lmysqlclient -lz -lcrypt -lnsl -lm -lc -lnss_files -lnss_dns-lresolv -lc -lnss_files -lnss_dns -lresolv
同时在bind-9.3.4/bin/named/main.c中,找到
/* xxdb_init(); */
在后面添加
mysqldb_init();
再找到
/* xxdb_clear(); */
在后面添加
mysqldb_clear();
./configure –prefix=/usr/local/named–enable-threads >configure.log 2>&1
make >make.log 2>&1 && makeinstall >install.log 2>&1
如此,如果没有出错,正常的bind mysqlsdb就已经添加了.初步配置好bind和建立mysql的dns数据库后便可以做测试了.
3.启动并测试
关于bind的配置和mysql的dns数据库建立在第三和第四部分介绍.你可以先查看后面两部分再回来看bind启动和测试.
启动bind有几种模式,在调试的时候,建议采用 bind -unamed -g的方式运行,可以在终端看见详细的调试信息.也可以在mysqldb.c中加入query语句的输出和query.c中加入bind解析流程的输入,来查看bind的运行状态.
而以daemon方式运行则可以采用 bind -u named -c/etc/named.conf .建议采用named用户setuid方式运行.
如果named能够正常运作,这里的正常的运作是说named启动后没有任何fail或任何error,例如加载所有zone/db时都成功,而没有fail.那么便可以在随意一台能互相访问的机器上做测试了.设计client上的/etc/resolv.conf,在第一行添加nameservernamed_server_ip.然后便可以用安装bind时已经额外安装的工具dig/nslookup进行测试了.关于dig和nslookup命令,可以用man1 dig和man 1 nslookup查看. 最常用的dig进行正向解析:
引用dig www.mydomain.com
dig -x **.**.**.**(IP)
如果没有得到结果,却有授权信息的话,那么基本配置是正确的,问题可能在A记录或者视图是否正确上.如果连授权信息都不显示的话,那么基本配置出现了问题,如zone未能加载,db链接问题等等.可以查看调试信息分析原因.
3. Bind配置
bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为BerkeleyInternet NameDomain。它是目前世界上使用最为广泛的DNS服务器软件,也是大多数系统管理员最喜欢的DNS软件,支持各种unix平台和windows平台。
bind的配置比较繁琐,在其官方网站上有为系统管理员编写的80多页的手册,对于9.0以上的版本早有汉化版本,xplore提供下载地址在此。或者,可以直接参考鸟哥的linux私房菜中关于dns配置一章,基本上能满足所需的要求(http://linux.vbird.org/lin...
这里简单介绍bind配置IP视图,DNS轮询和泛解析.(主要是两个方面:named.conf和zone文件)
bind的IP视图是在bind9中才引用的强大功能,能实现根据ip来源定义不同域名系统的功能,解决多入口则多出口的问题.在named.conf中,IP视图的关键字是view,其定义规则和zone基本一致,只是zone没有view的一个功能,那就是对于单独的view,可以拥有zone实现域名体系.
例如:
引用view "outside" {
match-clients { outside; };
recursion yes;
zone "." IN {
type hint;
file "var/root.zone";
};
zone "test.mydomain.com.cn" IN {
type master;
database "mysqldb dnstest_mydomain_com_cn_outside localhost root rootroot";
# file "var/test.mydomain.com.cn.outside";
};
zone "10.in-addr.arpa" IN {
type master;
database "mysqldb dns10_outside localhost root rootroot";
# file "var/10.outside";
};
zone "localhost" IN {
type master;
file"var/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "var/127.0.0.zone";
allow-update { none; };
};
};
当然,上面的view_name:“outside”是在前面acl中定义的.但是需要注意的是,多个视图的并集最好是一个ip全集,不要丢掉某些ip.而且,在view视图配置中,如果定义master/slaver模式做分布式的话,slaver接受的notify和数据只会匹配slaver自己ip所在视图的数据,也就是说,如果单个ip的slaver需要和master同步数据的话,永远只能同步一个view,而其他的则不能.解决办法可以考虑在slaver的机器上进行ipalias,设置多个别名分别位于master的不同view中,在master的allow-transfer和allow-notify中添加这些ip别名,便可以完成所有view的数据同步了.更详细的信息参看这篇文档(http://www.chinaunix.net/j...).
对于DNS轮询,主要是在zone里进行设置.zone的SOA,NS记录基本不变.例如需要将www.mydomain.com关联到192.168.0.[1-4],则可以这么写:
引用
www.mydomain.com. IN A 192.168.0.1
www.mydomain.com. IN A 192.168.0.2
www.mydomain.com. IN A 192.168.0.3
www.mydomain.com. IN A 192.168.0.4
在逆向zone里可以这么写:
引用
1.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
2.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
3.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
4.0.168.192.in-addr.arpa. IN PTR www.mydomain.com
利用bind做DNS轮询(roundrabin)可以将多个session分散到不同的ip上去减缓单台机器的链接压力.但是,它并不能真正做到负载均衡,因为一旦某个ip失效,那么在轮询到该ip的session将全部丢失,bind本身并不能多做些什么.但是,如果使用了bind的mysqlsdb的话,这个问题能够得到一定缓解.因为,基于某个协程(一段时间间隔内监听bind做round-rabin的ip)可以动态剔除失效ip,并动态加入复效ip.然而,并不能保证,bind不会将某个session分配给负载最重的ip.
泛解析在多级虚拟域名上有很好的利用.它可以将符合某个规则的域名解析到一个ip上,利用该ip上的其他应用结合(如apache的mod_rewrite),可以实现额外的功能(如多级虚拟域名).在zone配置中,对于一条这样的记录:
引用 * IN A 192.168.0.111
对于任意匹配到该zone的域名,首先都会查询和该域名完全匹配的记录,如果存在完全匹配的,则将这个域名关联到与之对应的ip上.如果没有完全匹配的,则将之关联到192.168.0.111上. 而不论* IN A192.168.0.111写在zone A记录的何处,都遵循该流程(bind9).这点在named.conf中的view和zone的访问原则是不同的,view和zone只会在第一个匹配的里面进行解析.
对于一般的bind配置,建议参看文章前面提到的鸟哥的linux私房菜关于dns部分.包括如何设置根zone和localhostzone等等,还有rndc控制bind等等.
然而,在mysql的sdb中最初并不能支持泛解析.需要进行源码修改才能支持.这个问题在第五部分给出.
4. Mysql数据库配置
需要注意的是,如果需要利用mysql的sdb,那么需要在named.conf中的zone资源中用database关键字,而不是file关键字或者其他.规则如下:
引用 database "mysqldb dns 10_outside localhostroot rootroot";
mysqldb是sdb驱动注册的名称,dns是mysql中bind使用的数据库名,10_outside是表明,对应于一个zone(里面的内容也就是zone file中的内容),localhost是mysql的host, root是登陆mysql的用户,rootroot是登陆mysql用户的密码(需要明文显示,可以自己修改即可).
看到上面的说明,那么,很显然,需要在mysql中做相应的配置.如创建一个dns的数据库;将root密码改成rootroot(就本例子而言,其实你可以不用root,同时grant权限便可以);创建一个表名10_outside;往表10_outside中按bind的要求引入数据记录,SOA/NS/A/PTR/CNAME/MX/TXT/HINFO等等.但是,需要注意的是,在sdb中,没有设计$ORIGIN和$TTL这两个全局变量,因此,$TTL一般都在记录里写明,$ORIGIN则全部默认为.(根),也就是说所有记录的第一项都必须以根作为$ORIGIN.而IN字段是sdb默认的方式,一般省略,目前,非基于inet的DNS已经很少了.
进行如下操作:
引用 mysqladmin -uroot password rootroot
mysqladmin -uroot -prootroot create dns
cat tmpfile -- MySQL dump 9.11
--
-- Host: localhost Database:dns
-- ------------------------------------------------------
-- Server version 4.0.27
--
-- Table structure for table `10_outside`
--
DROP TABLE IF EXISTS 10_outside;
CREATE TABLE 10_outside (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;
--
-- Dumping data for table `10_outside`
--
LOCK TABLES 10_outside WRITE;
INSERT INTO 10_outside VALUES('25.71.210.10.in-addr.arpa',3600,'PTR','cas1.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'SOA','test.mydomain.com.cn.zhengyu.staff.mydomain.com.cn. 20070319 1800 600 604800600');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas1.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas2.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('10.in-addr.arpa',3600,'NS','cas3.test.mydomain.com.cn.');
INSERT INTO 10_outside VALUES('27.71.210.10.in-addr.arpa',3600,'PTR','cas2.test.mydomain.com.cn.');
UNLOCK TABLES;
--
-- Table structure for table `test_mydomain_com_cn_outside`
--
DROP TABLE IF EXISTS test_mydomain_com_cn_outside;
CREATE TABLE test_mydomain_com_cn_outside (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;
--
-- Dumping data for table `test_mydomain_com_cn_outside`
--
LOCK TABLES test_mydomain_com_cn_outside WRITE;
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'SOA','test.mydomain.com.cn.zhengyu.staff.mydomain.com.cn. 20070319 1800 600 604800600');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas1.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas2.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('test.mydomain.com.cn',3600,'NS','cas3.test.mydomain.com.cn.');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas1.test.mydomain.com.cn',3600,'A','10.210.71.25');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas2.test.mydomain.com.cn',3600,'A','10.210.71.27');
INSERT INTO test_mydomain_com_cn_outside VALUES('cas3.test.mydomain.com.cn',3600,'A','10.210.132.80');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.191');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.192');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.193');
INSERT INTO test_mydomain_com_cn_outside VALUES('yhzh.test.mydomain.com.cn',3600,'A','10.218.26.194');
INSERT INTO test_mydomain_com_cn_outside VALUES('*',3600,'A','10.210.71.1');
INSERT INTO test_mydomain_com_cn_outside VALUES('conf.test.mydomain.com.cn',3600,'CNAME','cas2.test.mydomain.com.cn.');
UNLOCK TABLES;
EOF
mysql -uroot -prootroot dns rm-rf tmpfile
其中写进tmpfile中的各个ip和域名对可以自己定义便可.利用mysqlsdb有个很显著的好处,那便是做了mysql数据库里的修改,不需要对bind服务进行重新启动.当然,排除新建表的操作,如果需要新建一张表的话,也就意味着要加入一个zone,是需要在named.conf里面进行添加的.(可以考虑采用cron.d/ld.conf.d/udev.rules.d的方式include进去,呵呵.)
如果配置成功了mysql数据库后,尝试用dig/nslookup/host测试,是否能够获得解析.
5. 常见问题解决
1.让mysql sdb支持泛解析,DNS轮询和IP视图.
对于IP视图,由于sdb是用数据库表取代zonefile,那么意味着sdb无论如何是支持IP视图的,只需要在named.conf中配置好view便可.对于DNS轮询,同样在数据库中建立一个域名对应于多个ip的记录便可.而对应于泛解析,由于数据库本身并不能智能识别*的含义,因此需要在sdb程序段进行修改才能实现泛解析.因此在分析bind的sdb原理和处理流程后,很容易在mysqldb.c中加入泛解析的实现.可以下载mysql-bind-0.1-modify.tar.gz取代最开始的mysql-bind-0.1.tgz,解压后的mysqldb.c便已经实现泛解析功能.或者使用patch打上补丁,补丁:mysql-bind-modify.patch.然后在需要进行泛解析的数据库表(对应于相应的zone)中加入一条A记录:
引用 INSERT INTO your_table_name VALUES('*',3600,'A','your_ip');
这样便可以进行泛解析了.测试一下.
www.xplore.cn提供了bind-9.3.4下载,mysql-bind-0.1下载和增加了泛解析的mysql-bind-0.1-modify.tar.gz下载.
2.打开bind处理流程的调试信息.
打开bind处理流程的调试信息对于以 named -u named-g方式进行调试时有很大的作用.在bind-9.3.4/bin/named/query.c中,找到
引用#if 0(惟一一处)
将下面的内容
#if 0
#define CTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_CLIENT, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"client %p: %s", client, (m))
#define QTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_GENERAL, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"query %p: %s", query, (m))
#else
#define CTRACE(m) ((void)m)
#define QTRACE(m) ((void)m)
#endif
替换成:
#if 1
/*
#define CTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_CLIENT, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"client %p: %s", client, (m))
#define QTRACE(m) isc_log_write(ns_g_lctx, \
NS_LOGCATEGORY_GENERAL, \
NS_LOGMODULE_QUERY, \
ISC_LOG_DEBUG(3), \
"query %p: %s", query, (m))
*/
#define CTRACE(m) fprintf(stderr,"client %p:%s\n",client,(m))
#define QTRACE(m) fprintf(stderr,"query %p:%s\n",query,(m));
#else
#define CTRACE(m) ((void)m)
#define QTRACE(m) ((void)m)
#endif
所有源码操作过之后都需要重新编译,重新运行才能生效.这样在-g运行named时会将一些解析信息显示出来.
3.loading zone: creating database: failure错误处理.
如果出现这个问题,那说明bindsdb驱动和mysql链接出现了问题,诸如密码错误,dns没有建立,引用/tmp/mysql.sock错误等等.这个问题出现之后,你需要在mysqldb.c中加入一些调试信息:
在mysqldb.c的db_connect函数中修改:
引用if (mysql_real_connect ( &dbi->conn, dbi->host,dbi->user, dbi->passwd, dbi->database, 0, NULL, 0 ))
{
fprintf(stderr,"\nconnect successfully.............. \n");
return (ISC_R_SUCCESS);
}
else
{
fprintf(stderr,"\nconnect fail:%s , host %s,user%s,passwd %s,db %s,port %d...................\n",mysql_error(&dbi->conn),dbi->host,dbi->user,dbi->passwd,dbi->database);
return (ISC_R_FAILURE);
}
这样方便得到出错信息.然后根据出错信息调试mysql,使bindsdb能成功链接mysql.
4.Dig结果分析处理.
如果在执行dig xx.mydomain.com出现以下几种情况:
引用;; QUESTION SECTION:
;xx.mydomain.com. IN A
;; AUTHORITY SECTION:
*****************************************************************
;; Query time: 8 msec
这说明在bind的基本配置都正确,但是数据库表项中没有添加该A记录或者添加的记录有问题,特别是那些对file方式配置bind用熟的管理员,他们已经能很好的使用$ORIGIN进行处理,但是需要明白那就是mysql是不识别$ORIGIN的,一定需要写全称.同时第一项的最后一个点是不必要的.如果上面的分析还不能解决问题,请在mysqldb.c中凡事出现mysql_query()API之前将query的str打印出来.便可以知道问题是否出在mysql查询中.
而其他错误,如没有出现
引用;; AUTHORITY SECTION:
这一选项,说明bind的基本配置出现问题,诸如在mysql的表中是否丢失SOA/NS记录,或者SOA/NS记录出现错误.特别是SOA/NS的第一项后面多了一个小黑点.
具体原理分析请参看第四部分的第三段.自动脚本请参见下一篇文章:http://wf.xplore.cn/read.p...
本文参考了如下网络资源,谨向这些文章的作者致敬:
1. http://linux.vbird.org/lin...
2. http://www.study-area.org/...
3. 官方文档
发表评论
-
记不准确的linux命令
2011-04-21 01:24 759Linux命令老是记不住,列出来就方便多了 1.wget ... -
linux上启动服务
2011-04-21 01:23 8021.apache /etc/rc.d/init.d/httpd ... -
mysql创建用户和忘记root密码
2011-04-21 01:21 12491.创建mysql用户 引用grant all on myi ... -
linux下修改系统时间
2011-04-21 01:19 657修改系统时间为:2007-01-19 12:30:00 # ... -
在本地模拟外部环境
2011-04-21 01:18 857修改文件: C:\WINDOWS\system32\drive ... -
linux下查看cpu和memery信息
2011-04-21 01:16 9741.查内存 #more/proc/meminfo cat ... -
linux下查看cpu和memery的个数
2011-04-21 01:15 8171.CPU数量 # cat /proc/cpuinfo | g ... -
mysql数据库定期备份脚本
2011-04-21 01:14 8551.mysqldatabak.sh文件(/root/) d ... -
有效配置MySQL参数
2011-04-21 01:09 5611.获取当前配置参数 ... -
优化mysql性能的几个参数的介绍
2011-04-21 01:07 613(1)、back_log: 要求 MySQL ... -
mysql的master/slave数据同步配置
2011-04-21 01:06 658mysql数据同步备份 A服 ... -
网站开发中用到的工具(2007)
2011-04-21 01:02 8431.基本工具 mysql :数据库 smarty:分离php程 ... -
(转)大型网站的架构-2007年
2011-04-21 01:00 647小型的网站,比如个人 ... -
(转2007)思考高并发高负载网站的系统架构
2011-04-21 00:58 714下面是我10月中旬的想 ... -
mysql数据库参数show status(2007-04-25)
2011-04-21 00:53 562mysql> show status like '%ta ... -
这次开发中会用到的ZendFrameWork模块
2011-04-21 00:47 921Zend_Db Zend_Controller Zend_Vi ... -
处理提示信息常用的js
2011-04-21 00:46 601一、controller里 1.返回前一页面并刷新 ec ... -
网站性能测试工具ab(Apache Bench)
2011-04-21 00:44 774进入ab.exe根目录 ab -n 1000 -c 10 h ... -
在linux上搭建postfix邮件系统
2011-04-21 00:43 1482一、基本概念 1.MTA:(Mail TransportAge ... -
查目标网站的配置命令
2011-04-21 00:41 6101.wget -S http://www.sina.com.c ...
相关推荐
" BIND+MySQL 搭建智能 DNS 借鉴" 本文档将讲述如何使用 BIND 和 MySQL 搭建智能 DNS 系统。智能 DNS 系统可以自动更新 DNS 记录,以便更好地管理域名系统。 知识点 1:BIND 介绍 BIND(Berkeley Internet Name ...
【bind+mysql搭建智能DNS】涉及的技术主要包括DNS服务器的配置、MySQL数据库的安装与使用以及Web管理界面的构建。下面将详细阐述这些知识点。 1. **DNS服务器搭建**: BIND(Berkeley Internet Name Domain)是...
" Bind+MySQL 搭建智能 DNS 服务器配置详解" Bind 是一种广泛使用的 DNS 服务器软件,它可以将域名解析到 IP 地址。 MySQL 是一种流行的关系数据库管理系统,经常用于存储和管理大量数据。本文档将指导您如何使用 ...
【Bind+DLZ】是实现智能DNS的一种方式。Bind是Internet域名系统(DNS)的最常用服务器软件,而DLZ(Dynamically Loadable Zones)则是Bind的一个扩展,允许DNS数据存储在外部数据库中,如MySQL,而不是传统的Zone...
一旦BIND配置完成,可以在MySQL数据库中添加DNS记录,并通过`dig`等工具验证是否正确解析。 ### 后续话题及相关参考 - **后续话题**:如何监控和维护智能DNS系统的性能;如何进一步优化DNS响应速度。 - **相关参考*...
BIND是世界上最广泛使用的DNS服务器软件,负责解析域名到IP地址的映射。而DHCP服务则负责自动分配网络设备的IP地址,简化网络管理。当两者结合使用时,可以实现DDNS功能,即动态更新DNS记录,确保即使IP地址变化,...
这样,用户访问特定的URL时,浏览器就能正确地解析和显示存储在数据库中的图片了。 为了提高用户体验和减少服务器压力,还可以考虑使用缩略图技术。在存储图片时,可以同时生成不同尺寸的缩略图,然后存储它们的二...
Vue的指令系统(如v-if, v-for, v-bind等)和计算属性也提供了强大的数据绑定和响应能力。 【PHP后端】 PHP是一种广泛使用的服务器端脚本语言,特别适用于Web开发。它能够与MySQL等数据库无缝集成,用于处理用户...
当你在浏览器中输入一个网址时,DNS系统会将这个域名解析为对应的IP地址,从而实现网络通信。 智能DNS则是DNS的一种扩展,它通过分析用户的IP地址,将用户请求导向距离他们最近或响应速度最快的服务器。这种技术...
2. 配置DNS区域文件:在`/etc/bind`目录下创建DNS区域文件,定义域名解析记录,如A记录(IP地址映射)、MX记录(邮件服务器)等。 3. 修改主配置文件`/etc/bind/named.conf`,包含你的区域文件,并设置监听端口和...
在Java编程中,DNS(Domain Name System)域名解析是将人类可读的域名转换成IP地址的过程。这个过程可以通过Java的内置类`InetAddress`来实现。以下是一个使用Java进行DNS域名解析的简单示例: ```java import java...
### 利用Bind DLZ MySQL 构建...通过以上步骤,您可以成功搭建一套基于Bind DLZ MySQL的智能DNS系统,不仅能够根据不同ISP提供最优的访问路径,还能够动态管理和维护DNS记录,极大地提高了DNS服务的灵活性和可靠性。
#### 一、LAMP环境简介 ...此外,对于安全性方面,建议对Apache、MySQL和PHP进行进一步的安全加固,比如限制外部访问、使用复杂的密码策略等。同时,定期更新系统和各组件,保持最新的安全补丁是非常重要的。
利用Bind DLZ MySQL 构建智能DNS V2 中文版 读者必须有熟练的linux运维基础,同时对mysql也非常了解! 一、相关术语简介 二、智能DNS系统服务规划 三、安装BIND及基本环境 四、配置DNS TSIG 五、配置Bind-View-DLZ-...
智能DNS的实现有两种主要方法:F5公司的BIG-IP GTM和bind的view。BIG-IP GTM是一款功能强大的商业解决方案,适用于大型企业或关键业务,但其高昂的价格限制了中小企业的采用。相比之下,bind作为一个开源软件,不仅...
3. 动态更新 DNS 记录: Bind_DLZ_MySQL 可以实时更新 DNS 记录,实现 DNS 记录的动态化管理,从而提高 DNS 解析的灵活性和实时性。 Bind_DLZ_MySQL 的优点包括: 1. 高度灵活性: Bind_DLZ_MySQL 可以根据不同的...