智能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----------------------------------------------------------------