DNS 概览
权威名称服务器
一.存储并提供某区域(整个 DNS 域或 DNS 域的一部分)的实际数据。权威名称服务器的类型包括:
1. Master :包含原始区域数据。有时称作“主要”名称服务器。
2. Slave :备份服务器,通过区域传送从 Master 服务器获得的区域数据的副本。有时称作“次要”名称服务器。
非权威 / 递归名称服务器
客户端通过其查找来自权威名称服务器的数据。递归名称服务器的类型包括:
1. 仅缓存名称服务器:仅用于查找,对于非重要数据之外的任何内容都不具有权威性
DNS 查找
1. 客户端上的 Stub 解析器 将查询发送至 /etc/resolv.conf 中的名称服务器
2. 如果名称服务器对于请求的信息具有权威性,会将权威答案发送至客户端
3. 否则,如果名称服务器在其缓存中有请求的信息,则会将非权威答案发送至客户端
4. 如果缓存只能该没有信息,名称服务器将搜索权威名称服务器以查找信息,从根区域开始,按照 DNS 层次结构向下搜素,直至对于信息具有权威性的名称服务器,以此为客户端获得答案。在此情况中,名称服务器将信息传递至客户端并在自己的缓存中保留一个副本,以备以后查找。
DNS 资源记录
DNS 区域采用资源记录的形式存储信息。每条资源记录均具有一个类型,表明其保留的数据类型:
A :名称至 IPv4 地址
AAAA :名称至 IPv6 地址
CNAME :名称至”规范名称“(包含 A/AAAA 记录的另一个名称)
PTR : IPv4/IPv6 地址至名称
MX :用于名称的邮件交换器(向何处发送其电子邮件)
NS :域名的名称服务器
SOA :”授权起始“, DNS 区域的信息(管理信息)
二.个人对DNS的理解
当你在找某个服务器或者IP地址的DNS解析的时候,会首先在/etc/hosts中去查找,然后找不到合适的再去/etc/resolv.conf中寻找DNS的解析。所谓域名解析人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。 当你的网站制作完成后上传到你的虚拟主机时,你可以直接在浏览器中输入IP地址浏览你的网站,也可以输入域名查询你的网站,虽然得出的内容是一样的但是调用的过程不一样,输入IP地址是直接从主机上调用内容,输入域名是通过域名解析服务器指向对应的主机的IP地址,再从主机调用网站的内容。
示例:
dig baidu.com
dig sina.com
dig demo.example.com
dig显示来自 DNS 查找的详细信息,其中包括为什么查询失败:(通过查看status可得到以下)
NOERROR :查询成功
NXDOMAIN : DNS 服务器提示不存在这样的名称
SERVFAIL : DNS 服务器停机或 DNSSEC 响应验证失败
REFUSED : DNS 服务器拒绝回答(也许是出于访问控制原因)
dig 输出的部分内容
标题指出关于查询和答案的信息,其中包括响应状态和设置的任何特殊标记( aa 表示权威答案,等等)
QUESTION :提出实际的 DNS 查询
ANSWER :响应(如果有)
AUTHORITY :负责域 / 区域的名称服务器
ADDITIONAL :提供的其他信息,通常是关于名称服务器
底部的注释指出发送查询的递归名称服务器以及获得响应所花费的时间
使用DNS服务的时候默认开启2个端口。一个是遵从TCP,一个是遵从UDP协议的。在解析的时候用的是UDP的,因为UDP的速度快,发生数据传输的时候用的是TCP的,为了安全。
yum install bind -y
BIND 是最广泛使用的开源名称服务器。在 RHEL 中,通过 bind 软件包提供。但是,它提供的主服务是named 程序,由 named 服务脚本控制。注:防火墙开启端口 53/TCP 和 53/UDP
BIND 的主配置文件是 /etc/named.conf 。 /var/named 目录包含名称服务器所使用的其他数据文件。
安装bind,获得DNS的主配文件。
在配置文件/etc/name.conf中的语法:
//或#放在行首代表注释。或者/* */之间的内容是注释的
指令以分号结束(
文件以options块开始,其中包括控制named如何运作的指令。
options {
listen-on port 53 { 127.0.0.1; };(1)
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 { localhost; };(2)
recursion yes;
forwarders {192.168.0.253};(3)
dnssec-enable yes;(4)
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
};
(1)listen-on port 53 { 127.0.0.1; };(1)
53端口是DNS,这里53端口被那个接口监听,如果写成127,0.0.1 那么只能是本机通过你的主机自己来查DNS,如果写成localhost,那就不一样了,会把你的127.0.0.1和192.168.0.124那这两个端口对外开放,也就是和你一个网段的主机可以把你的主机当做服务器区查DNS 解析的。就像我们在实验室的时候就是通过192168.0.254当做服务器的。如我们把254当做服务器,那么我们在dig baidu.com就是将请求发给254,254替我们查找(在美国有13台顶级DNS服务器,接收到这个地址,去找.com的DNS主机),加入254执行过了dig baidu.com,那我们以254为服务器的话,dig baidu.com用的时间就很少了。
(2 allow-query { localhost; };
上面你把自己机子的接口打开了,那么你让谁通过接口把你的主机当做服务器呢,如果是localhost,那么只能自己用,如果是192.168.0.0/24;那么就允许192.168.0.0这个网段的主机通过你的主机为服务器查找DNS解析.如果192.168.0.24.只允许24链接来用你的主机当做DNS服务器。这时在24上用 nmap 192.168.0.124,扫描124这台主机就可以扫描到53端口了、
(3)forwarders {192.168.0.253};(3)
本台机子拿到服务请求就直接扔给192.168.0.253 然后与之配套的是将dnssec-enable yes;(4)改为no才能生效。
注意的是:在你修改完成之后要重启服务哦:
/etc/init.d/named restart
chkconfig named on
二.
安装yum install bind bind-client –y 之后此时你查看cat /etc/sysconfig/named在最末尾会看到给你设置的根/var/named/chroot在这里,那么你对于DNS的请求什么的都会被锁定在此目录下面。
/etc/init.d/named restart
这样在/var/named/chroot/etc 下的有关named的文件全在下面 是/etc/named下的一个映射。改动一个会在另一个文件中随之改动。

实验一: 定义自己的域名解析
(1) cd /var/named
cp -p named.localhost westos.org.zone(
加 -p保留源文件属性)
(2)
vi /etc/named.conf
或者
/etc/named.rfc......
加上:
zone “westos.org” IN  //创建主域名服务器
{
type master;//定义此区为主服务器
file "westos.org.zone";//指定区资源文件的位置。
allow-update {none; }; //意思是不允许任何人来更新
};
(3)编辑主配文件: vi /etc/named.conf
listen-on port 53 { localhost; };
注释掉或者将127.0.0.1改为 localhost
// allow-query { localhost; };
注释掉或者给某个网段。
(3)
vi /var/named/westos.org.zone
$TTL 1D
@ IN SOA @ root. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.0.122
www A 192.168.0.122

(TTL 第一行是TTL设定,生存时间记录字段。它以秒为单位定义该资源记录中的信息存放在高速缓存中的时间长度。第二行是一个 SOA 记录的设定,在这里我们看到一个特殊字符 @ ,那這个 @ 的值就以 named.conf 里的 zone .接着 SOA 后面,指定了这个区域的授权主机和管理者的信箱。接下来的 SOA 设置,是被括在“( )”之间的 5 组数字,主要作为和 slave 服务器同步 DNS 资料所使用的资料:Serial:其格式通常会是“年月日+修改次序”(但也不一定如此,您自己能够记得就行)。当 slave 要进行资料同步的时候,会比较这个号码。如果发现在这里的号码比它那边的数值“大”,就进行更新,否则忽略。不过设 serial 有一个地方您要留意:不能超过 10 位数字!Refresh:这里是是告诉 slave 要隔多久要进行资料同步(是否同步要看 Serial 的比较结果Retry:如果 slave 在进行更新失败后,要隔多久再进行重试。Expire:这是记录逾期时间:当 slave 一直未能成功与 master 取得联系,那到这里就放弃 retry,同时这里的资料也将标识为过期。Minimum:这是最小默认 TTL 值,如果您在前面没有用“$TTL”来定义,就会以此值为准A记录标明了IP地址和域名之间的对应关系)
(4)vi /etc/resolv.conf
nameserver 192.168.0.122
(5)/etc/init.d/named restart
rndc reload
测试:
dig www.westos.org
当有 NOERROR并且有QUESTION 和 ANSWER 的时候为正确的。
并且解析到 : 192.168.0.122
实验二:
反向解析:( 域名反向解析即从IP地址到域名的映射。由于在域名系统中,一个IP地址可以对应多个域名,因此从IP出发去找域名,理论上应该遍历整个域名树,但这在Internet上是不现实的。为了完成逆向域名解析,系统提供一个特别域,该特别域称为逆向解析域。)
(1)vi /etc/named.rcf......
zone "0.168.192.in-addr.arpa" IN {
type master;
file "westos.org.local";
allow-update { none; };
};
(2)cd /var/named
cp -p named.loopback westos.org.local
(3)vi westos.org.local
$TTL 1D
@ IN SOA @ root. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.0.122
122 PTR westos.org
122 PTR www.westos.org
(4)/etc/init.d/named restart
rndc reload
(5)测试:
dig -x 192.168.0.122
这里反向解析是通过IP地址得到域名,而正向解析是通过域名(westos)得到IP地址当有 NOERROR并且有QUESTION 和 ANSWER 的时候为正确的。
并且解析到 : westos.org
www.westos.org
实验三:
辅助dns(注意iptables 要是关闭的 selinux也是关闭的,之前犯错是因为iptables是开着的。
加入192.168.0.122是主DNS服务器,192.168.0.238是辅助的DNS服务器,这里的意思是允许只要主的DNS服务改动,随着辅助额DNS也改变。
(1)在192.168.0.122上:
yum install bind bind-client -y
vi /etc/resolv.conf

nameserver 192.168.0.140

vi /etc/named.conf
also-notify { 192.168.0.238; };//意思是允许192.168.0.238进行来和这个主DNS服务器上的设置同步。192.168.0.122上只要有变化就会通知给192.168.0.238
vi /etc/named.rfc....
加上:zone "westos.org" IN
{ type master;
file "westos.org.zone";
allow-transfer { 192.168.0.238; };//允许复制。
};
注意: listen-on port 53 { localhost; };
注释掉或者将127.0.0.1改为 localhost
// allow-query { localhost; };
(2) 在192.168.0.238上:

vi  /etc/resolv.conf                                                                           nameserver 192.168.0.140

yum install bind bind-client -y
zone "westos.org" IN {
type slave;
masters { 192.168.0.122; };
file "slaves/westos.org.zone";
//指定DNS的位置,这样主次DNS修改会通知辅助DNS服务器
};
vi /etc/named.conf
注意: listen-on port 53 { localhost; };
注释掉或者将127.0.0.1改为 localhost
// allow-query { localhost; };
(3)
此时: 在两台主机上 /etc/named restart
会在辅助DNS服务器上即 :192.168.0.238上: /var/named/slaves会出现 westos.org.zone和主服务器一样的。
测试:两者机子上
dig www.westos.org
(4)
在主服务器上
vi /var/named/westos.org.zone
修改serial的值
$TTL 1D
@ IN SOA @ root. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.0.122
www A 192.168.0.123
www A 192.168.0.124
(4)/etc/init.d/named restart
rndc reload
这样双方的文件都会同步了。
测试:两者机子上
dig www.westos.org
可以看到变化。
实验四:
允许远程修改你的DNS:
在 server22.example.com(ip:192.168.0.122)
(1)vi /etc/named.rfc....
加上:zone "westos.org" IN
{ type master;
file "westos.org.zone";
allow-transfer { 192.168.0.238; };//允许复制。
allow-update { 192.168.0.22;};//意思是允许192.168.0.122这个地址修改DNS
};
chmod 777 /var/named/westos.org.zone -P(最好所有的目录都有写的权限,否则报错> send
update failed: SERVFAIL

getsebool -a | grep named
setsebool -P ...... on
(2)在 desktop22主机上:(要想拥有nsupdate这个命令,你需要安装yum install bind-utils  -y这个包)
nsupdate
server 192.168.0.122
zone westos.org
update add www.westos.org 2292 A 192.168.0.222
(2292是缓存的大小,192.168.0.222是随便加的)
send
(3)在两台机子上:
etc/init.d/named restart
rndc reload
dig www.westos.org
可看到效果,但是并没有写进文件中。