linux下DNS详解及高级应用


DNS:domain name system
递归查询:进行一次查询就能得到最终结果
迭代查询:需要进行多次查询,才能得到最终结果
互联网上的应用方式一般是:本地递归,互联网部分迭代。
所有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的版本信息搞破坏
完全转发:当DNS服务器收到查询请求的时候会先看看是不是查询本域的信息,本地缓存是否有数据,如果不能使用本地数据解析DNS会将查询请求发送给转发器,
此时是以递归查询的方式发送给转发器的,而在标准的DNS解析中,DNS服务器将以迭代查询的形式发送给另一个DNS服务器。
options {
  forward only|first;
  forwardsers {IP;};
  }
only:仅仅依靠转发器来递归解析,如果转发器出现问题,就不解析了
first:先请求转发器,让其代为转发(请转发器做递归),如果转发器无响应就自己找根,此时开始标准的DNS解析也就是迭代查询。
部分转发(只转发解析某个域的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;};
  }
子域授权:
在父域的区域配置文件中以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服务器来解析

相关内容

    暂无相关文章