环境准备:
服务器:
安装bind软件、bind-utils软件(配置cdrom源)、关闭防火墙、关闭selinux、配置IP地址:
# yum install bind.x86_64 -y
# yum install bind-utils -y
# systemctl stop firewalld.service
# setenforce 0
# ifconfig ens33 192.168.1.20/24
客户端:
关闭防火墙、关闭selinux、安装bind、bind-utils(配置cdrom源,为测试从DNS服务器做准备)
、配置IP地址:
# systemctl stop firewalld.service
# setenfore 0
# yum install bind bind-utils -y
# ifconfig ens33 192.168.1.30/24
服务配置及测试:
DNS缓存服务器:
cache服务器即自身不提供额外的区域解析文件,在接受到client的DNS解析请求后,查询
缓存,如果命中,则返回结果;如果未命中,则向根域发起迭代查询。
配置:/etc/named.conf
options {
//listen-on port 53 { 127.0.0.1; }; #注释掉后监听本机所有IP地址;
//listen-on-v6 port 53 { ::1; }; #注释掉不监听IPv6地址;
directory "/var/named"; #区域文件等数据文件存放位置;
dump-file "/var/named/data/cache_dump.db";#统计文件;
statistics-file "/var/named/data/named_stats.txt";#统计文件;
memstatistics-file "/var/named/data/named_mem_stats.txt";#统计文件;
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #any表示任意主机向服务器发起DNS查询;
recursion yes; #是否接收客户端的递归查询请求;
dnssec-enable no; #未注册的DNS服务器必须关闭此项;
dnssec-validation no; #未注册的DNS服务器必须关闭此项;
} ;
启动和测试:
1、检查配置文件语法:
# named-checkconf #未输出错误信息则配置正确;
2、启动DNS服务:
# systemctl start named
3、查看服务状态和端口是否监听:
# systemctl status named #查看服务是否提示错误;
# grep named /var/log/messages #查看日志是否提示错误(另一处日志记录
在/var/named/data/run文件中);
# ss -tunl #查看本机IP的TCP、UDP的53端口,TCP的953端口是否监听
Tip:UDP 53端口接受客户端的DNS请求;
TCP 53端口进行主从DNS服务器之间的数据传送;
TCP 953端口进行DNS服务的远程管理,默认只允许127.0.0.1进行连接;
如发现提示错误或端口未正常监听,需排除错误后继续
4、测试服务器端域名解析:
# dig www.baidu.com @192.168.1.20
正确返回IP地址,则服务端服务正常
5、测试客户端域名解:
# dig www.baidu.com #不指定DNS服务器时,此时无法解析域名
# dig www.baidu.com @192.168.1.20 #指定DNS服务器时,此时解析域名成功
Tip:如果解析不成功,检查网络、配置文件、防火墙、selinux等。
DNS转发服务器:
DNS转发服务器也不需要额外的区域解析文件,当收到client解析请求后,缓存有结果
则返回,无结果则向指定的上层DNS服务器进行转发。
DNS缓存服务器和转发服务器的建立,一般是出于网络安全的考虑。
配置一:forward only
options {
//listen-on port 53 { 127.0.0.1; }; #注释掉后监听本机所有IP地址;
//listen-on-v6 port 53 { ::1; }; #注释掉不监听IPv6地址;
directory "/var/named"; #区域文件等数据文件存放位置;
dump-file "/var/named/data/cache_dump.db";#统计文件;
statistics-file "/var/named/data/named_stats.txt";#统计文件;
memstatistics-file "/var/named/data/named_mem_stats.txt";#统计文件;
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #any表示任意主机向服务器发起DNS查询;
recursion yes; #是否接收客户端的递归查询请求;
dnssec-enable no; #未注册的DNS服务器必须关闭此项;
dnssec-validation no; #未注册的DNS服务器必须关闭此项;
forwarders { 202.96.134.133;}; #指定转发时的上层DNS地址;可以有多个地址;
在为得到回答时,会依次向下转发查询请求;
forward only; #仅转发解析请求,自身不处理请求(即不会向根域发起迭代查询);
} ;
配置二:forward first
forward only项改为:
forward first;# 转发得不到结果时,会自己向根域迭代查询并返回结果给client;
其余项同上
配置三:forward only或forward first都未配置仅有forwarders配置项时,默认为forward first模式
启动和测试:
启动和测试过程同cache服务器;
主DNS服务器:
管理一个或多个区域的区域文件解析、从DNS服务器。主DNS可以同时是另一个域的从DNS
服务器,从DNS服务器同时也可以是另一个域的主DNS服务器
配置:
/etc/named.conf文件:
options {
//listen-on port 53 { 127.0.0.1; }; #监听本机所有地址;
//listen-on-v6 port 53 { ::1; }; #不监听IPv6地址;
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #允许所有主机查询
recursion yes; #允许递归;
dnssec-enable no; #关闭安全认证;
dnssec-validation no; #关闭安全认证;
allow-transfer ( none; }; #不允许区域文件传送,开启的话则填上slave服务器IP;
};
/etc/named.rfc1912.zones文件中添加区域定义:
定义正向区域
zone "shxing.com." IN {
type master; #服务器为此区域的主DNS服务器;
file "shxing.com.zone"; #区域数据文件
allow-update { none; };
};
# shxing.com.后面的点是必须的,不然语法错误,称为FQDN;
定义反向区域:
zone "2.168.192.in-addr.arpa." IN {
type master;
file "2.168.192.in-addr.arpa.zone";
allow-update { none; };
};
创建/var/named/shxing.com.zone区域数据文件,并创建如下内容:
$TTL 1D ;定义全局TTL值为1天,局部有定义时以局部值为准
$ORIGIN shxing.com. ;定义省略项,缺省为配置文件中定义的域名称
@ IN SOA ns1.shxing.com. mail1.shxing.com. (
2019101201 ;文件序列号,从服务器更新数据时对比使用
2H ;刷新时间,这里是每2小时从服务器更新数据
30M ;重试时间,刷新失败后的重试时间间隔
7D ;过期时间,这里定义连续更新失败达一周,从服务器停止提供服务,等待管理员处理
1D );通用TTL值,局部有定义时以局部为准
;区域文件的首部必须为SOA记录,定义了此域的主DNS服务器,邮件通知服务器,区域文件
序列号等等内容
@ IN NS ns1.shxing.com. ;名称解析服务器记录,可以有多个
ns1 IN A 192.168.1.20 ;每个NS记录都对应一个A记录
@ IN MX 20 mail1.shxing.com. ;邮件服务器记录
@ IN MX 30 mail2.shxing.com. ;每个MX记录都应对应一个A记录
mail1 IN A 192.168.1.20 ;A记录,解析名称到IP
mail2 IN A 192.168.1.30
www IN A 192.168.1.20
ftp IN CNAME www.shxing.com. ;别名记录,当多个主机名对应一个IP地址时,不用
设置多个A记录,而设置别名记录,这样当IP地址发生变动,改变一条A记录即可
创建/var/named/2.168.192.in-addr.arpa.zone区域解析文件:
$TTL 1D
$ORIGIN 2.168.192.in-addr.arpa.
@ IN SOA ns1.shxing.com. mail1.shxing.com. (
2019101201
3H
30M
7D
1D )
@ IN NS ns1.shxing.com.
20 IN PTR ns1.shxing.com.
20 IN PTR www.shxing.com.
20 IN PTR ftp.shxing.com.
# 反向区域解析文件中,要求由SOA记录、NS记录和PTR记录,无其他类记录
Tip:正、反向区域解析文件中,本域DNS记录必须有,对应的A记录可以没有或者指向无效的IP。
测试:略
子域授权:
在父域的区域解析文件/var/named/shxing.com.zone中添加子域NS指定和A记录指定
xn.shxing.com IN NS ns1.xn.shxing.com.
ns1.xn.shxing.com. IN A 192.168.1.30
子域服务器开启DNS服务并做相关配置.
Tip:
1、父域解析子域名称时,父域区域解析文件中有记录则直接返回结果;没有则向子域DNS服务器查询
2、子域解析父域名称时,子域区域解析文件中有记录是无效的,会向根域发起迭代查询,此时要设置
forwarders转发到父域服务器,可以是全局转发,也可以是单独域定义转发。即转发可定义在options中也
可以定义在zone字段中。
从DNS服务器配置:把192.168.1.30客户端主机设置为从服务器
主DNS服务器中设置:
/etc/named.conf文件options选项中添加:
allow-transfer { 192.168.1.30; }; #允许进行区域文件传送
正向区域解析文件中添加:
@ IN NS ns2.shxing.com. #为要设置从DNS服务器的正向区域文件添加从服务器NS记录
ns2 IN A 192.168.1.30
反向区域解析文件中添加:
@ IN NS ns2.shxing.com. #为要设置从DNS服务器的反向区域文件添加从服务NS记录
30 IN PTR ns2.shxing.com.
# rndc reload #重读配置文件
从DNS服务器中设置:
在/etc/named.rfc1912.zones中定义zone:
zone "shxing.com." IN {
type slave; #定义此服务器为该区域的从DNS服务器
file "slaves/shxing.com.zone"; #从服务器文件一般存放于slaves目录下,注意文件属主属组和权限
masters { 192.168.1.20; }; #设定该区域主DNS的IP
};
zone "2.168.192.in-addr.arpa." IN {
type slave;
file "slaves/2.168.192.in-addr.arpa.zone";
masters { 192.168.2.20; };
};
# systemctl start named :启动named服务
# grep named /var/log/messages:会提示区域文件传输完成
注意:
1、主DNS服务器可以是某域的从DNS服务器,从DNS服务器也同时可以是某域的主DNS服务器
2、正、反向两个区域解析文件是独立的,不必同时设置,也不必在同一服务器上;
3、主DNS每次修改区域解析文件时,都应该更新区域解析文件的serial号(大于原有序号),否则从DNS不会更新文件
子域委派:
只需在父域区域文件中指定子域ns记录和对应的a记录即可,例在父域
shxing.com中授权子域fuzhu.shxing.com,在shxing.com.zone文件中
添加:
fuzhu IN NS ns1.fuzhu.shxing.com.
ns1.fuzhu IN A 192.168.180.1
子域fuzhu.shxing.comDNS服务器中按主DNS服务器的配置方法配置即可:
修改named.conf配置文件
创建正向和反向区域文件
ACL控制:
allow-query、allow-transfer等可以借助ACL实现访问控制
ACL定义在/etc/named.conf中option字段之前,格式例如:
acl acl_rec {
192.168.181.0/24;
192.168.100.23;
};
在allow-query中可以定义acl_rec,表示允许acl_rec控制组进行查询:
allow-query { acl_rec;};
view:
针对不同请求的客户端实现不同的解析,启用view后,所有zone必须定义在其中
配置文件如下例:
/etc/named.conf中:
添加acl控制组:
acl local_access {
127.0.0.1;
};
注释掉根域定义:所有的域都要在view中定义,除允许递归的客户端所在的
view,其他view最好不要定义根域。
/etc/named.rfc1912.conf中:
1、将文件中所有的本地域定义到view:local中,并仅local_access匹配:
view “local” {
match-clients { local_access;};
。。。
};
2、定义view:Telecom和view:Unicom,使不同的客户端得到不同的解析
结果(反向解析域是不同的客户端得到相同的解析结果):
view “Telecom” {
match-clients { 192.168.1.0/24;};
zone “shxing.com.” IN {
type master;
file “Telecom/shxing.com.zone”;
allow-update { none;};
};
zone “1.168.192.in-addr.arpa.” IN {
type master;
file “1.168.192.in-addr.arpa.zone”;
allow-update { none;};
};
zone “2.168.192.in-addr.arpa.” IN {
type master;
file “2.168.192.in-addr.arpa.zone”;
allow-update { none;};
};
};
#tip:一个域名对应的多个ip在反解时必须得到相同的结果,所以
在每个view中必须定义全部的反向域
view “Unicom” {
match-clients { 192.168.2.0/24;};
zone “shxing.com.” IN {
type master;
file “Unicom/shxing.com.zone”;
allow-update { none;};
};
zone “1.168.192.in-addr.arpa.” IN {
type master;
file “1.168.192.in-addr.arpa.zone”;
allow-update { none;};
};
zone “2.168.192.in-addr.arpa.” IN {
type master;
file “2.168.192.in-addr.arpa.zone”;
allow-update { none;};
};
};
注意事项:
1、/etc/named.conf配置文件的每个语句需要以‘;’结尾;
2、本次测试用DNS由于未向上级DNS注册,所以在/etc/named.conf配置文件中,一定要
关闭dnssec安全认证,设置:
dnssec-enable no;
dnssec-validation no;
注意:仅注释掉是无效的,默认为开启,必须设置为no。
参考资料:
1、bind9管理员参考手册中文版
2、http://linux.vbird.org/linux_server/0350dns.php#DNS_slave 鸟哥的Linux私房菜
补充
1、配置文件:
每一行都要以分号结尾
dnssec:对发送给客户端的数据来源进行验证(来源数据包必须包含安全标签,即对方开启了dnssec),
较为复杂,建议关闭
疑问:
dnsmasq
工具包:
bind-utils:
host:
nslookup:
dig:
+trace:追踪详细查询过程;
Tip:经测试,trace的过程是由根开始的逐级迭代查询。
填坑:
1、在测试DNS缓存转发服务器时,无论如何,dig命令解析域名都提示state:SERVFAIL,
解析不到结果。
解:在/etc/named.conf文件中,dnssec关于dns安全的两项,由于是未向上级dns注册的
非法dns服务器,无法通过验证,所以必须关闭选项;关闭选项时,简单地注释掉选项
不起作用,应当修改这两项的值为no。
参考:https://blog.youkuaiyun.com/qq_22870837/article/details/88342128
2、疑问:
问题:bind安装完成后,不添加区域文件,不做其他修改,不设置forwarders或者forward
是否能完成一台cache服务器的功能:当本地缓存有结果时返回结果,当本地缓存无
结果时向根域迭代查询返回结果。
测试结果:
# dig www.sina.com @127.0.0.1
couldn't get address for 'c.root-servers.net': not found
couldn't get address for 'a.root-servers.net': not found
couldn't get address for 'b.root-servers.net': not found
couldn't get address for 'k.root-servers.net': not found
couldn't get address for 'd.root-servers.net': not found
couldn't get address for 'f.root-servers.net': not found
couldn't get address for 'h.root-servers.net': not found
couldn't get address for 'l.root-servers.net': not found
^C^Ccouldn't get address for 'i.root-servers.net': not found
couldn't get address for 'g.root-servers.net': not found
couldn't get address for 'e.root-servers.net': not found
couldn't get address for 'm.root-servers.net': not found
couldn't get address for 'j.root-servers.net': not found
dig: couldn't get address for 'c.root-servers.net': no more
解析不了本地根域文件/var/named/named.ca中的根域IP?
# systemctl status named
managed-keys-zone: Unable to fetch DNSKEY set '.': timed outmanaged-keys-zone: Unable to fetch DNSKEY set '.': timed out
解:可以的。当不设置forward也不定义域、不配置区域文件时,服务器是作为cache服务器存在的,在另
一环境测试成功
排:
1、Firewalld已关闭、selinux已设置为‘disable’;
2、路由配置正确,外部IP可以ping通,但域名仍无法ping通;
3、DNS配置文件语法及设置检查,同成功案例的环境一样设置,且平台相同;
4、dig命令@路由解析测试成功,@本机仍无解析结果;
5、日志未有其他错误,仅在named服务启动时提示上述问题;
6、成功环境平台中使用的NetworkManager管理网络,而上述环境中使用network管理网络,怀疑
此原因,修改之,仍无效;
7、仍待排查
Tip:虽然完全的cache服务器很少,在named.conf文件中加入forwarders选项,改为DNS转发服务
器后解析正常,但未排查出具体问题。怀疑是本地根域的解析文件格式问题或者named.conf中
有关key的选项设置错误。