1、DNS 概述
1.1、DNS的出现及演化
网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。
但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。
1.2、DNS是什么
DNS(Domain Name System),即域名系统。它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统。
DNS采用CS架构,服务器端工作在UDP协议端口53和TCP协议端口53上。
FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的树状层级结构的完全路径域名来表示一个准确位置对应的主机。
提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。
目前DNS已经成为了互联网通讯的基础服务。
1.3、互联网DNS访问模型
DNS服务器采用分布式数据结构保存着海量的名称,那么用户如何快速的在互联网上访问哪台服务器或者哪些服务器就能找到待解析的数据呢?
客户机发起对www.kernel.org的解析请求
(1)客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步
(2)客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。
(3)将请求转发本地DNS服务器。
(4)查看域名是否本地解析,是则本地解析返回,否则进行下一步。
(5)本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。
(6)向全球某一个根域服务器发起DNS请求,根域返回org域的地址列表。
(7)使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。
(8)使用某一个kernel域IP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。
以上客户机和本地DNS服务器直接的查询方式,称为递归查询。
本地DNS服务器多次重复查询的方式,称为迭代查询。
1.4、DNS的分类:
主DNS服务器:就是一台存储着原始资料的DNS服务器。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也成辅助DNS服务器。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。
1.5、一些术语和概念
权威DNS服务器:它是负责对某区域能够进行解析,并在父区域中存储着NS记录的主或者从服务器。
权威应答AA(Authoritative Answer):权威服务器给出的最终答案是就是权威答案,并用协议中的某个标志位表示。
授权:就是上一级将它的子域的管理授权给某一个特定的组织和机构,子域的记录信息就直接由该组织或机构管理的权威服务器进行存储和解析。在上一级中需要保留指向子域的记录,这种记录就称为胶水记录(Glue Record)。
1.6、RR(Resource Record)资源记录
DNS层级结构中,不管是节点还是叶子节点都是资源,对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,这条记录就是资源记录RR。RR的标准记录在RFC 1034中。
1.6.1、RR的组成:
owner name | 所属名称 |
type | RR的类型 |
TTL | 缓存RR的秒数(time-to-live) |
class | 表示一个协议或者一族协议,常用IN表示Internet |
RDATA | 记录数据 |
1.6.2、RR中IN类(class)常见类型(type)
SOA | 区域授权起始记录,区域文件第一条记录,而且一个区域文件只能有一条 |
NS | 域的授权名称服务器 |
MX | 域的邮件交换器,要跟着一个优先级值,越小越高 |
A | IPV4主机地址 |
AAAA | IPV6主机地址 |
PTR | 解析IP的指针 |
CNAME | 权威(正式)名称,定义别名记录 |
1.6.3、常用指令
1、$TTL
TTL 可以在SOA之前使用该指令,给出TTL秒数的32位整数值。
2、$ORIGIN
设定域名,它必须出现在任何一行省略书写的RR记录前。当一个区域文件第一次被读取时,隐含这个命令的值为<zone_name>.(必须是跟着一个半角句号),如果不设置它,就必须在区域文件中书写FQDN。
例如
$ORIGIN kernel.org.
www CNAME web-server
就等同于
www.kernel.org. CNAME web-server.kernel.org.
3、@符号
@符号等价于$ORIGIN。
1.6.4、SOA的RDATA格式
MNAME | 授权主机FQDN或者当前区域的名称 |
RNAME | 邮箱地址,@用.替代 |
SERIAL | 区域传送使用的版本号,格式为yyyymmddnn |
REFRESH | 从服务器去同步主服务器时间间隔 |
RETRY | 刷新失败重试时间间隔 |
EXPIRE | 从服务器过期时长 |
MINIMUM | 否定答案过期时长 |
百度的SOA
a.shifen.com. 579 IN SOA dns.baidu.com. sa.baidu.com. (
1408010001 ; serial number
5 ; refresh 5s
5 ; retry 5s
86400 ; expire 1d
3600 ;min TTL 1h
)
1.6.5、NS的RDATA格式
NSDName:DNS的FQDN
baidu.com. 64899 IN NS ns2.baidu.com.
baidu.com. 64899 IN NS ns4.baidu.com.
baidu.com. 64899 IN NS dns.baidu.com.
baidu.com. 64899 IN NS ns7.baidu.com.
baidu.com. 64899 IN NS ns3.baidu.com.
1.6.6、MX的RDATA格式
PREFERENCE:优先级,越小越高
EXCHANGE:邮件服务器FQDN
baidu.com. 7200 IN MX 20 jpmx.baidu.com.
baidu.com. 7200 IN MX 20 mx50.baidu.com.
baidu.com. 7200 IN MX 10 mx.n.shifen.com.
baidu.com. 7200 IN MX 20 mx1.baidu.com.
1.6.7、CNAME的RDATA格式
CNAME:权威名称,FQDN
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com是正式名称,而www.baidu.com是别名
1.6.8、A的RDATA格式
ADDRESS:IP V4地址
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com. 36 IN A 111.13.100.92
www.a.shifen.com. 36 IN A 111.13.100.91
1.6.9、PTR的RDATA格式
7.100.in-addr.arpa. IN PTR www.example.com.
2、BIND实现DNS服务
2.1、BIND是什么
1984年,加州大学伯克利分校的几个学生完成了Unix名称服务的实现,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是互联网上使用最为广泛的DNS服务软件。
bind的发行版一般包含三个部分:域名服务器、域名解析器库、软件测试工具。
2.2、DNS实验
下面就安装bind来完成整个DNS的实验
2.2.1、前提:时间同步
在生产环境中,所有的服务器需要使用同一的时钟,一般会指向同一个时间源。时间源采用某种方式取得可靠准确的时间。
客户机可以使用ntp服务或者在crontab中配置ntpdate完成来完成时间同步。
2.2.2、环境准备
本文介绍了2种安装方式,源代码编译安装需要依赖众多开发库,请使用yum安装。将CentOS光盘挂载到/media/cdrom,配置本地yum源备用。配置yun请参看博主博文 《Linux的程序安装和包管理》,此类博文很多,这里不再赘述。使用下面的语句安装开发环境。
两台服务器分别安装了CentOS 6.5,地址分别为192.168.60.133(源码安装)、192.168.60.134、192.168.60.171。
# yum groupinstall "Development tools" "Server Platform Development"
2.2.3、安装BIND
2.2.3.1、rpm安装bind(192.168.60.171和192.168.60.134)
默认bind的库和工具已经安装,但是服务器软件没有安装,可以使用yum -y install bind 。
安装成功生成一下目录和文件:
服务脚本:/etc/rc.d/init.d/named
主配置文件:/etc/named.conf
区域解析库文件:/etc/named.rfc1912.zones
服务根目录:/var/named/
从服务器使用的区域解析库目录:/var/named/slaves,权限特殊
服务脚本使用的文件:
pid目录:/var/run/named/,在其下创建named.pid文件,使用时创建符号链接到其父目录中,即/var/run/named.pid,由服务脚本产生。
锁文件:/var/lock/subsys/named,由服务脚本产生。
以上这些目录和文件,是rpm安装的时候创建的,而且对这些文件和目录的权限做了很好的限定。对于配置文件的配置,下面将逐一实例介绍,部分解释在上面。
2.2.3.2、源代码安装(192.168.60.133上)
下载bind的源码,官网下载地址http://www.isc.org/downloads/bind/,本次使用版本为bin-9.10.0-P2.tar.gz。
(1)安装
configure的一些变量
--prefix :默认在/usr/local
--sysconfdir:默认在--prefix指定的目录下,如果--prefix为空,就为/etc
--localstatedir:默认在--prefix指定的目录下,如果--prefix为空,就为/var
--enable-threads:启用多线程
--disable-chroot:不支持chroot
# ./configure --prefix=/usr/local/named9.10 --sysconfdir=/etc/named9.10 --enable-threads --disable-chroot # make && make install # ln -s /etc/named9.10/ /etc/named
安装完成
(2)配置
编辑主配置文件/etc/named/named.conf
options { directory "/var/named"; recursion yes; } zone "." IN { type hint; file "named.ca"; } include "/etc/named/named.rfc1912.zones";
生成/etc/named/named.rfc1912.zones文件,内容如下:
注意,此配置文件中,file中定义的是路径都是相对于上文中directory的路径 /var/named 的。
zone "." IN { type hint; file "named.ca"; }; zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; };
建立运行根目录/var/named,准备基本的Zone文件,根、localhost正反向解析
# mkdir /var/named # cd /var/named/ # touch named.ca named.localhost named.loopback named.empty
在/var/named目录中准备好这4个文件
named.ca,可以使用dig -t NS . @a.root-servers.net > named.ca 生成。但是要注意的是,dig命令是安装了bind之后才有的,而且某些情况下,查询根的NS记录的命令返回结果可能没有A记录和AAAA记录,有可能被拦截。 named.ca内容如下:
; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420 ;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN NS M.ROOT-SERVERS.NET. . 518400 IN NS A.ROOT-SERVERS.NET. . 518400 IN NS B.ROOT-SERVERS.NET. . 518400 IN NS C.ROOT-SERVERS.NET. . 518400 IN NS D.ROOT-SERVERS.NET. . 518400 IN NS E.ROOT-SERVERS.NET. . 518400 IN NS F.ROOT-SERVERS.NET. . 518400 IN NS G.ROOT-SERVERS.NET. . 518400 IN NS H.ROOT-SERVERS.NET. . 518400 IN NS I.ROOT-SERVERS.NET. . 518400 IN NS J.ROOT-SERVERS.NET. . 518400 IN NS K.ROOT-SERVERS.NET. . 518400 IN NS L.ROOT-SERVERS.NET. ;; ADDITIONAL SECTION: A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4 A.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:ba3e::2:30 B.ROOT-SERVERS.NET. 3600000 IN A 192.228.79.201 C.ROOT-SERVERS.NET. 3600000 IN A 192.33.4.12 D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90 E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10 F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241 F.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:2f::f G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4 H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53 H.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:1::803f:235 I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17 J.ROOT-SERVERS.NET. 3600000 IN A 192.58.128.30 J.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:c27::2:30 K.ROOT-SERVERS.NET. 3600000 IN A 193.0.14.129 K.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:7fd::1 L.ROOT-SERVERS.NET. 3600000 IN A 199.7.83.42 M.ROOT-SERVERS.NET. 3600000 IN A 202.12.27.33 M.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:dc3::35 ;; Query time: 147 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Mon Feb 18 13:29:18 2008 ;; MSG SIZE rcvd: 615
named.localhost 内容如下:
$TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
named.loopback 内容如下:
$TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1 PTR localhost.
named.empty 内容如下:
$TTL 3H @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
检查配置文件
# named-checkconf # named-checkzone "localhost" named.localhost zone localhost/IN: loaded serial 0 OK # named-checkzone "localhost.localdomain" named.localhost zone localhost.localdomain/IN: loaded serial 0 OK # named-checkzone "1.0.0.127.in-addr.arpa" named.loopback zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0 OK # named-checkzone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" named.loopback zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0 OK
可以开始测试运行named了,由于是编译安装,并没有提供服务脚本,不能使用service启动named。
(3)工作环境配置
1)导出环境变量
在/etc/profile.d下创建文件named9.10.sh
PATH=/usr/local/named9.10/bin:/usr/local/named9.10/sbin:$PATH export PATH
重启会话连接,echo $PATH,返回如下:
/usr/lib64/qt-3.3/bin:/usr/local/named9.10/bin:/usr/local/named9.10/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
这样就把bind提供的众多命令加入到了搜索路径中了,方便使用
2)帮助文件导出
编辑/etc/man.config,添加下面的语句。
MANPATH /usr/local/named9.10/share/man
3)增加系统用户和组
# groupadd -g 53 -r named # useradd -M -g named -r -u 53 named
(4)第一次启动
使用-g选项,让服务运行于前台,便于查错
# named -g -u named
发现几个问题
09-Aug-2014 03:29:52.385 couldn‘t mkdir ‘/usr/local/named9.10/var/run/named‘: Permission denied 09-Aug-2014 03:29:52.385 generating session key for dynamic DNS 09-Aug-2014 03:29:52.385 couldn‘t mkdir ‘/usr/local/named9.10/var/run/named‘: Permission denied 09-Aug-2014 03:29:52.385 could not create /usr/local/named9.10/var/run/named/session.key 09-Aug-2014 03:29:52.385 failed to generate session key for dynamic DNS: permission denied 09-Aug-2014 03:29:52.419 configuring command channel from ‘/etc/named9.10/rndc.key‘ 09-Aug-2014 03:29:52.419 couldn‘t add command channel ::1#953: file not found
权限问题,执行下面语句
# chown -R named:named /usr/local/named9.10/var/ # mkdir /var/named/slaves # chown -R :named /var/named/ # chown named:named /var/named/slaves # chmod -R o-rwx /var/named/ # chown :named /etc/named9.10/
开始测试
# dig -t A localhost @192.168.60.133 ; <<>> DiG 9.10.0-P2 <<>> -t A localhost @192.168.60.133 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46079 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;localhost. IN A ;; ANSWER SECTION: localhost. 86400 IN A 127.0.0.1 ;; AUTHORITY SECTION: localhost. 86400 IN NS localhost. ;; ADDITIONAL SECTION: localhost. 86400 IN AAAA ::1 ;; Query time: 2 msec ;; SERVER: 192.168.60.133#53(192.168.60.133) ;; WHEN: Sat Aug 09 04:50:22 CST 2014 ;; MSG SIZE rcvd: 96
服务启动成功。
以上配置好之后,基本达到了和rpm安装同样的状态,可以开始试验内容
3、实验
3.1、实验的内容
主从复制(区域传送)、子域授权、转发器、视图
3.2、主从复制(区域传送)
(1)建立主DNS服务器
修改named.rfc1912.zone文件,在尾部添加
zone "example.org" IN { type master; file "example.org.zfile"; allow-update { 127.0.0.1; }; allow-transfer { 192.168.60.171; }; };
提供正向解析文件
在/var/named/下新建文件example.org.zfile,属主数组为named,权限640
$TTL 1H @ IN SOA ns1 admin ( 2014080101 3600 600 86400 3600 ) IN NS ns1 IN NS ns2 IN MX 10 mail ns1 IN A 192.168.60.133 ns2 IN A 192.168.60.171 mail IN A 192.168.60.200 www IN A 192.168.60.110
# chown named:named example.org.zfile # chmod 640 example.org.zfile # named-checkzone "example.org" example.org.zfile zone example.org/IN: loaded serial 2014080101 OK
提供反向解析文件
在主配置文件中,追加以下内容
zone "60.168.192.in-addr.arpa" IN { type master; file "60.168.192.in-addr.arpa.ptrfile"; allow-update { 127.0.0.1; }; allow-transfer { 192.168.60.171; }; };
# cp -p example.org.zfile 60.168.192.in-addr.arpa.ptrfile
$TTL 1H @ IN SOA ns1.example.com. admin.example.com. ( 2014080101 3600 600 86400 3600 ) IN NS ns1.example.com. IN NS ns2.example.com. 100 IN PTR ns1.example.com. 101 IN PTR ns2.example.com. 110 IN PTR www.example.com. 200 IN PTR mail.example.com.
(2)RNDC
使用rndc(remote name domain controller)对named进行控制操作。默认工作TCP的953号端口,不安全,建议本地使用。
常用命令 :
reload 在线重新装载配置文件和zone文件
reload zone 重新加载指定的zone
stop [-p] 安全停止named。使用-p返回pid
flush 清除DNS缓存
status 显示服务器状态
# rndc-confgen -r /dev/urandom > /etc/named/rndc.conf # chgrp named /etc/named/rndc.conf # chmod 440 /etc/named/rndc.conf
打开rndc.conf,将下面部分追加到/etc/named/named.conf尾部(要去除前面的#,即注释)
key "rndc-key" { algorithm hmac-md5; secret "I+gGCDDZ5OzuYTIj+bDu6g=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
(3)启动DNS服务
# named -u named # rndc status version: 9.10.0-P2 <id:d23ac043> boot time: Fri, 08 Aug 2014 22:28:17 GMT last configured: Fri, 08 Aug 2014 22:28:17 GMT CPUs found: 2 worker threads: 2 UDP listeners per interface: 2 number of zones: 103 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running
使用以下命令测试
# dig -t SOA example.org @192.168.60.133 # dig -t MX example.org @192.168.60.133 # dig -t A www.example.org @192.168.60.133 # dig -x 192.168.60.110 @192.168.60.133 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -x 192.168.60.110 @192.168.60.133 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51009 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;110.60.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 110.60.168.192.in-addr.arpa. 3600 IN PTR www.example.com. ;; AUTHORITY SECTION: 60.168.192.in-addr.arpa. 3600 IN NS ns1.example.com. 60.168.192.in-addr.arpa. 3600 IN NS ns2.example.com. ;; Query time: 4 msec ;; SERVER: 192.168.60.133#53(192.168.60.133) ;; WHEN: Fri Aug 8 17:06:25 2014 ;; MSG SIZE rcvd: 110
(4)建立从DNS服务器(rpm安装的,192.168.60.171)
从服务器的主配置文件中,将这两句改为如下,或者注释掉。
listen-on port 53 { any; }; allow-query { any; }; 在/etc/named.rfc1912.zones中 zone "example.org" IN { type slave; file "slaves/example.org.zone"; masters { 192.168.60.133; }; allow-transfer { none; }; };
启动服务
# service named start
查看/var/named/slaves/,已经存在文件example.org.zone了,内容为:
# cat example.org.zone $ORIGIN . $TTL 3600 ; 1 hour example.org IN SOA ns1.example.org. admin.example.org. ( 2014080101 ; serial 3600 ; refresh (1 hour) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS ns1.example.org. NS ns2.example.org. MX 10 mail.example.org. $ORIGIN example.org. mail A 192.168.60.200 ns1 A 192.168.60.133 ns2 A 192.168.60.171 www A 192.168.60.110
检查是否能够解析
# dig -t A www.example.org @192.168.60.171 ; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.171 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36324 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.example.org. IN A ;; ANSWER SECTION: www.example.org. 3600 IN A 192.168.60.110 ;; AUTHORITY SECTION: example.org. 3600 IN NS ns2.example.org. example.org. 3600 IN NS ns1.example.org. ;; ADDITIONAL SECTION: ns1.example.org. 3600 IN A 192.168.60.133 ns2.example.org. 3600 IN A 192.168.60.171 ;; Query time: 4 msec ;; SERVER: 192.168.60.171#53(192.168.60.171) ;; WHEN: Sat Aug 09 08:16:32 CST 2014 ;; MSG SIZE rcvd: 128
3.3、子域授权及转发器
假设子域为tech.example.org
在父域172.168.60.133中的example.org.zfile添加胶水记录
$TTL 1H @ IN SOA ns1 admin ( 2014080105 3600 600 86400 3600) IN NS ns1 IN NS ns2 IN MX 10 mail tech IN NS ns.tech ns.tech IN A 192.168.60.134 ns1 IN A 192.168.60.133 ns2 IN A 192.168.60.171 mail IN A 192.168.60.200 www IN A 192.168.60.110
子域172.168.60.134中的/etc/named.rfc1912.zones中追加
zone "tech.example.org" IN { type master; file "tech.example.org.zone"; };
在/var/named下创建zone文件tech.example.org.zone
$TTL 3600 @ IN SOA ns admin ( 2014080201 3600 600 86400 3600) IN NS ns ns IN A 192.168.60.134 www IN A 192.168.60.190
启动子域(rpm安装的)
# service named start
重新装载父域配置文件
# rndc reload
测试成功,解析有子域提供,返回非权威答案
# dig -t A www.tech.example.org @192.168.60.133 ; <<>> DiG 9.10.0-P2 <<>> -t A www.tech.example.org @192.168.60.133 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34877 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.tech.example.org. IN A ;; ANSWER SECTION: www.tech.example.org. 3600 IN A 192.168.60.190 ;; AUTHORITY SECTION: tech.example.org. 3600 IN NS ns.tech.example.org. ;; ADDITIONAL SECTION: ns.tech.example.org. 3580 IN A 192.168.60.134 ;; Query time: 1 msec ;; SERVER: 192.168.60.133#53(192.168.60.133) ;; WHEN: Sat Aug 09 09:46:25 CST 2014 ;; MSG SIZE rcvd: 98
3.4、转发器配置
见子域授权图
3.4.1、完全转发
这里有一个问题,使用子域的DNS服务,无法知晓父域,所有的非本域解析统统要去找根域。
为了解决这个问题,可以将子域配置成为转发器,除了子域本身以外的解析,全部转发父域服务器。
在/etc/named.conf中添加forward和forwarders。
options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; 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"; allow-query { any; }; // write here forward only; forwarders { 192.168.60.133; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones";
开始测试,本地转发www.example.org的解析请求给父域,返回非权威答案
# dig -t A www.example.org @192.168.60.134 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.example.org @192.168.60.134 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38054 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.example.org. IN A ;; ANSWER SECTION: www.example.org. 3354 IN A 192.168.60.110 ;; AUTHORITY SECTION: example.org. 3354 IN NS ns1.example.org. example.org. 3354 IN NS ns2.example.org. ;; ADDITIONAL SECTION: ns1.example.org. 3354 IN A 192.168.60.133 ns2.example.org. 3354 IN A 192.168.60.171 ;; Query time: 0 msec ;; SERVER: 192.168.60.134#53(192.168.60.134) ;; WHEN: Sat Aug 9 02:42:26 2014 ;; MSG SIZE rcvd: 117
3.4.2、区域转发
当然这里还可以配置区域转发,对example.org定义为一个区域,里面配置forward和forwarders。
在/etc/named.conf中移除forward和forwarders两句。
在/etc/named.rfc1912.zones中追加
zone "example.org" IN { type forward; forward only; forwarders { 192.168.60.133; }; };
使用rndc reload重新装载配置文件
# dig -t A www.example.org @192.168.60.134
测试成功。
3.5、view视图
不同IP段的客户端,DNS分析判断后返回不同的结果。
将来自172.168.60.133的请求访问是intra_view,其他的IP的请求都访问inter_view。
这次使用acl访问控制列表,在192.168.60.133上/etc/named/named.conf中,在起始行添加
acl intranet { 192.168.60.133; 127.0.0.1; };
重新修改/etc/named/named.rfc1912.zones,定义2个视图
view "intra_view" { match-clients { intranet; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; }; zone "example.org" IN { type master; file "example.org.zfile"; allow-update { 127.0.0.1; }; allow-transfer { 192.168.60.171; }; }; zone "60.168.192.in-addr.arpa" IN { type master; file "60.168.192.in-addr.arpa.ptrfile"; allow-update { 127.0.0.1; }; allow-transfer { 192.168.60.171; }; }; }; view inter_view { match-clients { any; }; zone "test.com" IN { type master; file "test.com.zone"; }; };
新增/var/named/test.com.zone文件
$TTL 1H @ IN SOA ns1 master ( 2014080101 3600 600 86400 3600) IN NS ns1 IN MX 10 mail ns1 IN A 172.16.200.100 mail IN A 172.16.200.200 www IN A 172.16.200.110
开始测试
本机192.168.60.133上测试
# dig -t A www.example.org @192.168.60.133 ; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.133 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46433 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.example.org. IN A ;; ANSWER SECTION: www.example.org. 3600 IN A 192.168.60.110 ;; AUTHORITY SECTION: example.org. 3600 IN NS ns1.example.org. example.org. 3600 IN NS ns2.example.org. ;; ADDITIONAL SECTION: ns1.example.org. 3600 IN A 192.168.60.133 ns2.example.org. 3600 IN A 192.168.60.171 ;; Query time: 2 msec ;; SERVER: 192.168.60.133#53(192.168.60.133) ;; WHEN: Sat Aug 09 18:40:14 CST 2014 ;; MSG SIZE rcvd: 128 # dig -t A www.test.com @192.168.60.133 无法解析,此处省略
在192.168.60.134上测试
# dig -t A www.test.com @192.168.60.133 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.test.com @192.168.60.133 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5917 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;www.test.com. IN A ;; ANSWER SECTION: www.test.com. 3600 IN A 172.16.200.110 ;; AUTHORITY SECTION: test.com. 3600 IN NS ns1.test.com. ;; ADDITIONAL SECTION: ns1.test.com. 3600 IN A 172.16.200.100 ;; Query time: 2 msec ;; SERVER: 192.168.60.133#53(192.168.60.133) ;; WHEN: Sat Aug 9 04:21:18 2014 ;; MSG SIZE rcvd: 80 # dig -t A www.example.org @192.168.60.133 解析不到,此处省略
综上,DNS是一个非常重要的基础性服务,有很多的概念,标准内容也非常多。不仅用于互联网解析,也可以用在企业内建网络中。常用的就有主从复制、子域授权、转发和视图几种模式。要熟悉这些基础概念和应用场景,就能利用它对整个局域网乃至互联网的访问进行优化。
参考资料
维基百科
https://en.wikipedia.org/wiki/List_of_DNS_record_types
域名标准规格
http://tools.ietf.org/html/rfc1035
BIND手册
http://www.isc.org/downloads/bind/doc/bind-9-9/
DNS资料
http://dns-learning.twnic.net.tw/dns/toc.html
本文出自 “终南山下” 博客,请务必保留此出处http://me2xp.blog.51cto.com/6716920/1538163
DNS服务及基于BIND的实现,布布扣,bubuko.com
原文:http://me2xp.blog.51cto.com/6716920/1538163