DNS配置

时间:2024-03-07 07:43:33

DNS配置

作者:Danbo 时间:2015-7-26

递归查询;
迭代查询;

正向解析、反向解析;

每个对应关系我们称作:Record(记录),根据记录实现的功能,我们分为记录的类型。
将主机名转换为IP地址的,我们称之为A(Address)记录;
将IP地址转换为主机名的,我们称之为PTR(Pointer)指针记录。
正向和反向的两套数据库必须分开存放。

SOA(Start of Authority,起始授权)记录:授权这个区域的主DNS服务器,域名管理员的电邮地址等。
NS:本区域内所使用的域名服务器。
MX(Mail eXchanger,邮件交换器):当我们向:danbocn@gmail.com发送邮件的时候,@后面gmail.com是一个域,域下面必须有负责收发邮件的服务器(mail.gmail.com),而我们的主机如何知道邮件服务器所处的位置呢?这个就是MX的作用:引导域名到该域名的邮件传输代理(MTA、Message Transfer Agents)列表,并且这个列表是有优先级(priority,0-99表示,数字越小优先级越高)。
CNAME(Canonical Name,规范名字也叫别名记录)。注意 x  CNAME y:此时x是别名,即x的规范名字是y。

正向解析DNS会进行负载均衡,返回一个IP地址;
反向解析虽然也负载均衡返回所有对应的FQDN(全称域名)返回给请求者,但是也可以设置为返回所有FQDN。而反向解析的目的是用于验证解析的IP是否正确,这个多用于邮件服务器上

区域(Zone)和域(Domain)
我们可以这样理解:域是一个逻辑概念,区域是一个物理概念。
比如baidu.com我们可以将其理解为一个域(Domain);而在本地NS服务器上存在两种区域一个是正向Zone、反向Zone,区域则是人为的去定义一个域内的子域(区域),而这个子域(区域)靠的是某个文件来进行管理的,并且分为正向区域和反向区域。不过域和区域并没有谁包含谁的关系。

子域授权(Delegation):比如将baidu.com划分成:tech.baidu.com和mark.baidu.com,管理域的组织可以将域进一步划分成子域。每个子域都可以被授权给其他组织来管理,这意味着这些被授权的组织得负责维护子域中所有的数据。他们可以*地改变域中的数据,甚至将子域进一步划分成更过的子域,然后再授权给其他组织管理。父域仅仅保留子域的数据来源的指针,这样父域便可将查询者引到该处。

主DNS和辅助DNS服务器;并且当我们定义DNS的RR时只能在主DNS服务器上定义,并且与服务DNS之间依靠TCP同步数据库,这个过程叫做区域传送。

缓存名称服务器和转发服务器;缓存域名服务器:将它收到的信息存储下来,并再将其提供给其他用户查询,直到这些信息过期。它的配置中没有任何本地的授权域的配置信息。转发服务器:一台缓存服务器本身不能进行完全的递归查询。相反,它能从缓存向其他缓存服务器转发一部分或者是所有不能满足的查询,一般被称作转发服务器。

DNS服务器的配置:
域名:向IANA的自己够申请。亚太地区在日本。而中国则向CNNIC申请。之后给你的Web界面的地址,你可以通过Web界面填写A记录。

1.安装bind:yum list all bind*
2.yum -y install bind.x86_64
DNS数据库必须有三种区域:根区域、正向解析、反向解析区域。每个区域必须有自己的区域数据文件。
bind的主配置文件:/etc/named.conf :所有者:root、所属组:named
区域数据文件目录(工作目录):/var/named/区域文件的名字是在主配置文件中定义的。

此时我们发现/etc目录下没有named.conf这个主配置文件,这个我们可以通过安装yum -y install caching-nameserver
不过为了学习我们在此手工建立主配置文件:
/etc/named.conf
/在NAMED.CONF
options { /*OPTIONS选项用来定义一些影响整个DNS服务器的环境,如这里的DIRECTORY用来指定在本文件指定的文件的路径,如这里的是将其指定到 /var/named 下,在这里你还可以指定端口等等。不指定则端口是53,每行必须以;结尾。
*/
directory "/var/named";
};
// a caching only nameserver config
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone "." IN { //在这个文件中是用zone关键字来定义域区的,一个zone关键字定义一个域区
type hint;
/*在这里type类型有三种,它们分别是master,slave和hint它们的含义分别是:
master:表示定义的是主域名服务器
slave :表示定义的是辅助域名服务器
hint:表示是互联网中根域名服务器
*/
file "named.ca"; //用来指定具体存放DNS记录的文件,相对于上面定义的根目录:/var/named而言。
};

zone "localhost" IN { //定义一个域名为localhost的正向区域
type master;
file "localhost.zone" ;
allow-update { none; };
};
zone "test.net" IN { //指定一个域名为test.net的正向区域
type master;
file "test.net”
allow-update { none;};
};

zone "0.0.127.in-addr.arpa" IN { //定义一个IP为127.0.0.*的反向域区,要把反向区域解析网段的网络地址反向写
type master;
file "named.local";
allow-update { none; };
};
zone "0.192.168.in-addr.arpa" IN { //定义一个IP为168.192.0.*反向域区
type master;
file "168.192.0";
/var/named/test.net文件
@ IN SOA dns.wqmsl.com.           root.wqmsl.com.(    // SOA表示授权开始
/* 上面的IN表示后面的数据使用的是INTERNET标准。而@则代表相应的域名,如在这里代表test.net,即表示一个域名记录定义的开始。
而 linux.test.net则是这个域的主域名服务器,而webmaster.test.net则是管理员的邮件地址。
注意这是邮件地址中用来代替常见的邮件地址中的@.而SOA表示授权的开始
*/
2003012101 ; serial (d. adams)    /*本行前面的数字表示配置文件的修改版本,格式是年月日当日修改的修改的次数,
每次修改这个配置文件时都应该修改这个数字,要不然你所作的修改不会更新到网上的其它DNS服务器的数据库上,
即你所做的更新很可能对于不以你的所配置的DNS服务器为DNS服务器的客户端来说就不会反映出你的更新,
也就对他们来说你更新是没有意义的。
*/
28800 ; refresh
/*定义的是以为单位的刷新频率 即规定从域名服务器多长时间查询一个主服务器,以保证从服务器的数据是最新的
*/
7200 ;retry
/*上面的这个值是规定了以秒为单位的重试的时间间隔,即当从服务试图在主服务器上查询更时,而连接失败了,
则这个值规定了从服务多长时间后再试
*/
3600000 ; expiry
/*上面这个用来规定从服务器在向主服务更新失败后多长时间后清除对应的记录,上述的数值是以分钟为单位的
*/
8400 )
/*上面这个数据用来规定缓冲服务器不能与主服务联系上后多长时间清除相应的记录
*/
IN NS wqmsl
IN MX 10 mail.wqmsl.com.
linux IN A 168.192.0.14
it-test1 IN A 168.192.0.133
www IN CNAME wqmsl
/*上面的第一列表示是主机的名字,省去了后面的域。
NS:表示是这个主机是一个域名服务器,
A:定义了一条A记录,即主机名到IP地址的对应记录
MX 定义了一邮件记录
CNAME:定义了对应主机的一个别名
/var/named/168.192.0
@ IN SOA  dns.wqmsl.com.           root.wqmsl.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS linux.test.net.
/*以上的各关键字的含义跟wqmsl.com是相同的 
88  IN PTR wqmsl.com. 
188  IN PTR linux.wqmsl.com.
/*
上面的第一列表示的是主机的IP地址。省略了网络地址部分。如88完整应该是:
168.192.0.88
PTR:表示反向记录
最后一列表示的是主机的域名。
}

最小主配置文件的内容:

options {
        directory "/var/named";
};

zone "." IN {
        type hint;
        file "name.ca";
};

zone "data2" IN {
        type master;
        file "data2.zone";
};

zone "0.0.127.in-addr.arpa" IN {
        type master;        
file "named.local";
};

保存退出后,该其所有者为root,所属组为named
chown :named /etc/named.conf

然后我们再进入数据文件目录
查询FQDN对应的IP的命令为:dig -t A www.baidu.com
而我们这里需要查询其根域名服务器的IP地址:dig -t NS .
我们需要将其导入到name.ca文件中:dig -t NS . >>/var/named/named.ca
并:chown :named /var/named/named.ca

修改正向解析文件:
vim data2.zone
里面包含宏定义和RR(Resource Record)
RR格式为:name [TTL] IN RECORD_TYPE VALUE
正向解析:www.baidu.com.   600   IN   A   1.1.1.1
反向解析:1  600   IN    A    www.baidu.com  (注意只需要写网段地址)
一个PTR记录的例子如下图所示:

在RR里面比较独特的资源记录类型为:SOA、NS、MX

对于任意一个数据文件文件来说,第一条记录必须是SOA。
SOA格式如下:
baidu.com.    600    IN     SOA     ns.baidu.com.(主dns)      danbocn.gmail.com.(
                             2015072501(版本号、序列号)
                             20M(主从服务器数据同步的时间间隔,Refresh after 20mins)
                             5M(如果主服务器不回应,则等5M再试,Retry after 5mins)
                             5D(超时时间,重试5天后不回应则不再重试,Expire after 1 week)
                             1D(定义那些我们没有的记录,对方服务器在这个时间不再询问,否定回答Negative caching TTL of 1 Day,当超过这个时间后Slave服务器会宣告该区域失效。)
)

RFC1537建议*域名服务器采取以下的数值:


一个区域文件中可以有多个NS,其中NS后面跟的不能是IP地址,必须是DNS服务器的名称。其格式如下:
NS的格式如下。
baidu.com.     600      IN     NS      ns.baidu.com.
baidu.com.     600      IN     NS      ns1.baidu.com.    #当有多个的时候可以写多个
ns.baidu.com.    600     IN     A    1.1.1.1    #后面必须紧跟着A记录
ns1.baidu.com.    600     IN     A    2.2.2.2

MX的记录一般只出现在正向文件
MX的格式如下:
baidu.com.     600     IN     MX      10      mail.baidu.com.
mail.baidu.com.     600     IN     A      3.3.3.3      #同理后面必须紧跟着A记录

我们看到上面每条记录都有超时时间600s,我们可以在主配置文件中添加:
$TTL 600   #这样每条记录就可以省下TTL超时时间了。
还有我们定义主机名的时候都要把后面的域名也要加上去,这点我们同样可以在前面定义:
$ORIGIN baidu.com.

一个完整的localhost.zone内容:
$TTL 600
@  IN  SOA   localhost.  admin.localhost.(
              2015072601
            1H
            10M
            1W
            1D
)

      IN  NS  localhost.
localhost     IN  A    127.0.0.1

一个完整的named.local内容:
$TTL 600
@  IN  SOA  localhost.  admin.localhost.{
    2015072601
            1H
            10M
            1W
            1D
}

      IN  NS  localhost.
1     IN  PTR  localhost.

注意以上两个文件的所属组也必须为named:chown :named localhost.zone /var/named/localhost.zone /var/named/named.local
然后使用:service named configtest检查记录的语法错误。
启动服务:service named start启动dns服务。
检查监听端口:netstat -ltunp

我们再创建一个baidu.com.zone的区域记录

然后修改/etc/resolve.conf的nameserver为本地主机,然后重新加载配置服务:service named reload
然后我们解析www.baidu.com
dig -t A www.baidu.com两次
此时我们发现前后解析的IP地址顺序刚好相反,这是由于DNS进行了轮训负载均衡。

[root@localhost ~]# host -t A www.baidu.com  #host命令可以解析出所有DNS服务器的地址。
www.baidu.com has address 12.12.12.12
www.baidu.com has address 13.13.13.13

同时在Windows下,我们可以用nslookup命令进入交互模式:
server 192.168.23.131  #指明DNS服务器的IP地址
set q=A   #指明为A记录
www.baidu.com
Addresses:10.10.10.10, 11.11.11.11
注意这里是用:set q=NS,或者是q=MX。

一个域名查询的详细过程如下:
Client-->缓存-->hosts-->local DNS(/etc/resolv.conf)-->DNS Server
1.如果查询请求是local DNS负责区域中的数据的话,要通过查询区域数据文件返回结果(并没有查询缓存,这样才能体现权威性);
2.如果查询请求不是local DNS负责区域中的数据的话,就查询缓存;
3.如果缓存缓存中没有答案的话,则向跟发起查询请求;(此时是根据dig -t NS .返回的第一个NS记录的FQDN查询,然后在根据A记录查询第一个FQDN返回的IP。),此时local DNS会把所有返回的NS对应的A记录缓存下来。然后往下走到。同样下级DNS会接着返回dig -t NS baidu.com.的FQDN和对应的A记录,同样local DNS会将其缓存下来,然后向返回的第一个结果发起查询请求。。。以此规律直到查询到www.baidu.com。如果最终服务器告诉我们没有关于www.baidu.com的记录,那么local DNS会根据named.conf定义的否定缓存时间将这条无效查询记录下来。

DNS 服务器类型:
主、辅助、缓存、转发服务器。
主与服务服务器之前同步是周期性的,假设主服务器更新了一条记录,而此时刷新计时器还没有超时,此时辅助DNS服务器上还没有收到更新。那该如何是好呢?我们的解决方案是:当主服务器数据库后不管刷新计时器有没有超时都会向辅助服务器发送通知,这种叫做通知机制。
区域传送:分为完全区域传送(all zone transfer,axfr)和增量区域传送(incremental zone tranfer,ixfr)。而从域名服务器可以是正向解析区域的从域名服务器,因为正向和反向他们是独立分开的。主DNS挂了,从会在超时(Expire)时间过期后也会挂掉。而且主域名服务器为了安全起见必须要通过acl来定义哪些辅助DNS可以进行同步。
缓存服务器:不负责解析任何区域(除了localhost),这里可以放在网络出口带宽较小,为了节约带宽。用于缓存内部用户查询请求的DNS服务器。
转发服务器:当一个LAN内host靠主机名相互访问的时候,但是他们的主机名定义在LAN外的一台服务器上,并且有不允许LAN内的主机访问互联网。此时我们可以在LAN内架构一台转发服务器,并且允许这台服务器外部互联网,LAN内的主机的DNS全部指向这台转发服务器,但是并不解析任何数据。
另一种情况:假设tech.baidu.com内的一台主机请求解析www.baidu.com的时候,其请求会提交给tech子域内的服务器,而tech子域服务器并不负责解析www.baidu.com域,此时tech服务器就会找根,但是这种并不妥当,我们解决方案是:在tech子域服务器上建立一个转发告诉它如果解析的是baidu.com域的话就不要找根域名域名服务器,直接转发给其上ns.baidu.com这台域名服务器就可以了。

区域类型:
Master、Slave、Hint其实还有第四种叫做forward。
我们在主配置文件named.conf里:
zone "baidu.com" IN {
        type forward;
        forwarder { 172.16.0.1 }; #这个地址为转发到哪台DNS服务器。
};

另一种情况假如我们让不是解析子域内的全都转发给指定DNS服务器,而不是返回根的地址。
此时我们可以将其定义在named.conf中的options选项中
options {
            forwards {172.16.0.1};
};

转发的类型:
first:表示首先进行转发,加入我们想ns.baidu.com服务器转发解析www.google.com的请求,此时ns.baidu.com并没有向子域服务器开放递归查找,此时就不会解析成功。然后子域服务器会向根发出解析请求。
only:forwarder的服务器解析不成功的话就不会再次向根发出请求了。

允许递归就意为这允许缓存,允许缓存就会面临缓存毒化的威胁。
缓存毒化:此时如果有人将DNS名称的A记录的IP地址转到一个钓鱼网站。(*@ο@*) 。。

回忆一下提供DNS服务的工具包:

[root@localhost ~]# yum list all bind*
bind   #服务器端
bind-libs
bind-utils
bind-chroot   #让DNS运行在一个小范围内的。假设我们的DNS被别人攻破了,意味着攻击者获得了运行bind用户的权限了,即named,而named用户和组是我们本机上的一个普通的用户,而普通文件是可以读取/etc/下的所有文件的,获得了我们本地的所有用户名,这样就危险咯。此时我们可以在/var/named/chroot/下创建/etc、bin、sbin目录,运行bind所调用的文件都从/chroot目录下读取。这样即使攻破了也只能看/chroot目录下的内容。
bind-devel
bind-dyndb-ldap
bind-sdb
caching-nameserver:这个是有redhat提供的,安装这个包后就直接是一个缓存服务器了(即提供了配置文件,但是这些配置文件比较诡异)

回忆一下配置文件:/etc/name.conf /etc/rc.d/init.d/named(脚本)
数据文件:/var/named/*

rndc(Remote Name Daemon Controller)
stop
status
state
reload
freeze
这是一个很强大的DNS远程控制工具。默认情况下仅允许本地运行。其配置文件在:/etc/rndc.conf
rndc监听在TCP的953端口。

主从架构配置

假设两台有两台DNS服务器。
主:dns.baidu.com  A  192.168.23.133   (提供www服务)
辅:ns2.baidu.com  A  192.168.23.131  (提供mail服务)

配置好文件named.conf和named.ca、named.local、localhost.zone文件基础信息后。
我们对主配置文件进行语法检查:named-checkconf
然后对区域数据文件进行检查:named-checkzone "localhost" /var/named/localhost.zone
对全部所有文件进行检查:service named configtest
然后启动服务:service named start
检查端口:netstat -tunlp | grep ":53"
使用dig命令进行检测:dig -t A localhost ; dig -t x 127.0.0.1

我们再对主配置文件进行编辑:
编辑当中我们需要注意一下几点:
1.当一个名称有A记录的时候不允许有CNAME记录,即A和CNAME不能同时使用。
2.在反向解析文件中NS记录后面的域名必须写全,否则补齐后就不对了。
named.conf、named.ca、named.local、localhost.zone其内容如下所示:

1.[root@localhost ~]# cat /etc/named.conf
options {
directory "/var/named";
};

 

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 "named.local";
};

 

zone "danbo.com" IN {
type master;
file "danbo.com.zone";
};

 

zone "23.168.192.in-addr.arpa" IN {
type master;
file "192.168.23.zone";
};

2.named.ca里面的内容为:dig -t NS .导入的内容。

3.[root@localhost ~]# cat /var/named/named.local
$TTL 600
@ IN SOA localhost. admin.localhost. (
2015072801
24h
1h
1w
1h
)

IN NS localhost.
1 IN PTR localhost.

4.

[root@localhost ~]# cat /var/named/localhost.zone
$TTL 600
@ IN SOA localhost. admin.localhost. (
2015072801
24h
1h
1w
1h
)

IN NS localhost.
localhost. IN A 127.0.0.1

解析A记录结果如下:

[root@localhost named]# dig -t A www.danbo.com @ 192.168.23.133

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t A www.danbo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 671
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2  #aa代表权威解析。当一个答案是从缓存回答的就不会带“aa,authority answer”。

;; QUESTION SECTION:
;www.danbo.com. IN A

;; ANSWER SECTION:
www.danbo.com. 600 IN A 192.168.23.100

;; AUTHORITY SECTION:
danbo.com. 600 IN NS ns2.danbo.com.
danbo.com. 600 IN NS dns.danbo.com.

;; ADDITIONAL SECTION:(A记录)
dns.danbo.com. 600 IN A 192.168.23.133
ns2.danbo.com. 600 IN A 192.168.23.140

;; Query time: 0 msec
;; SERVER: 192.168.23.133#53(192.168.23.133)
;; WHEN: Tue Jul 28 09:02:14 2015
;; MSG SIZE rcvd: 115

注意:
dig命令、host命令永远不会去查询本地hosts文件的。
而gethostip则会查询本地的hosts文件。这个命令会完全按照本机访问外网的查询流程。

dig -t axfr danbo.com 查询完全区域传送的内容:

[root@localhost named]# dig -t axfr danbo.com
^C[root@localhost named]# dig -t axfr danbo.com @192.168.23.133

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t axfr danbo.com @192.168.23.133
;; global options: +cmd
danbo.com. 600 IN SOA dns.baidu.com. admin.danbo.com. 2015072801 86400 3600 604800 3600
danbo.com. 600 IN NS dns.danbo.com.
danbo.com. 600 IN NS ns2.danbo.com.
danbo.com. 600 IN MX 10 mail.danbo.com.
dns.danbo.com. 600 IN A 192.168.23.133
mail.danbo.com. 600 IN A 192.168.23.132
ns2.danbo.com. 600 IN A 192.168.23.140
pop.danbo.com. 600 IN A 192.168.23.141
www.danbo.com. 600 IN A 192.168.23.100
danbo.com. 600 IN SOA dns.baidu.com. admin.danbo.com. 2015072801 86400 3600 604800 3600
;; Query time: 0 msec
;; SERVER: 192.168.23.133#53(192.168.23.133)
;; WHEN: Tue Jul 28 09:18:53 2015
;; XFR size: 10 records (messages 1, bytes 260)

此时我们发现其完全包含DNS服务器所有数据文件的内容,反向的也可以:dig -t axfr 23.168.192.in-addr.arpa

查询反向记录
[root@localhost ~]# dig -x 192.168.23.133 @192.168.23.133  #如果-PTR不行的话就用-x

 

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -x 192.168.23.133 @192.168.23.133
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17705
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;133.23.168.192.in-addr.arpa. IN PTR

;; ANSWER SECTION:
133.23.168.192.in-addr.arpa. 600 IN PTR dns.danbo.com.

;; AUTHORITY SECTION:
23.168.192.in-addr.arpa. 600 IN NS ns2.danbo.com.
23.168.192.in-addr.arpa. 600 IN NS dns.danbo.com.

;; ADDITIONAL SECTION:
dns.danbo.com. 600 IN A 192.168.23.133
ns2.danbo.com. 600 IN A 192.168.23.140

;; Query time: 0 msec
;; SERVER: 192.168.23.133#53(192.168.23.133)
;; WHEN: Tue Jul 28 09:25:25 2015
;; MSG SIZE rcvd: 136

这里学一下rndc的配置文件:
1.首先使用rndc-confgen生成主配置文件,并将其保存在/etc/rndc.conf文件中。

[root@localhost ~]# rndc-confgen | tee /etc/rndc.conf
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "OUnlnnKBsOKFU3vRnjSZJA==";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "OUnlnnKBsOKFU3vRnjSZJA==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

我们根据提示将上问斜体字写入named.conf文件中。然后删掉# 命令:1,$-1s/^# //g

然后我们看一下rndc的使用方法:(我们仅仅需要记住几个常用的)
reload:重新载入所有的配置文件和区域文件。
reload zone:重新载入单个区域文件。
retransfer zone:让某个区域的数据重传一遍。
freeze zone:冻结某个区域,不允许某个区域动态更新了。
reconfig:重新载入主配置文件好发生更新过的区域文件。(即增量更新)
stats:将服务器的统计数据写入统计数据文件中去。
统计文件默认是没有的,我们可以man named.conf,然后找到statistics-file选项,然后将其写入到named.conf的options选项中去。        statistics-file "/var/named/stats";  然后手工创建这个文件:touch /var/named/stats  并将其所属和属组全部改为named:chown named:named /var/named/stats。(⊙o⊙)此时还是不行。这是为什么呢?这是因为named用户对/var/named这个文件夹没有写权限,不过我们看一下named目录下的data文件夹权限,我们发现其所属组和所有者都是named用户,因此我们将stats文件放在data文件夹中,然后创建文件,此时使用rndc stats发现还是不行。
这是为什么呢?
我们使用getenforce命令:

[root@localhost named]# getenforce
Enforcing   #SELinux是开启的。:setenforce 0 ,此时就可以了,不过不建议这样,这点后面将SELinux时再说明。
querylog:这里是写出日志。
dumpdb:dump备份缓存到dump文件中。
stop:保存停掉DNS服务。
flush:情况服务器的缓存。
status:显示服务器的状态信息。

当我们查看53端口是,发现bind服务监听了所有IP地址
加入我们不想监听某IP地址我们该如何做呢?
同样我们man named.conf,查找到listen-on [ port integer ] { address_match_element; ... };
同理将其写入named.conf的options中。listen-on port 53 { 要监听的地址 }

[root@localhost named]# netstat -tunlp | grep :53
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2590/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 2590/named

此时我们发现仅仅监控我们在listen-on port 53 {  ;}中定义的IP地址了。

主从区域传送实践:

我们知道手工区域传递的命令:dig -t axfr danbo.com @192.168.23.133
一般情况下我们装完bind之后在/var/named目录下会生成两个目录data和slaves并且其所有者和所属组都是named。而salves这个目录的主要作用是:当前服务器作为从DNS服务器的时候,从主DNS服务器同步过来的数据存放的目录。

下面我们看一下从服务器同步的过程:
1.安装配置阶段:这个与主服务器一样,先编辑成本地缓存服务器。在此不做赘述。
2.vim /etc/named添加如下信息:
zone "23.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.23.zone";
}
3.在辅域名服务器上启用:rndc reconfig
然后观察:tail /var/log/messages文件看有没有出错。

此时我们发现同步过来的danbo.com.zone里面会用";"加上注释。

我们知道在服务器内只有辅助域名服务器才去向主DNS服务器同步整个DNS数据库。
这样我们可以在主DNS服务器的配置文件中定义:allow-transfer { 192.168.23.134; }
这个allow-tranfer +辅助DNS的IP地址。可以定义在两个位置:一个是options:针对全局有效;另一个是定义的zone中,仅针对当前zone生效。不过这种定义方式不方便,我们可以采用acl的形式进行定义。
acl的定义方式为:

acl string { address_match_element; ... };  必须定义在最上面一行。
例如:
acl acl_name {
  192.168.23.134;
  192.168.23.137;
}

acl acl_name1 {
  172.16.0.0/16; #这样的话我们定义一个网段。
};

这样我们可以在zone内进行调用:
allow-transfer { acl_name; }; #加上要调用的ACL名字即可。
其中acl有几个内置的范围:
none:所有都不
any:任意
localnet:本地网络:当前主机所在的本地网络,根据掩码判断。
因此仅对本地递归可以这样定义:allow-recursion { localnet; };

我们如何定义给谁递归和不给谁递归的呢?
禁止给所有的服务器递归在:named.conf中options { recursion no; }
仅允许一部分递归在:named.conf中allow-recursion { acl_name; } #此时主机会给allow-recursion去调用acl定义的网段或主机进行递归查询。那么从服务器上也应该有相应的allow-recurion去调用相应的acl了。

我们如何验证是否允许递归的呢?
使用dig + recurse -t A FQDN发起递归查。另外还有+trace方式,也是必须以递归的方式进行查询。

如果定义一个转发区域呢?
此时我们可以定义这样所以区域。
zone "example.com" IN {
  type forward;
  forwarders { 192.168.23.134; };
  forward only;  #另一种是first,先递归,收不到正确信息在首先向根查询。#only则表示仅转发,仅进行递归查询。
};

转发类型:first only

子域的实现

子域授权(Delegation)
我们只需要在父域上声明这个子域的名字:(有一台从域名服务器)
tech.danbo.com.  IN  NS  ns1.tech.danbo.com.
tech.danbo.com.  IN  NS  ns2.tech.danbo.com.
ns1.tech.danbo.com.  IN  A  192.168.23.137
ns2.tech.danbo.com.  IN  A  192.168.23.134

然后在资源DNS服务器上创建子域:
zone "tech.danbo.com" IN {
    type master;
    file "tech.danbo.com.zone";
};

然后在tech.danbo.com.zone文件里面增加:
   IN  NS  ns
ns  IN  A  192.168.23.137(指向上层DNS服务器的IP地址)

当我们在options选项中定义了forward全局转发的时候,在下面某个域名定义中我们不做转发我们可以在zone中添加:
zone "danbo.com" IN {
    type master;
    forwarder {  };
    file "danbo.com.zone";
};

DMZ(Demilitarized Zone,非军事区)

DMZ是为了解决安装防火墙后外部网络不能访问内网服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业Web服务器、FTP服务器和论坛等。另外通过这样一个DMZ区域,更加有效地保护了内部网络,因为这种网络部署,比起一般防火墙方案,对攻击者来说又多了一道关卡。

NAT包括三种:SNAT(发出去的包),DNAT(进来的包),PNAT
当DNS服务器位于DMZ区域内的时候内网和外网访问DNS服务器就会出现问题,当我们将FQDN的A记录解析为VIP的时候那么内网访问DNS服务器的时候,请求包会先被路由到VIP的出站接口,接着又被路由到位于DMZ的DNS服务器。而当我们将A记录设为DNS的IP的时候,这有出现了问题,位于DMZ区域内的IP为私有IP,那么外网将无法访问DNS服务器。当我们FQDN记录写两个的时候一个是VIP、一个是内网IP,此时DNS会采用轮训返回IP,外网能上网然后刷新之后又无法上网。

此时我们就要用到DNS的解析切割,即将DNS数据库做切割,将内网数据和外网数据分开。

此时我们自行配置配置文件:

[root@localhost ~]# cat /var/named/lala.conf 
acl lnet {
	192.168.1.0/16;
	127.0.0.1/8;
};

options {
	directory "/var/named";
};

view internal {
	match-clients { lnet; };
	recursion yes;
	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 "named.local";
	};
	
	zone "danbo.com" IN {
		type master;
		file "danbo.com.internal";
		allow-transfer { none; };
		allow-update { none; };
	};

};

view external {
	match-clinets { any; };
	recursion no;

	zone "danbo.com" IN {
		type master;
		file "danbo.com.external";
		allow-transfer { none; };
		allow-update { none; }
	};
};

DNS压力测试

benchmark,仅仅做压力测试,而profile:则是查找DNS的瓶颈在哪儿。
bind的压力测试软件是:queryperf。