centos6下部署DNS服务
关于DNS
简单了解DNS
当我们访问一个网站时候,其实底层的操作系统进行通信时还是通过IP地址来进行通信,这时候我们就需要有一个服务能将域名转换成对应的IP地址,或者反向的将IP地址转换成域名,这个服务就是DNS(Domain Name System)。
DNS提供的服务就是在IP和域名之间进行转换,DNS服务是由DNS服务器来提供的,一般提供DNS服务的都有一个单独的DNS服务器,这个DNS服务器的作用就是用来保存我们的域名到其IP地址之间的解析,例如我们在访问 www.google.com 这个域名的时候,我们的主机首先会向一个DNS服务器发起一个DNS的请求,请求DNS服务器告诉我www.google.com这个域名的IP地址,此时DNS服务器就会给我们返回该域名的IP地址,这个时候我们再根据这个IP地址访问www.google.com这台服务器
DNS的域名解析过程
首先,客户端检测自身缓存,如果没有,检测hosts文件,如果没有,客户端发出DNS请求翻译IP地址或者主机名。DNS服务器在收到客户机的请求后做如下操作:
1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;
3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级域查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收 到应答后先在缓存中存储,然后将解析结果发给客户机。
4)若没有找到,则返回错误信息。
DNS分类
主DNS服务器:就是一台存储着原始资料的DNS服务。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。
备注:一般生产环境,主DNS服务器做管理使用,从DNS服务器提供服务。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的记过,也叫递归服务器。
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。
DNS中记录类型
SOA类型:可以理解为一段为自己dns做备注说明的文本,一般与ns一致。比如 dns.baidu.com admin.baidu.com
NS:域的授权名称服务器。比如 ns1.baidu.com ns2.baidu.com
MX:域的邮件交换器,要跟一个优先级值,值越小优先级越高
A:ipv4主机地址
AAAA:ipv6主机地址
PTR:解析ip的指针,反向记录
CNAME:权威(正式)名称,定义别名记录
DNS命名规范
1. 26个英文字母
2. “0,1,2,3,4,5,6,7,8,9,”十个数字
3. “-”(英文中的连词号)
4. 最多63字节长度
备注:要不按照这个规范命名,bing支不支持? 支持,不合适,不建议。 非要不按照这个,怎么办? master-view文件上配置check-name ignore;
DNS的查询命令:dig nslookup host
比如查询www.goser.com对应的ip地址,三个命令的查询方式为:
dig @192.168.1.120 www.goser.com
nslookup www.goser.com 192.168.1.120
host www.goser.com 192.168.1.120
DNS的安装部署
环境准备:
1、部署的环境为centos6平台上安装bind的DNS服务,主dns服务器ip地址为:192.168.1.120,从dns服务器ip地址为:192.168.1.121
2、关闭selinux和iptables防火墙
3、下载阿里云的epel源
部署DNS主服务器
1、yum安装bind的dns服务工具
yum install -y bind-utils bind bind-devel bind-chroot
2、配置dns主配置文件
安装完BIND以后,BIND的主配置文件通常是保存在两个位置:
/etc/named.conf -BIND服务主配置文件
/var/named/ -域的zone配置文件
但是我们如果在安装了 bind-chroot 这个程序以后,BIND的主配置文件存放位置就变了,此时BIND的主配置文件会被封装到一个伪根目录内,此时的配置文件位置为:
/var/named/chroot/etc/named.conf -BIND服务主配置文件
/var/named/chroot/var/named -域的zone配置文件
为什么安装了bind-chroot以后,BIND的主配置文件的存放位置变了呢?这里就涉及到了一个伪根的知识,chroot是通过将相关文件封装到一个伪根目录内,已达到安全防护的目的,一旦该程序被攻破,将只能访问到伪根目录内的内容,而并不是真实的根目录。我们知道Linux的根目录是 / ,我们的服务如果安装了chroot这个程序,此时我们的服务的配置文件都会被安装到我们的伪根里面,会在里面生成一个与原来服务完全相同的一个目录体系结构。我们知道 /var/named/chroot 这个肯定不是我们的根目录,但是如果在安装了chroot以后,该服务的根目录就会把 /var/named/chroot 当成是自己的根目录,这样就可以对我们的真实根目录进行保护,所以建议大家在安装网络服务时最好都附带安装上chroot这个程序
修改/etc/named.conf配置文件,将其内容全部删除,创建新内容如下:
options {
version "1.1.1";
listen-on port 53 {any;};
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.96.209.5;202.96.209.6; };
};
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
include "/var/named/chroot/etc/view.conf";
3、配置rndc.key文件
vim /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
4、配置rndc.conf文件
vim /etc/rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
5、配置view.conf文件
vim /var/named/chroot/etc/view.conf
view "View" {
zone "goser.com" {
type master;
file "goser.com.zone";
allow-transfer {
192.168.1.121;
};
notify yes;
also-notify {
192.168.1.121;
};
};
};
6、配置域文件goser.com.zone
vim /var/named/chroot/etc/goser.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
goser.com IN SOA ns1.goser.com. dns.goser.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.goser.com.
$ORIGIN goser.com.
a A 1.2.3.4
ns1 A 1.2.3.4
Serial:只是一个序号,但这个序号可被用来作为slave与master更新的依据。
举例来说,master序号为2001但slave序号为2000时,那么这个zone file的资料就会被传送到slave来更新了。由于这个序号代表新旧资料,通常我们建议你可以利用日期来设定。例如上面的资料是在2017/10/20所写的第一次,所以用2017102001作为序号代表。(yyyymmddnn,nn代表这一天是第几次修改)
7、修改目录权限并启动dns服务,并使用dig、nslookup、host来测试配置是否生效
cd /var && chown -R named.named named/ /etc/init.d/named start chkconfig named on #测试 dig @127.0.0.1 a.goser.com nslookup a.goser.com 192.168.1.120 host a.goser.com 192.168.1.120
注意事项:修改好配置文件后,一定要增加serial的值,还要执行rndc reload的命令,让主服务的配置同步到从服务的配置
部署DNS从服务器
1、yum安装bind的dns服务工具
yum install bind-utils bind bind-devel bind-chroot -y
2、配置named.conf文件
options {
version "1.1.1";
listen-on port 53 {any;};
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.96.209.5;202.96.209.6; };
};
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
include "/var/named/chroot/etc/view.conf";
3、配置rndc.key文件
vim /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
4、配置rndc.conf文件
vim /etc/rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
备注:主从DNS主机配置named.conf、rndc.key、rndc.conf文件一样
5、配置view.conf文件
vim /var/named/chroot/etc/view.conf
view "SlaveView" {
zone "goser.com" {
type slave;
masters {192.168.1.120; };
file "slave.goser.com.zone";
};
};
6、修改目录权限并启动dns服务
cd /var && chown -R named.named named/ /etc/init.d/named start chkconfig named on
配置好如上配置后,在主dns服务上执行rndc reload后,从dns服务上会自动生成slave.goser.com.zone的域配置文件,这样就表示主从实现了同步
在主dns服务上添加A、CNAME、MX、PTR记录
在主dns上添加A、CNAME、MX,并验证是否同步到从DNS服务上
vim /var/named/chroot/etc/goser.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
goser.com IN SOA ns1.goser.com. dns.goser.com. (
2004 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.goser.com.
$ORIGIN goser.com.
a A 1.2.3.4
a A 192.168.122.100
ns1 A 1.2.3.4
cname CNAME a.goser.com.
mx MX 5 192.168.122.101
#重启rndc,使配置生效,并同步到slave服务端
rndc reload
#验证操作
dig @192.168.1.120 cname.goser.com
dig @192.168.1.121 cname.goser.com
host mx.lnh.com 192.168.1.120 #验证mx记录用dig不起作用,要用host命令
host mx.lnh.com 192.168.1.121
在DNS主服务上添加PTR记录,在view.conf文件中配置PTR的zone配置
vim /var/named/chroot/etc/view.conf
view "View" {
zone "goser.com" {
type master;
file "goser.com.zone";
allow-transfer {
192.168.1.121;
};
notify yes;
also-notify {
192.168.1.121;
};
};
zone "168.192.in-addr.arpa" {
type master;
file "168.192.zone";
allow-transfer {
192.168.1.121;
};
notify yes;
also-notify {
192.168.1.121;
};
};
};
编辑master节点/var/named/chroot/etc/168.192.zone
vim /var/named/chroot/etc/168.192.zone
$ORIGIN .
$TTL 3600 ; 1 hour
goser.com IN SOA ns1.goser.com. dns.goser.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.goser.com.
102.122 IN PTR a.goser.com.
修改168.192.zone文件属主
chown named.named 168.192.zone rndc reload
编辑slave节点/var/named/chroot/etc/view.conf,加入ptr的zone配置
vim /var/named/chroot/etc/view.conf
view "SlaveView" {
zone "goser.com" {
type slave;
masters {192.168.1.120; };
file "slave.goser.com.zone";
};
zone "168.192.in-addr.arpa" {
type slave;
masters {192.168.1.120; };
file "slave.168.192.zone";
};
};
这时候在slave从dns服务上执行rndc reload,slava节点/var/named/chroot/etc目录下会按照slave的view.conf配置定义的反向域文件自动生成slave.168.192.zone文件。
测试方向解析是否生效,是否可以通过IP地址来方向解析成域名:
host 192.168.122.102 192.168.1.120 host 192.168.122.102 192.168.1.121
让DNS实现负载均衡功能
在 /var/named/chroot/etc/goser.com.zone域文件中再添加一个A记录
vim /var/named/chroot/etc/goser.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
goser.com IN SOA ns1.goser.com. dns.goser.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.goser.com.
$ORIGIN goser.com.
a A 1.2.3.4
a A 192.168.122.100
a A 192.168.122.102
ns1 A 1.2.3.4
cname CNAME a.goser.com.
mx MX 5 192.168.122.101
执行rndc reload并用nslookup命令来验证a.goser.com域名对应的三个ip地址的轮询,这样就起到类似于lvs一样的负载均衡效果,多执行几次nslookup命令,可以看到三个ip地址的顺序变化。第一个ip起作用
nslookup a.goser.com 127.0.0.1 Name: a.goser.com Address: 192.168.122.100 Name: a.goser.com Address: 192.168.122.102 Name: a.goser.com Address: 1.2.3.4
配置DNS为智能DNS
编辑master节点/var/named/chroot/etc/named.conf,在include上面添加(对客户端IP分组)
#这里的ip地址为dns服务器的地址,测试环境中让其作为客户端ip来使用
acl group1 {
192.168.1.120;
};
acl group2 {
192.168.1.121;
};
备份旧的view.conf文件,创建一个新的view.conf文件,让其实现智能DNS功能
cp view.conf view.conf.bak
编辑master节点/var/named/chroot/etc/view.conf
view "GROUP1" {
match-clients { group1; };
zone "viewgoser.com" {
type master;
file "group1.viewgoser.com.zone";
};
};
view "GROUP2" {
match-clients { group2; };
zone "viewgoser.com" {
type master;
file "group2.viewgoser.com.zone";
};
};
这里的view.conf文件没有做同步到slave服务端的配置,这里只做测试就没配置,如果想让slave服务端也同步这种配置的话,可以在view.conf文件中加入allow-transfer和also-notify配置选项
编辑master节点/var/named/chroot/etc/下的group1.viewgoser.com.zone和group2.viewgoser.com.zone两个域文件
vim /var/named/chroot/etc/group1.viewgoser.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
viewgoser.com IN SOA ns1.viewgoser.com. dns.viewgoser.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.viewgoser.com.
$ORIGIN viewgoser.com.
view A 192.168.122.1
ns A 192.168.122.1
vim /var/named/chroot/etc/group2.viewgoser.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
viewgoser.com IN SOA ns1.viewgoser.com. dns.viewgoser.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS ns1.viewgoser.com.
$ORIGIN viewgoser.com.
view A 192.168.122.2
ns A 192.168.122.2
修改文件属主,加载配置
chown named.named /var/named/chroot/etc/group1.viewlnh.com.zone /var/named/chroot/etc/group2.viewlnh.com.zone rndc reload
测试,在192.168.1.120主机上执行host view.viewgoser.com 192.168.1.120,解析的ip地址为192.168.122.1
host view.viewgoser.com 192.168.1.120 Using domain server: Name: 192.168.1.120 Address: 192.168.1.120#53 Aliases: view.viewgoser.com has address 192.168.122.1
测试,在192.168.1.121主机上执行host view.viewgoser.com 192.168.1.120,解析的ip地址为192.168.122.2
host view.viewgoser.com 192.168.1.120 Using domain server: Name: 192.168.1.120 Address: 192.168.1.120#53 Aliases: view.viewgoser.com has address 192.168.122.2
压测
通过bind的queryperf工具来做dns的压力测试工具,安装queryperf工具如下:
cd /usr/local/src/ wget http://ftp.isc.org/isc/bind9/9.9.1-P1/bind-9.9.9-P1.tar.gz tar -xvf bind-9.9.9-P1.tar.gz cd /usr/local/src/bind-9.9.9-P1/contrib/queryperf ./configure make #此目录下生成queryperf文件 cp queryperf /usr/bin
压测自己创建的DNS服务,创建一个文件test.txt,内容如下(前面为域名,后面为A记录)
vim test.txt view.viewgoser.com A view.viewgoser.com A view.viewgoser.com A view.viewgoser.com A
执行命令: /usr/bin/queryperf -d test.txt -s 192.168.1.120,返回的结果类似于Queries per second: 16077.170418 qps可以看到每秒支持的并发量。
如何让自己搭建的DNS服务对外提供服务
要想让自己的dns服务对外提供dns服务的话,首先要在域名服务商注册域名,对购买好的域名做ns修改

实现web管理DNS服务
通过github开源出来的DNS Web管理工具https://github.com/shanks1127/dns ,可以方便DN运维人员轻易的管理DNS服务器,比如域名的增删改查,是不是很类似于数据库的操作?没错,就是将DNS的记录保存在数据库当中,修改DNS解析的时候先将域名保存在数据库,然后读取数据库记录生成DNS文件,这样的好处是数据库可以持久化保存DNS记录,并且将文件从数据库保存在文件当中又不影响DNS解析性能
部署过程参考地址:http://blogs.studylinux.net/?p=4545
浙公网安备 33010602011771号