测试环境:centos7,ip地址为,192.168.0.6,先打开dns的防火墙

firewall-cmd --zone=public --add-port=53/udp --permanent
firewall-cmd --zone=public --add-port=953/udp --permanent
firewall-cmd --reload

安装yum源

wget  https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh epel-release-latest-7.noarch.rpm

安装必备组件

yum install -y libnghttp* libuv libuv-devel pcre-devel zlib-devel gcc gcc-c++ autoconf automake make pcre-devel zlib-devel openssl-devel openldap-devel unixODBC-devel gcc libtool openssl

安装好mysql

yum install mysql-community-devel.x86_64 -y

编辑/etc/my.cnf,在[mysqld]下加入

wait_timeout = 864000
interactive_timeout = 864000

可有效的防止mysql无查询重连接问题

创建软连

ln -sv /usr/lib64/mysql/libmysqlclient.so.18 /usr/lib/libmysqlclient.so
为:http://ftp.isc.org/isc/bind9/9.16.22/bind-9.16.22.tar.xz
wget http://ftp.isc.org/isc/bind9/9.16.22/bind-9.16.22.tar.xz
tar -Jxvf bind-9.16.22.tar.xz
cd bind-9.16.22
./configure --prefix=/usr/local/bind --enable-threads --enable-largefile --enable-ipv6 --with-openssl --with-dlz-mysql=/usr --without-python  --disable-linux-caps
make&&make install

创建bind运行用户组使其运行在用户模式下,增强安全性

useradd -s /sbin/nologin -M named
mkdir /usr/local/bind/log/
chown -R named:named /usr/local/bind/

加入环境变量

echo "export PATH=${PATH}:/usr/local/bind/sbin/:/usr/local/bind/bin/" >> /etc/profile
source /etc/profile

生成配置文件

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

下载ca文件

wget http://www.internic.net/domain/named.root

编辑named.conf文件,增加以下内容

controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
};

logging {
        channel bind_log {
                file "/tmp/bind.log" versions 3 size 20m;
                severity info;
                print-time yes;
                print-severity yes;
                print-category yes;
        };
        category default {
                bind_log;

        };
 };

options {
        listen-on port 53 { any; };
        directory "/usr/local/bind";
        Pid-file "named.pid";
        allow-query-cache { any; };
        allow-query     { any; };
};

dlz "mysql-dlz" {
    database "mysql
    {host=127.0.0.1 dbname=bind ssl=false port=3306 user=bind pass=W123456W^&}
    {select zone from dns_records where zone = '$zone$' and  view = 'any' limit 1}
    {select ttl,type,if(mx_priority>0,mx_priority,NULL),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 = 'any'}";
};
#include  "/usr/local/bind/etc/default.zones";

配置mysql,创建一个bind的用户和数据库密码为W123456W^&

mysql -u root -p

输入mysql的root密码

create database bind;
grant all on bind.* to bind@"localhost" identified by 'W123456W^&';

进入bind数据库并创建表,注意修改其中的ns.loshub.com和ns1.loshub.com

use bind;
CREATE TABLE IF NOT EXISTS `dns_records` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `zone` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL DEFAULT '@',
  `type` enum('A','MX','CNAME','NS','SOA','PTR','TXT','AAAA','SVR','URL') NOT NULL,
  `data` varchar(255) DEFAULT NULL,
  `ttl` int(11) NOT NULL DEFAULT '3600',
  `mx_priority` int(11) DEFAULT NULL,
  `view`  enum('any', 'Telecom', 'Unicom', 'CMCC', 'ours') NOT NULL  DEFAULT "any" ,
  `priority` tinyint UNSIGNED NOT NULL DEFAULT '255',
  `refresh` int(11) NOT NULL DEFAULT '28800',
  `retry` int(11) NOT NULL DEFAULT '14400',
  `expire` int(11) NOT NULL DEFAULT '86400',
  `minimum` int(11) NOT NULL DEFAULT '86400',
  `serial` bigint(20) NOT NULL DEFAULT '2015050917',
  `resp_person` varchar(64) NOT NULL DEFAULT 'ns.loshub.com',
  `primary_ns` varchar(64) NOT NULL DEFAULT 'ns1.loshub.com.',
  PRIMARY KEY (`id`),
  KEY `type` (`type`),
  KEY `host` (`host`),
  KEY `zone` (`zone`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

刷新mysql权限

FLUSH PRIVILEGES;

插入解析数据,插入一个A记录www.adw123.com域及解析

use bind;
insert into bind.dns_records (zone, host, type, data, ttl) VALUES ('adw123.com', 'www', 'A', '1.1.1.1', '600');

插入一个cname记录,如abc.adw123.com域名cname到www.adw123.com

use bind;
insert into bind.dns_records (zone, host, type, data, ttl) VALUES ('adw123.com', 'abc', 'CNAME', 'www', '600');

刷新权限并退出

FLUSH PRIVILEGES;
quit

如果要更新ttl,执行下面的语句

UPDATE bind.dns_records SET ttl='2' WHERE zone='域名';

测试启动

/usr/local/bind/sbin/named -c /usr/local/bind/etc/named.conf -f -g -u named

看有无报错
后台启动

/usr/local/bind/sbin/named -c /usr/local/bind/etc/named.conf -f -g -u named &

加入系统启动
创建/etc/systemd/system/bind9.service文件并录入以下信息

[Unit]
Description=Dns Service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/bind/sbin/named -u named -c /usr/local/bind/etc/named.conf
[Install]
WantedBy=multi-user.target

载入系统并启动

systemctl daemon-reload
systemctl start bind9
systemctl enable bind9

停止

systemctl stop bind9

接下来测试bind
更新本机(centos7)的dns(如果是外网(解析)这一步不用做),为本机的ip,修改文件为/etc/resolv.conf ,把第一个nameserver,后面的ip改为本机ip。
测试

nslookup
> www.adw123.com
Server:         192.168.0.6
Address:        192.168.0.6#53
Name:   www.adw123.com
Address: 1.1.1.1
** server can't find www.adw123.com: SERVFAIL

成功。

如需同步,直接使用mysql同步
对比一下下面的示例一看便知。
1.实现DNS的正向解析
插入SOA记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`,`mx_priority`,`refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`,`second_ns`,`data_count`) VALUES ('loshub.com', '@', 'SOA', 'ns1.loshub.com.', 10, NULL, 600, 3600, 86400,10, 2011061200, 'loshub.com.', 'ns1.loshub.com.','ns2.loshub.com.',0);

插入@和NS记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES('loshub.com', '@', 'NS', 'ns1.loshub.com.'),('loshub.com', '@', 'NS', 'ns2.loshub.com.');

插入NS和A记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES ('loshub.com', 'ns1', 'A', '10.1.1.204'),('loshub.com', 'ns2', 'A', '10.1.1.206');

注意:在插入的过程中需要指定属于哪一个ISP提供商,见附表。
ISP 简称
中国电信 dx
中国联通 lt
中国移动 yd
中国铁通 td
中国教育网 edu
其他ISP类型 any
如果只使用内网进行测试(特别是使用DNS服务器自身)而不使用其他网络中的主机进行测试时,则必须指定一个any的view类型,否则服务器可能返回一个错误信息。
Linux的dig命令返回

“;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 49529”;nslookup命令返回“** server can't find www.loshub.com: NXDOMAIN”或“** server can't find www.loshub.com: SERVFAIL”。

Windows的nslookup命令返回“* [10.1.1.204] can't find www.loshub.com: Server failed”。
如果日志中没有提示错误,配置文件也没有权限或者限制等问题,则一定是出在view这种逻辑问题上。
插入CNAME记录
注意事项与插入A记录相同(view问题)。

INSERT INTO dns_records (zone,host,type,DATA,view) VALUES ('loshub.com', 'bbs', 'CNAME', 'www','dx');

2.实现DNS的反向解析
实现DNS的反向解析其实和正向解析的原理是一样的,只要对DNS、DLZ、ACL和VIEW的原理深刻理解一下就可以类比互通,以和正向解析的同样的方式来实现反向解析。

插入SOA记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`,`mx_priority`,`refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`,`second_ns`,`data_count`) VALUES ('1.1.10.in-addr.arpa', '@', 'SOA', 'ns1.loshub.com.', 10, NULL, 600, 3600, 86400,10, 2011061200, 'loshub.com.', 'ns1.loshub.com.','ns2.loshub.com.',0);

插入@和NS记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES ('loshub.com', '@', 'NS', 'ns1.loshub.com.'),('loshub.com', '@', 'NS', 'ns2.loshub.com.');

插入NS和A记录

INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES ('1.1.10.in-addr.arpa', '204', 'PTR', 'www1.loshub.com.'),('1.1.10.in-addr.arpa', '205', 'PTR', 'www2.loshub.com.');

总之设置方面一句话,只要明白zone记录的写法一切就OK了!思路方面:多类比,多尝试,遇到问题不要急于找资料,先理顺思路、分析透彻,一切慢慢来。

分类: bind9dns 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录