一、DNS介绍及安装:
1、DNS系统的作用
1). 正向解析:根据主机名称(域名)查找对应的IP地址
2). 反向解析:根据IP地址查找对应的主机域名
2、 DNS的解析方式
1). 递归解析
– 大多数客户机向DNS服务器解析域名的方式
2). 迭代解析
– 大多数DNS服务器向其他DNS服务器解析域名的方式
3、 DNS服务器的类型(角色)
1). 缓存域名服务器
– 也称为 唯高速缓存服务器
– 通过向其他域名服务器查询获得域名->IP地址记录
– 将域名查询结果缓存到本地,提高重复查询时的速度
2). 主域名服务器
– 特定DNS区域的官方服务器,具有唯一性
– 负责维护该区域内所有域名->IP地址的映射记录
3). 从域名服务器
– 也称为 辅助域名服务器
– 其维护的域名->IP地址记录 来源于主域名服务器
4、 DNS的域名空间
整个DNS的域名空间是一个树形结构,最顶端是根域,根域下面是顶级域,顶级域有三种分类,即通用域、国家域和反向域,再下是二级域。
5、 DNS服务器基础
1)、 DNS相关的安装包
– bind-chroot-9.3.4-10.P1.el5
– ypbind-1.19-11.el5
– bind-libs-9.3.4-10.P1.el5
– bind-utils-9.3.4-10.P1.el5
– bind-9.3.4-10.P1.el5
– caching-nameserver-9.3.4-10.P1.el5
2)、 BIND服务器端程序
– 主要执行程序:/usr/sbin/named
– 服务脚本:/etc/init.d/named
– 默认监听端口:53
3)、 主配置文件:
– /var/named/chroot/etc/named.conf
4)、 保存DNS解析记录的数据文件位于:
– /var/named/chroot/var/named/
6、 DNS服务器的安装及配置
a) 安装DNS软件包
rpm –ivh bind-9.3.4-10.P1.el5
rpm –ivh bind-chroot-9.3.4-10.P1.el5 //不允许更改其主目录
rpm –ivh caching-nameserver-9.3.4-10.P1.el5 //将DNS配置文件放到/var/named目录
b) 编辑配置文件
1、 创建域名vi /var/named/chroot/etc/named.conf //named.conf为手动添加
options {
directory "/var/named"; //指定根目录
};
zone "." IN {
type hint; //根域类型
file "named.ca"; //存放根域地址的文件名
};
zone "zx.com" IN { //创建的域名
type master; //域类型
file "zx.com.zx"; //域的解析配置文件
};
zone "2.168.192.in-addr.arpa" IN {
type master;
file "zx.com.fx";
};
2、 编辑正向解析记录配置文件
vi /var/named/chroot/var/named/zx.com.zx$TTL 86400 @ IN SOA ns1.zx.com. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns1.zx.com.
ns1 IN A 192.168.2.100
www IN A 192.168.2.101
3、 编辑反向解析记录配置文件
vi /var/named/chroot/var/named/zx.com.fx
$TTL 86400 @ IN SOA ns1.zx.com. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns1.zx.com.
100 IN PTR ns1.zx.com.
101 IN PTR www.zx.com.
二、分离解析域名服务器
针对来自局域网客户机的区域数据文件
view “视图1” {
match-clients { 客户机地址1; }
zone “zx.com” IN {
……
};
};
针对来自其他任意地址客户机的区域数据文件
view “视图2” {
match-clients { 客户机地址2; }
zone “zx.com” IN {
……
};
};
配置实例:
view "LAN" {
match-clients { 192.168.1.0/24; };
zone "zx.com" IN {
type master;
file "zx.com.zone.lan";
};
};
view "WAN" {
match-clients { any; };
zone "zx.com" IN {
type master;
file "zx.com.zone.wan";
};
};
三、DNS转发功能
1. 在/etc/named.conf中可以在options段中使用forwarders和forward指令设置DNS转发:
options {
forwarders {
192.168.1.110;
192.168.1.112;
};
forward first;
};
forwarders {
DNS_IP_1;
DNS_IP_2;
};
forwarders指令用于设置将DNS请求转发到哪个服务器,可以指定多个服务器的IP地址。
forward first | only;
forward指令用于设置DNS转发的工作方式:
forward first设置优先使用forwarders DNS服务器做域名解析,如果查询不到再使用本地DNS服务器做域名解析。
forward only设置只使用forwarders DNS服务器做域名解析,如果查询不到则返回DNS客户端查询失败。
2、 客户端对DNS解析
DNS:domain name system
递归查询:A->B->C->D->E 然后B 告诉A 地址 进行一次查询就能得到最终结果
迭代查询:A-->B A->C A->D A->E 然后A 得到地址 需要进行多次查询,才能得到最终结果
互联网上的应用方式一般是:本地递归,互联网部分迭代。
所有DNS都不知道其他DNS在哪里,但都知道根在哪里,本地主机向本地DNS递归,本地DNS出去迭代查询后向本地返回最终结果。
DNS常见的记录类型:
A记录: 由主机名解析IP地址
PTR记录:由IP地址解析主机名
NS记录: 用来指定本地的域名服务器(有主,有辅)
MX记录: 用来指定本地的邮件服务器
CNAME: 用来指定一个主机的别名
SOA: 起始授权记录,用来说明本域的主域名服务器
辅助域名服务器每隔一段时间要去主(或者其他辅助)域名服务器上面查询更新,以保证数据的一致性,这个过程叫做区域传送,这个过程使用TCP协议,53号端口。为了保证数据的一致性,如果主服务器有更新,也会及时告知从服务器过来同步。
区域传送有两种类型:
增量区域传送
完全区域传送
DNS服务器类型:1.主<-->从 2.缓存服务器 3.转发器
关于查询优先级:查找本地hosts文件->本地DNS缓存->本地DNS缓存->本地DNS区域文件->.....、
$TTL 86400
@ IN SOA localhost. root.localhost. (在DNS配置文件中@代表本域有特殊意义,所以这里管理员邮箱以“.”代替并且后面跟一个“.”,固定格式。
1997022700 ; Serial 每次更新后服务器都将此号码更改,从服务器若查询到该号码改变就想服务器请求更新。
28800 ; Refresh 从服务器的更新时间
14400 ; Retry 从服务器若更新失败后的重试时间
3600000 ; Expire 重试多久后就宣告失败不再更新
86400 ) ; Minimum 若主服务器找不到对应的请求,允许客户端再次查询的时间
DNS转发:默认DNS服务器会为1000个client端做递归解析。
在配置文件中声明 recursion no完全关闭递归转发功能
声明为某个网段或者某个IP做递归 allow-recursion {IP/Net;}
在主配置文件中声明版本号 vsersion " ",防止别人通过dig命令来获取bind的版本信息搞破坏
1、完全转发:当DNS服务器收到查询请求的时候会先看看是不是查询本域的信息,本地缓存是否有数据,如果不能使用本地数据解析DNS会将查询请求发送给转发器,此时是以递归查询的方式发送给转发器的,而在标准的DNS解析中,DNS服务器将以迭代查询的形式发送给另一个DNS服务器。
所谓的 forwarder,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 "." zone 查询,而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。我们知道,当DNS服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 "." zone 再逐级的查询下去,最后再把查询结果告诉客户端。在这个过程之中,DNS服务器还会将查询到的结果存放到缓存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。如果DNS服务器上指定了forwarder,那这个DNS发现缓存中没有记录时,将不向 "." 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS服务器都会保存一份数据在缓存中。这样,以后的相同查询就快多了,这对于DNS所服务的客户端而言查询效率会提高很多。
当forwarder没有返回答案时,奔DNS会自己去远端请求。但是如果配置了forward only; 则他仅仅处理转发,而不自己查询。
2、部分转发(只转发解析某个域的DNS):假设有两个域,a.com和b.com,a.com这个域是经过授权(向上级注册,也就是.com知道他的存在)的,而b.com这个域没有经过授权,此时如果a.com中的一台主机要访问www.b.com就会出现访问不了,但是如果a.com知道b.com这个域的DNS主机是谁,即便b.com没有经过授权,这时a.com的DNS可以设一个部分转发,将本域所有要求解析b.com域的请求全部都发给b.com这个域的DNS主机就可以了。
部分转发一般用于访问未经授权的DNS域。配置格式
zone “b.com” IN {
type forward;
forwarders {IP;};
}
注意:
1.转发服务器的查询模式必须允许递归查询,否则无法正确完成转发
2.转发服务器列表如果是多个DNS服务器,则会依次尝试,直到获得查询信息为止
3.配置区域委派时,如果使用转发服务器,有可能会产生区域引用的错误
#作为转发服务器,千万不要出现转发循环。
配置转发服务器技巧:
1).转发列表配置精简
对于配置有转发器的DNS服务器,可将查询发送至多个不同的位置,如果配置转发服务器配置过多,则会增加查询的时间,应根据需要使用转发器,例如:将本地无法解析的DNS信息转发至其他域名服务器。
2).避免链接转发器
如果配置了DNS服务器server1将查询请求转发给DNS服务器server2,则不要在为server2配置其他转发服务器。如果其他转发服务器进行了错误的配置,将查询转发给server1,那么可能导致错误。
3).减少转发器负荷
如果大量的DNS服务器使用这些转发器进行域名信息查询,则会增加转发器的工作量,降低解析的效率,所以建议使用一个以上的转发器实现负载。
4).避免转发器配置错误
DNS服务器会按照转发器配置文件设置的顺序来转发域名,如果国内的域名服务器,错误的将第一个转发器配置为美国的DNS服务器地址,则所有本地无法解析的查询均会发送至指定美国的DNS服务器,这会降低网络上名称解析的效率
缓存服务器:
缓存服务器本地并不设置DNS信息,仅执行查询和缓存操作。客户端发送查询请求,缓存服务器如果有该查询的信息,则直接返回结果。如果没有,则发送至根服务器,通过迭代查询获得相应的DNS信息,然后将结果保存至缓存,保存信息TTL值过期后将会清空。
缓存服务器不需要建立独立的区域,可以直接对named.conf文件进行设置:
options {
directory "/var/named";
dataesize 80M; #DNS缓存设置为80M
recursion yes; #允许递归查询
};
或:
options {
directory “/var/named”;
forward only;
forwarders {
192.168.1.1;
192.168.1.2;
};
};
解释:datasize(默认不需要设置)
服务器可以使用的最大数据内存量。默认值为default。这是一个在服务器系统内存中已经设置了的参数。如果服务器要超过这个限制的内存量,则会失败,这将使服务器不能提供DNS服务。所以,这个选项作为一种限***务器所使用的内存量的方式就不太有效,但是它能够将操作系统设置的太小的缺省数据尺寸增大。如果要限***务器使用的内存量,可以使用max-cache-size和recursive-clients选项
max-cache-size number;
限***务器可以用于缓存查询答案的内存量。如果缓存增长的太大,就要在记录的TTL到期之前将他们从缓存中删除,从而确保内存的用量保持在稳定的限度内。
recursive-clients number;
限***务器处理的并发递归查询的数量,内存有限的服务器需要把这个限制降到比默认值还低。如果设置了不运行递归查询(recursion no;),就不需要设置这个了。
zone "." {
type hint;
file "named.ca"; #根区域文件,保证存储正确的根服务器记录
};
子域授权:
在父域的区域配置文件中以NS记录声明子域以及管理这个子域的DNS服务器(主和辅都声明了)
这里假设a.com这个域下面有一个子域net.a.com
配置很简单只需要在父域的区域配置文件中添加一条
net.a.com IN NS ns1.net.a.com
ns1.net.a.com IN A 1.1.1.1
设置允许进行DNS查询的主机
1、直接定义
在主配置文件中allow-query { 192.168.1.0/24; }; 定义允许192.168.1.0这个网段的主机进行DNS查询
2、使用acl
在options上面定义一个acl
acl clients {172.16.0.0/16;192.168.1.0/24;};
allow-query { clients; }; 这样就可以了同时允许这两个网段进行查询
智能DNS(DNS View):
我们知道网通和电信之间进行访问速度比较慢,现在架设服务器一般都是双线的,我们经过DNS的设置,让DNS自
动识别客户端IP是网通的还是电信的,网通就访问网通的服务器电信就访问电信的服务器。
这里我们假设网通属于192.168.1.0/24这个网段,电信属于172.16.0.0/16这个网段的
首先定义访问控制
acl telecom { 172.16.0.0/24; };
acl unicom { 192.168.0.0/24; };
接下来针对两种不同的客户IP范围定义两个DNS视图
view TELNET {
match-clients { telecom; };
match-destinations { any; };
recursion no;
include "/etc/named.telecom.zones";
};
view UNINET {
match-clients { unicom; };
match-destinations { any; };
recursion no;
include "/etc/named.unicom.zones";
};
这里假设我的DNS域为test.com,以下配置文件分别为:
vi named.telecom.zones(此文件由named.rfc1912.zones复制而来,以下是在原文件基础之上添加,)
zone "test.com" IN {
type master;
file "test.com.zone.tele";
allow-update { none; };
};
zone "0.16.172.in-addr.arpa" IN {
type master;
file "172.16.0.rev";
allow-update { none; };
};
vi named.unicom.zones(此文件同上,如果手动新建务必保证文件中有根域以及localhost域)
zone "test.com" IN {
type master;
file "test.com.zone.uni";
allow-update { none; };
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "192.168.0.rev";
allow-update { none; };
};
具体正反解文件内容不再列出,参考我博客里面之前介绍的DNS建立的过程建立,两个正反解文件除了IP之外保持完全一致
做完之后进行语法检查named-checkconf,named-checkzone
重启测试(我本机配置两个IP 192.168.0.162和172.16.0.162)
dig -t A www.test.com @172.16.0.162使用172.16.0.162作为DNS服务器来解析
dig -t A www.test.com @192.168.0.162使用192.168.0.162作为DNS服务器来解析