一、前言
Dns全称domain name system,当我们访问一个网站时,在网站输入一个网址。但是网络是靠ip地址这个逻辑地址来标识地址的。而一个网址是如何转换为ip地址的?下面我们将简单讲解下dns的原理。
二、dns查询过程
在了解dns查询过程时,我们先了解一些有关dns的专业名词
根域:用来管理互联网的主目录,全球共13台。
一级域:根域下的子域,如com. cn. org. net. 等
二级域:众多一级域下的子域,如baidu.com. google.com.等
子域:是相对与它的上级域而言,如根域下的com. org. 等
递归:dns查询的一种方式,服务器会把查询请求逐级传递。
迭代:dns查询的一种方式,如主机A查询一条dns资源记录,那么如果服务器告诉主机A它在某一台服务器上,那么将由A去找下一台服务器,而非是
这台服务器本身帮它去寻找
FQDN :完全合格域名
资源记录:用于记录解析的属性。
SOA :起始授权记录,一个区域文件只有一个
NS :name server
MX :邮件交换器
A :用于正向解析
PTR :用于反向解析
CNAME :正式名称
Dns查询过程,如下图
解说:
1.当客户端请求访问www.baidu.com时,它向本地dns服务器发起请求询问www.baidu.com的ip地址。
2.本地dns服务器不知道www.baidu.com的ip地址,那么它将向根域询问。
3.根域说com.是它的子域,你可以问下com.域。
4.本地dns于是去询问com.域,com.域说baidu.com.是它的一个子域。
5.于是本地dns去询问baidu.com.域,baidu.com.说它负责解析这个域,知道www.baidu.com.的地址,于是返回ip地址给本地dns服务器
6.本地dns服务器取得结果,返回给client。
三、案例
拓扑图
软件版本:bind-9.10.3
简要说明:master ip:192.168.19.128 , slave ip :192.168.19.129 , subdomain ip :192.168.19.131 ,client ip :192.168.19.132
master 与slave为主从dns,master与subdomain为父域和子域关系。
3.1、在所有服务器上部署bind并启动之
所有的服务器中都需要安装以下环境,这里不一一说明举例。
安装环境:
[root@localhost ~]# yum groupinstall "Development tools" "Server Platform" –y #安装编译软件所需的工具
建立named用户
[root@localhost bind-9.10.3]# groupadd -g 53 -r named #创建named用户组 [root@localhost bind-9.10.3]# useradd -g 53 -r -u 53 -s /sbin/nologin named #创建named用户,属组named
安装bind
[root@localhost bind-9.10.3]# mkdir /usr/local/bind-9.10.3 #创建bind-9.10.3的目录 [root@localhost bind-9.10.3]# ./configure --prefix=/usr/local/bind-9.10.3 --disable-ipv6 --disable-chroot --enable-threads [root@localhost bind-9.10.3]# make && make install #编译安装 [root@localhost bind-9.10.3]# ln -s /usr/local/bind-9.10.3 /usr/local/bind #为bind做一个软链接,方便以后版本升级
生成rndc.conf文件
[root@localhost etc]# /usr/local/bind/sbin/rndc-confgen -urandom > /usr/local/bind/etc/rndc.conf #生成rndc.conf文件
named.ca文件生成
[root@localhost etc]# dig -t NS . >/usr/local/bind/var/named.ca #生成根的信息
1.master配置
named.conf文件配置
options { directory "/usr/local/bind/var"; #设置named的工作目录 allow-recursion { localnet; }; #允许使用递归查询的客户端 notify yes; #启用通知功能,当masterzone问修改后,通知slave }; acl localnet { #定义一个localnet的acl 192.168.19.128; 192.168.19.129; 192.168.19.131; 127.0.0.1; }; acl order { #定义一个order的acl 192.168.19.132; 172.16.0.0/16; }; view orderview { #创建orderview视图 match-clients { order; }; #允许访问这个视图的客户端 zone "jack.com." IN { #定义一个zone文件 type master; #类型 file "jack.com.zone"; #存储路径,相对于directory目录而言 allow-update { none; }; #不允许所有客户端更新 allow-transfer { order; }; #允许被传输文件的客户端 }; }; view localview { #定义一个localview视图 match-clients { localnet; }; #允许访问这个视图的客户端 zone "." IN { type hint; #设置类型 file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; allow-update { none; }; }; zone "leon.com." IN { #定义一个zone type master; #类型是master file "leon.com.zone"; allow-update { none; }; allow-transfer { localnet; }; #允许acl是localnet的客户端传输文件 allow-query { localnet; }; #允许哪些客户端查询 }; zone "19.168.192.in-addr.arpa" { #定义一个反向zone type master; file "192.168.19.zone"; allow-update { none; }; allow-transfer { localnet; }; allow-query { localnet; }; }; }; key "rndc-key" { #指定rndc的key文件和控制信息,这部分内容来源于,rndc.conf文件中的后半段 algorithm hmac-md5; secret "wCtvv1ALOnb7Tv0d/o/qyw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
编辑master的zone文件
[root@localhost var]# ll #查看需要哪些zone文件 total 28 -rw-r--r--. 1 root named 118 Sep 27 15:28 127.0.0.zone -rw-r--r--. 1 root named 223 Sep 29 05:07 192.168.19.zone -rw-r--r--. 1 root named 238 Sep 28 05:10 jack.com.zone -rw-r--r--. 1 root named 330 Sep 29 05:03 leon.com.zone -rw-r--r--. 1 root named 114 Sep 27 15:28 localhost.zone -rw-r--r--. 1 root named 890 Sep 27 14:57 named.ca drwxr-xr-x. 3 root root 4096 Sep 27 15:41 run [root@localhost var]# cat *.zone #zone文件内容如下,本处只给出结果,不给出内容 $TTL 86400 @ IN SOA localhost. admin.localhost.( 2015092801 #版本号 3H #刷新间隔 15M #重现刷新间隔 7D #失效日期 1D #否定答案的统一缓存时长 ) IN NS localhost. 1 IN PTR localhost. #此处为127.0.0.zone内容 $TTL 86400 #此处为192.168.19.zone的内容 @ IN SOA ns1.leon.com. admin.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.leon.com. #NS记录 IN NS ns2.leon.com. #slave服务器的NS记录 128 IN PTR ns1.leon.com. #master的PTR记录 129 IN PTR ns2.leon.com. #slave的PTR记录 3 IN PTR www.leon.com. 4 IN PTR mail.leon.com. $TTL 86400 #此处为jack.com.zone的内容 @ IN SOA ns1.jack.com. admin.jack.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.jack.com. ns1 IN A 192.168.19.128 www IN A 192.168.19.3 smtp IN CNAME mail #正式名称,类似于别名 mail IN A 192.168.19.4 @ IN MX 5 mail.jack.com. * IN A 192.168.19.5 $TTL 86400 #此处为leon.com.zone的内容 @ IN SOA ns1.leon.com. admin.leon.com. ( 2015092801 3H 15M 7D 1D ) @ IN NS ns1.leon.com. #master的NS记录 @ IN NS ns2.leon.com. #slave的NS记录 secret IN NS ns3.secret.leon.com. #子域授权NS记录 ns3.secret IN A 192.168.19.131 #子域授权A记录 ns2 IN A 192.168.19.129 ns1 IN A 192.168.19.128 www IN A 192.168.19.3 smtp IN CNAME mail mail IN A 192.168.19.4 @ IN MX 5 mail.leon.com. $TTL 86400 #此处为localhost.zone的内容 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. IN A 127.0.0.1
修改zone文件的属组
[root@localhost sbin]# chown :named /usr/local/bind/etc/named.conf [root@localhost sbin]# chown :named named.ca localhost.zone 127.0.0.zone
修改rndc.conf的属组
[root@localhost sbin]# chown :named /usr/local/bind/etc/rndc.con
2.部署slave
named.conf文件配置
[root@localhost etc]# cat named.conf #查看slave的named.conf文件配置,此处不给出过程 options { directory "/usr/local/bind/var"; #工作目录 }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; }; zone "leon.com." IN { #定义zone文件 type slave; #定义其类型为slave masters { 192.168.19.128; }; #指明它的master地址 file "slaves/leon.com.zone"; #存放位置 }; zone "19.168.192.in-addr.arpa" IN { #定义zone文件 type slave; #定义其类型为slave masters { 192.168.19.128; }; file "slaves/192.168.19.zone"; }; key "rndc-key" { #此处内容和master来源类似 algorithm hmac-md5; secret "ywDZNig5qX0rHte7dIEK8Q=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
编辑zone文件
[root@localhost var]# cat *.zone #对于slave的zone文件,只需要设置localhost蒸发zone即可,对于leon.com的区域文件从master中传输过来 $TTL 86400 #定义localhost的反向区域 @ IN SOA localhost. admin.localhost. ( 2015092801 3H 15m 7D 1D ) IN NS localhost. 129 IN PTR localhost. $TTL 86400 #定义localhost的正向区域 @ IN SOA localhost. admin.localhost. ( 2015092801 3H 15m 7D 1D ) IN NS localhost. IN A 192.128.19.129 admin IN A 192.168.19.129
创建slaves文件
[root@localhost var]# mkdir -p /usr/local/bind/var/slaves #创建slaves文件,存储master传输过来的zone文件 [root@localhost var]#chmod :named /usr/local/bind/var/slaves && chown +w /usr/local/bind/var/slaves #设置slaves的属组,否则无法创建文件
3.子域设置
named.conf文件配置
[root@localhost etc]# cat named.conf options { directory "/usr/local/bind/var"; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; allow-update { none; }; }; zone "secret.leon.com." IN { type master; file "secret.leon.com.zone"; allow-update { none; }; }; zone "19.168.192.in-addr.arpa" { type master; file "192.168.19.zone"; allow-update { none; }; }; zone "leon.com." IN { #定义leon.com的zone区域 type forward; #类型是转发,即当客户端询问这个区域是,把请求转发到指定的服务器上 forward only; #only指无论转发服务器是否返回有结果,这个服务器依然转发到被转发的服务器上 forwarders { 192.168.19.128; }; #转发到指定的服务器上 }; key "rndc-key" { algorithm hmac-md5; secret "4qikE7ovgm5AA8rTY+fYLQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
zone文件配置
[root@localhost var]# cat *.zone $TTL 86400 #localhost的反向区域 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. 1 IN PTR localhost. $TTL 86400 #子域的反向区域 @ IN SOA ns1.secret.leon.com. admin.secret.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns1.secret.leon.com. 131 IN PTR ns1.secret.leon.com. 30 IN PTR www.secret.leon.com. 40 IN PTR mail.secret.leon.com. $TTL 86400 #localhost的正向区域 @ IN SOA localhost. admin.localhost.( 2015092801 3H 15M 7D 1D ) IN NS localhost. IN A 127.0.0.1 $TTL 86400 #子域的正向区域 @ IN SOA ns3.secret.leon.com. admin.secret.leon.com. ( 2015092801 3H 15M 7D 1D ) IN NS ns3.secret.leon.com. ns3 IN A 192.168.19.131 www IN A 192.168.19.30 mail IN A 192.168.19.40
检查配置文件
[root@localhost var]# /usr/local/bind/sbin/named-checkconf #检测配置文件是否有语法错误
启动named(先检测子域的配置文件正确后在启动named服务,master和slave服务器named服务后面启动)
[root@localhost var]# /usr/local/bind/sbin/named #使用绝对路径启动named服务,master和slave也一样,这里不给出过程了
检测配置文件是否正确
[root@localhost sbin]# /usr/local/bind/sbin/named-checkconf #检测配置文件是否正确,无提示则正确,否则错误 [root@localhost sbin]# /usr/local/bind/sbin/named-checkzone localhost /usr/local/bind/var/localhost.zone zone localhost/IN: loaded serial 2015092801 #检测localhost的zone文件是否正确 OK [root@localhost sbin]# /usr/local/bind/sbin/named-checkzone 0.0.127.in-addr-arpa /usr/local/bind/var/127.0.0.zone zone 0.0.127.in-addr-arpa/IN: loaded serial 2015092801 OK [root@localhost var]# /usr/local/bind/sbin/named-checkzone "leon.com." /usr/local/bind/var/leon.com.zone zone leon.com/IN: loaded serial 2015092801 #检测leon.com的正向zone文件是否正确,子域也一使用这种方法检测,这里就不给出检测过程 OK [root@localhost var]# /usr/local/bind/sbin/named-checkzone "19.168.192.in-addr.arpa." /usr/local/bind/var/192.168.19.zone zone 19.168.192.in-addr.arpa/IN: loaded serial 2015092801 OK #检测leon.com的反向zone文件是否正确,子域也一使用这种方法检测,这里就不给出检测过程
查看是否监听端口
[root@localhost var]# lsof -i:53 #通过lsof命令查看是否监听了53端口,如果没有则返回状态结果为1,也可以使用netstat或ss命令 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME named 2821 root 21u IPv4 24148 0t0 TCP localhost:domain (LISTEN) named 2821 root 22u IPv4 24150 0t0 TCP ns1.leon.com:domain (LISTEN) named 2821 root 512u IPv4 24147 0t0 UDP localhost:domain named 2821 root 513u IPv4 24147 0t0 UDP localhost:domain named 2821 root 514u IPv4 24149 0t0 UDP ns1.leon.com:domain named 2821 root 515u IPv4 24149 0t0 UDP ns1.leon.com:domain
查看日志
[root@localhost var]# tail -5 /var/log/messages #启动master和slave时,查看master的日志信息 Sep 29 08:00:57 localhost rsyslogd-2177: imuxsock lost 30 messages from pid 2821 due to rate-limiting Sep 29 08:00:57 localhost named[2821]: client 192.168.19.129#41820 (leon.com): view localview: transfer of 'leon.com/IN': AXFR started (serial 2015092801) #开始传输serial为2015092801的zone文件,类型为AXFR Sep 29 08:00:57 localhost named[2821]: client 192.168.19.129#41820 (leon.com): view localview: transfer of 'leon.com/IN': AXFR ended #结束传输serial为2015092801的zone文件,类型为AXFR Sep 29 08:00:58 localhost named[2821]: client 192.168.19.129#49398 (19.168.192.in-addr.arpa): view localview: transfer of '19.168.192.in-addr.arpa/IN': AXFR started (serial 2015092801) Sep 29 08:00:58 localhost named[2821]: client 192.168.19.129#49398 (19.168.192.in-addr.arpa): view localview: transfer of '19.168.192.in-addr.arpa/IN': AXFR ended
测试主从
[root@localhost var]# dig -t A www.leon.com. @192.168.19.129 #可以在指定解析服务器为slave来解析,能解析可证明主从同步 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.129 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3597 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 #flags类型为aa则表示权威应答 ;; QUESTION SECTION: ;www.leon.com. IN A ;; ANSWER SECTION: #返回的解析结果 www.leon.com. 86400 IN A 192.168.19.3 ;; AUTHORITY SECTION: leon.com. 86400 IN NS ns2.leon.com. leon.com. 86400 IN NS ns1.leon.com. ;; ADDITIONAL SECTION: ns1.leon.com. 86400 IN A 192.168.19.128 ns2.leon.com. 86400 IN A 192.168.19.129 ;; Query time: 4 msec ;; SERVER: 192.168.19.129#53(192.168.19.129) ;; WHEN: Tue Sep 29 08:04:56 2015 ;; MSG SIZE rcvd: 114
测试子域,授权及转发
[root@localhost var]# dig -t A www.leon.com. @192.168.19.131 #可以指定子域服务器解析父域负责解析的资源, ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.131 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4294 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 #可以看到flags无aa这个类型,则表示非权威应答,因为它不负责解析这个记录,只是把请求转发了出去,父域返回这条记录,然后子域在返回该客户端 ;; QUESTION SECTION: ;www.leon.com. IN A ;; ANSWER SECTION: www.leon.com. 86400 IN A 192.168.19.3 ;; Query time: 14 msec ;; SERVER: 192.168.19.131#53(192.168.19.131) ;; WHEN: Tue Sep 29 08:06:26 2015 ;; MSG SIZE rcvd: 46
测试acl (在192。168.19.132机器中,指定父域解析)
[root@localhost ~]# dig -t A www.leon.com. @192.168.19.128 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.leon.com. @192.168.19.128 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 54867 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available #ANSWER为0,没有解析这条记录,原因是父域做了acl限制 ;; QUESTION SECTION: ;www.leon.com. IN A ;; Query time: 4 msec ;; SERVER: 192.168.19.128#53(192.168.19.128) ;; WHEN: Tue Sep 29 08:09:38 2015 ;; MSG SIZE rcvd: 30
测试视图(在192。168.19.132上指定父域解析)
[root@localhost ~]# dig -t A www.jack.com. @192.168.19.128 #在192.168.19.132上指定父域解析www.jack.com这条记录。有返回结果,因为这个视图上没限制这个ip地址。 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.jack.com. @192.168.19.128 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45223 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;www.jack.com. IN A ;; ANSWER SECTION: www.jack.com. 86400 IN A 192.168.19.3 ;; AUTHORITY SECTION: jack.com. 86400 IN NS ns1.jack.com. ;; ADDITIONAL SECTION: ns1.jack.com. 86400 IN A 192.168.19.128 ;; Query time: 1 msec ;; SERVER: 192.168.19.128#53(192.168.19.128) ;; WHEN: Tue Sep 29 08:10:47 2015 ;; MSG SIZE rcvd: 80
四、总结
做此次实验中,出现了较多错误,像zone文件一些忘记更改属组,特别是zone文件内容格式很重要,尽量不要简写。几台服务器之前named启动顺序也比较重要,负责zone文件检测时会出现错误,如先启动子域,在启动从域,最后主域。如果子域最后启动,那么主域简称zone文件时会出错。
原创文章,作者:成吉思汗,如若转载,请注明出处:http://www.178linux.com/8513
评论列表(1条)
排版好的博客更吸睛哦~