智能DNS构建

 

首先感谢广大网友的贡献,能让我寻找到众多的资料来完成DNS实验环境的搭建,在此期间遇到了各种令人烦躁的问题,也不知掉进多少坑里了,说起来都是泪呀- .-!因此决定把之前所做的步骤梳理一下,也希望能带给大家一些便利。由于是初次接触这些知识,而且还是事后补上的文章,其中内容不免存在各种错误,倘若因此给你带来困扰,在此表示歉意。

本文主要参考:利用Bind_DLZ_MySQL_构建智能DNS.pdf,百度一下,你就知道。

网上还有很多有关MySQL的配置资料可供查询,你在配置过程中可能会遇到的各种问题,网上也有大量答案供参考,我就不贴上来了。

实验开始之前我们先来简单的了解一下mysql语句,因为后面还用得着。

1.账号控制
1) 创建帐号
MySQL 默认是没有开启远程控制的,必须添加远程访问的用户。
用root 用户登陆,输入命令:
grant all privileges on *.* to 用户名@"%" identified by "密码";
flush privileges; #刷新上面内容
格式:grant 权限on 数据库名.表名to 用户名@登录主机identified by "用户密码";
说明:@ 后面是访问mysql 的客户端IP 地址(或主机名) % 代表任意的客户端,如果填写localhost 为本地访问(此用户不能远程访问该mysql 数据库)。
示例:
mysql> grant all privileges on *.* to gcmdb@"%" identified by "123456";
mysql> grant all privileges on *.* to gcmdb@"localhost" identified by "123456";
同时也可以为现有的用户设置是否具有远程访问权限。如下:
mysql> use mysql;
mysql> update user set host = '%' where user = '用户名';(如果写成host=localhost 那此用户就不具有远程访问权限)
mysql> flush privileges;
2) 查看帐号
mysql> use mysql;
mysql> select host,user,password from user;
3) 删除帐号
mysql> use mysql;
mysql> delete from user where user = 'gcmdb' and host = '%';

2.创建并使用数据库
1) 创建数据库
mysql> create database gcm;
2) 查看数据库
mysql> show databases;
3) 删除数据库
mysql> drop database gcm;

3.创建表以及表操作
1) 创建表
mysql> create table TAB(ID INT(4), NOTE VARCHAR(20));
2) 查看表
mysql> show tables;
3) 向表插入数据
mysql> insert into TAB(ID,NOTE) values(100,"number 100");
4) 查看表中的所有数据
mysql> select * from TAB;
5) 查看表中的特定数据
mysql> select NOTE from TAB where ID = "100";
6) 更新表中的特定数据
mysql> update TAB set NOTE = "number is 100" where ID = "100";
7) 删除表中的所有数据
mysql> delete from TAB;
8) 删除表
mysql> drop table TAB;


4.批量SQL 语句
Mysql -u 用户名-p 密码 数据库< *.sql
示例:
[root@OWLinux_4 ~]# mysql -u gcmdb -p123456 gcm < gcmformysql.sql

------------------------------------------------START----------------------------------------------------------------

【提纲】

一、简介

二、服务规划

三、安装Cmake+MySQL+Bind环境

四、配置Bind-View-DLZ-MYSQL

五、添加相关记录并进行测试

六、配置从DNS

 

【正文】

一、简介

1、智能DNS(Bind-view)

智能DNS 原理很简单:在用户解析一个域名的时候的,判断一下用户使用的IP来自何地,然后跟DNS 服务器内部的IP 表匹配一下,给用户返回对应的IP 地址。

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文件操作也更方便了,直接对数据库操作,可以很方便扩充及开发管理程序。

 

二、服务规划

1、NameServer 服务器注册(到新网或者万网后台添加,本次实验采用局域网)

服务名称

服务类型

IP

ns1.yangtze.cn

DNS(主机)

192.168.101.11

ns2.yangtze.cn

DNS(备机)

192.168.101.12

www. yangtze.cn

北京

192.168.1.200

www. yangtze.cn

成都

192.168.1.201

www. yangtze.cn

上海

192.168.1.202

 

2、Bind-View规划

用户

IP

所属区域文件

北京

192.168.102.20

beijing_acl.conf

成都

192.168.101.13

chengdu_acl.conf

上海

192.168.101.14

shanghai_acl.conf

 

即当您是上海用户的时候(192.168.101.14),访问www.yangtze.cn ,智能DNS 服务器将分配给你位于上海的这台服务器(192.168.1.202),其它同理。

 

三、安装Cmake+MySQL+Bind环境

在开始安装前,先说明一下mysql-5.6.4与较低的版本在安装上的区别,从mysql-5.5起,mysql源码安装开始使用cmake,下载并解压如下安装包:

mysql-5.6.4-m7-tar.zip

cmake-2.8.10.1.tar.gz

bind-9.6.0-P1.tar.gz

 

1、安装Cmake

./configure --prefix=/usr/local/cmake

make

make install

2、安装MySQL

cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql

注意有的时候会出现提示:说没有这个cmake这个命令,但是cmake刚刚我们的确安装了,没关系,给它填上路径就行了,然后再运行就好了。

export PATH=/usr/local/cmake/bin:$PATH   

make

make install

cd   /usr/local/mysql/scripts/

./mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=root

cd /usr/local/mysql/support-files

cp my-medium.cnf   /etc/my.cnf

cp mysql.server /etc/init.d/mysqld

/etc/init.d/mysqld start或者(service  mysqld  start)

3、安装Bind

./configure --prefix=/usr/local/bind --enable-largefile --enable-threads=no --with-dlz-mysql

make

make install

cd /usr/local/bind/sbin
./rndc-confgen >../etc/rndc.conf
cd ../etc
tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf

 

创建相关配置文件

cd /usr/local/bind/etc/

../sbin/rndc-confgen >rndc.conf

tail -n10 rndc.conf | head -n9 | sed -e s/#\//g >named.conf

 

此时停留在路径/usr/local/bind/etc/,新建localhost.zone文件,写入如下内容

#cat 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/beijing_acl.conf";

include "/usr/local/bind/etc/chengdu_acl.conf";

include "/usr/local/bind/etc/shanghai_acl.conf";

include "/usr/local/bind/etc/view.conf";

 

新建beijing_acl.conf,chengdu_acl.conf,shanghai_acl.conf,写入如下内容

# cat beijing_acl.conf

acl beijing {

192.168.102.20;

};

# cat chengdu_acl.conf

acl chengdu {

192.168.101.13;

};

# cat shanghai_acl.conf

acl shanghai {

192.168.101.14;

};

 

四、配置Bind-view-DLZ-MySQL // Bind-DLZ 核心部分

1、配置view.conf

#vi /usr/local/bind/etc/view.conf //创建view相关的配置文件

view "bj_view" {

match-clients { bj;dns-ip-list;};

dlz "Mysql zone" {

database "mysql

{host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass=mysql }

{select zone from dns_records where zone = '%zone%' and view = 'BJ' 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 = 'BJ'}

{}

{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='BJ'}

{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='BJ'}";

};

};

view "cd_view" {

match-clients { cd;dns-ip-list;};

dlz "Mysql zone" {

database "mysql

{host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass=mysql }

{select zone from dns_records where zone = '%zone%' and view = 'CD' 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 = 'CD'}

{}

{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='CD'}

{select zone from xfr_table where zone = '%zone%' and client = '%client%' and

view='CD' limit 1}

{update data_count set count = count + 1 where zone ='%zone%' and view='CD'}";

};

};

view "sh_view" {

match-clients { sh;dns-ip-list;};

dlz "Mysql zone" {

database "mysql

{host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass=mysql }

{select zone from dns_records where zone = '%zone%' and view = 'SH' 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 = 'SH'}

{}

{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='SH'}

{select zone from xfr_table where zone = '%zone%' and client = '%client%' and

view='SH' limit 1}

{update data_count set count = count + 1 where zone ='%zone%' and view='SH'};

};

};

2、DLZ相关数据库表结构建立

mysql>create database cdn_view; //创建数据库名为cdn_view与view中的dbname对应,细心的你可能发现,view默认是BJ

mysql>use cdn_view;

DROP TABLE IF EXISTS `dns_records`;

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` char(20) default 'BJ',

`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;

 

 

3、查看表结构

mysql>show databases;

+-----------------+

| Database           |

+-----------------+

| information_schema  |

| cdn_view           |

| dns                |

| mysql              |

| performance_schema  |

| test                |

+----------------+

6 rows in set (0.02 sec)

 

mysql>use cdn_view;

Database changed

mysql> show tables;

+--------------------+

| Tables_in_cdn_view |

+--------------------+

| dns_records        |

+--------------------+

1 row in set (0.02 sec)

mysql>desc dns_records;

 

4、启动bind服务.

#ldconfig

#/usr/local/bind/sbin/named -uroot -g -d 9 //调试状态,如果没有报错说明环境配置正确。

# /usr/local/bind/sbin/rndc reload 重载named.conf相关配置文件.

# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 启动bind 服务.

 

五、添加相关记录并进行测试

1、添加记录

--SOA

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`,`mx_priority`,

`refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`,

`data_count`) VALUES

('yangtze.cn', '@', 'SOA', 'ns1.yangtze.cn.', 10, NULL, 3600, 3600, 86400,

10, 2008082700, 'root.yangtze.cn.', 'ns1.yangtze.cn.', 0);

--@ NS

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES

(' yangtze.cn', '@', 'NS', 'ns1.yangtze.cn.'),

(' yangtze.cn', '@', 'NS', 'ns2. yangtze.cn.');

--NS A

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES

('yangtze.cn', 'ns1', 'A', '192.168.1.100'),

('yangtze.cn', 'ns2', 'A', '192.168.1.101');

--A

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`) VALUES

(' yangtze.cn', 'www', 'A', '192.168.1.200', 3600, 'BJ'),

(' yangtze.cn', 'www', 'A', '192.168.1.201', 3600, 'CD'),

(' yangtze.cn', 'www', 'A', '192.168.1.202', 3600, 'SH');

--CNAME

INSERT INTO dns_records (zone,host,type,DATA,view) VALUES

('yangtze.cn', 'bbs', 'CNAME', 'www','BJ'),

('yangtze.cn', 'bbs', 'CNAME', 'www','CD'),

('yangtze.cn', 'bbs', 'CNAME', 'www','SH');

2、测试。试着换客户ip 来解析就能解析出不同的地址

 

六、配置从DNS

1、安装MYSQL

安装配置方法如上

2、安装Bind

安装配置方法如上(配置文件可以选择从主配置端拷贝过来,也可以考虑sersync

来做数据同步。)

Sersync 文档http://www.crazylinux.cn/thread-119-1-1.html

数据库不要动,采用Mysql M/S 同步!

3、Mysql 主/从复制

1)Master 配置

创建同步用户

mysql -u root

mysql>UNLOCK TABLES;

mysql>GRANT ALL PRIVILEGES ON *.* TO 'crazy'@'%' IDENTIFIED BY 'linux' WITH

GRANT OPTION;

mysql>exit

修改配置文件,并打包data 文件到Slave 端

cd /usr/local/mysql

vim my.cnf

[mysqld] 在mysqld 里添加如下几项

long_query_time = 5

expire_logs_days= 3

binlog-do-db=cdn_view

 

mysqladmin -u root -S /tmp/mysql.sock shutdown //重启Mysql

/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &

tar -zcf mysql.slave.tar.gz data/

scp mysql.slave.tar.gz 192.168.101.12:/usr/local/mysql/

2)Slave 配置

cd /usr/local/mysql

tar -zxvf mysql.slave.tar.gz

将my.cnf 中的server-id=1 改成2

[mysqld]

server-id=2

#log-bin=mysql-bin //注释掉这两行。

#binlog_format=mixed

mysqladmin -u root -S /tmp/mysql.sock shutdown //重启Mysql

/usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &

msql -u root

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.101.11',

MASTER_USER='root',

MASTER_PASSWORD='mysql',

MASTER_LOG_FILE='mysql-bin.000005',

MASTER_LOG_POS=953;

以上两行必须按照Master 端的master 状态写show master status;

mysql>START SLAVE;

【注】:Slave 不要动库里的东西。否则会破坏主从关系和数据。所有操作到Master 端做

3)验证

在Master 端修改www.crazylinux.cn IN SH的A记录,看Slave 端是否同步

------------------------------------------------END----------------------------------------------------------------

posted @ 2013-06-09 22:46  艾丽娅的猫  阅读(368)  评论(0编辑  收藏  举报