centos7下编译安装bind9.15.8或bind-9.16.5版本并结合mysql
测试环境: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了!思路方面:多类比,多尝试,遇到问题不要急于找资料,先理顺思路、分析透彻,一切慢慢来。
本文系作者 @天边的云 原创发布在Loshub站点。未经许可,禁止转载。
暂无评论数据