1.named.conf的配置项
该文件的三种注释方式:
//这是注释
/这是注释/
#这是注释
directory “/var/named/”; 表示存放zone文件的目录
rrset-order { order cyclic; }; 指定一个名字有多条记录时(例如www.test.com有3个A记录),这些记录的调度策略。cyclic是轮询调度,random是随机调度,默认是random。
auth-nxdomain yes; 表示NXDOMAIN的应答中总是带AA标记。这个有什么用?
query-source address 10.0.120.36 port 10000;
dns服务器默认使用随机的地址和端口到权威服务器进行查询或者到主服务器下载zone。这个就是配置查询时的源地址端口,只限于UDP。
sortlist:
sortlist{10.0.3.0/24;{192.168.0.0/24;192.168.1.0/24;}};
表示对位于10.0.3.0/24网段的客户端的应答进行排序,后面的就是排序方式。例如域名www.test.com当前有三条A记录,192.168.0.100,192.168.1.100,192.168.2.100,则应答报文里面的顺序为
192.168.0.100
192.168.1.100
192.168.2.100
如果不指定后面的顺序(即sortlist{10.0.3.0/24;};),则应答时,把和客户端网段近的地址排在前面。
还可以指定对多个网段的客户端的应答进行排序,例如:sortlist{10.0.3.0/24;10.0.2.0/24};。
allow-recursion:
allow-recursion{10.0.3.0/24;};
表示对10.0.3.0/24地址段的请求允许递归查询,其他地址不进行递归查询。
blackhole:
blackhole {10.0.3.0/24;};
表示不处理这个网段发来的请求,也不向这个网段的服务器发送查询,这个是很有用的,例如知道了某个dns服务器是个诈骗服务器,则可以把那个地址配置到这个列表里面,这样本地服务器就不会向这个服务器进行查询。
recursive-clients:
recursive-clients 1000;
表示同时处理1000个递归查询(+转发查询)请求。也就是说例如当前服务器正在向外递归1000个请求,第1001个请求没有在zone和缓存中找到,则此时客户端会查询失败。
tcp-clients:
tcp-clients 100;
表示同时处理100个TCP查询请求。
cleaning-interval:
cleaning-interval 100;
表示每个100分钟清理dns服务器缓存中的过期内容(根据记录的ttl判断是否过期),如果配置为0则永不清除。注意这个单位是分钟。
interface-interval:
interface-interval 60;
表示每个60分钟检查一次当前设备的网络接口,例如接口down掉了或者变为up,则程序检查到会进行相应处理。注意这个单位是分钟。
max-ncache-ttl:
max-ncache-ttl 10800;
表示否定缓存的最大ttl,这个只对服务器缓存中的记录有效,如果当前服务器是某个域的权威服务器,则对这个域的否定缓存用的是zone里面的值。
max-cache-ttl:
max-cache-ttl 604800;
表示正常缓存的最大ttl,也是只对缓存中的记录有效。
lame-ttl:
lame-ttl 600;
lame服务器的缓存时间,即如果一个server被标记为lame后,在600秒内不会对这个服务器进行查询。设置为0表示不缓存lame服务器,最大值为1800秒(不对这个服务器进行查询)。
首先dns服务器迭代得到了都是权威服务器,所以lame服务器肯定也是一个权威服务器。所谓lame服务器就是收到了这个权威服务器的错误响应。
所谓的错误响应就是这个服务器回复的权威部分填的有问题,例如这个服务器是test.com域的权威服务器,但是响应的权威部分写了abc.other.com IN ns ns.abc.other.com这种错误响应。
allow-transfer {any;}; 表示允许任何地址从主ns下载zone文件,主从dns上都可以配置,因为从服务器也可以作为另一个从服务器的主服务器。
allow-update {any;}; 表示允许任何地址向主ns提交动态更新,因为是通过命令行更新的,所以发送命令的服务器不需要运行dns服务器,只能在主dns服务器配置。
allow-notify {none;}; 表示允许除了master之外的服务器向该从服务器发送notify消息,注意是master之外,slave肯定是允许接收master的notify消息的,只能配置到从服务器上。
also-notify {none;}; 如果某个权威服务器没有写到主服务器的zone文件中,则可以在此处指定其他的从权威服务器,给这些服务器发送notify消息。
另外就是bind 8的从服务器更新完zone之后不会向zone里面的其他权威服务器发送notify,所以需要使用这个命令配置需要接收从服务器notify消息的服务器地址。
allow-update-forwarding {192.168.0.1;}; 在从服务器上配置,表示把192.168.0.1发来的动态更新转发给主服务器,这时候主服务器要把。
ixfr-from-differences yes; 默认为no,表示手动编辑zone文件后进行rndc reload test.com后主服务器会给从服务器发送全量文件,而配置为yes则主服务器给从服务发送增量文件。
forward first; first表示首先进行转发查询,如果短时间没有收到响应,则进行迭代查询。only表示只进行转发查询,就算没响应也不进行迭代。
2.zone配置项
$TTL:表示没有明确指定的记录的默认的TTL值。
@符号:@就时named.conf中配置的zone的名称。例如在named.conf中配置了zone “test.com”,则@就等于test.com.。
CNAME记录:
例如:www.test.com. IN CNAME ccc.test.com.
此时,www.test.com.被称作别名,ccc.test.com.被称作规范名。zone文件中,别名不能出现在记录的右侧,例如aaa.test.com IN CNAME www.test.com 这样就是错误的。
同域内的CNAME记录(例如www.test.com. IN CNAME www.test1.com.这种属于跨域CNAME),意义好像不是很大。
SOA:
复制代码
$ORIGIN .
T
T
L
86400
;
指
定
该
语
句
之
后
(
下
一
个
TTL 86400 ;指定该语句之后(下一个
TTL86400;指定该语句之后(下一个TTL语句之前)所有未明确指定TTL值的记录的默认TTL值
;以下是SOA记录,注意当前的ORIGIN是.,所以下面的test.com就等于test.com.
test.com IN SOA ns.test.com. admin.test.com. ( ;ns.test.com.是主权威服务器,admin.test.com.是邮箱地址(第一个.表示@)
104 ; serial ;序列号,每次更改zone文件时要增加序列号
50000 ; refresh (13 hours 53 minutes 20 seconds) ;从服务器检查本地zone是否有更新(向主服务器发送SOA请求)的间隔时间
2 ; retry (2 seconds) ;检查的重试时间,就是发送SOA后没有收到响应,再次发送的时间间隔
5d ; expire (5 days) ;过期时间,意思是如果在这个时间内没有联系到主服务器,则这个zone就过期了,过期后则不再响应对这个zone的查询。这个项和上面两个项没有任何关系。
1 ; minimum (1 second) ;否定缓存的TTL,上面的$TTL是正常的TTL,这里是否定TTL。
) ;SOA记录结尾
NS ns.test.com. ;test.com区域的ns在主机ns.test.com.上
NS ns1.test.com. ;test.com区域的ns在主机ns1.test.com.上
$ORIGIN test.com.
a A 1.1.1.1
b A 1.1.1.6
ns A 10.0.120.192
ns1 A 10.0.110.134
other NS ns.other
$ORIGIN other.test.com.
ns A 10.10.10.10
$ORIGIN test.com.
w A 3.3.3.1
A 3.3.3.2
A 3.3.3.3
复制代码
3.hint文件(named.ca文件)
首先,hint是“提示”的意思,这个文件也就是root提示文件。bind9启动后,把这个文件读到内存,称作root提示,一定要注意这个root提示并不是普通的缓存数据,而是存到内存中作为固定不变的数据。这个文件的记录有TTL值,但是程序在TTL超时后并不会删除这些记录,所以TTL值没什么用。
root提示的作用:程序向root提示里面的某个ns服务器请求根的ns列表,收到响应后把得到的根ns列表存到缓存中(这个才是普通的缓存信息),当程序启动后解析第一个域名时可以抓包看到向某个ns(hint列表里面的ns)请求根的ns列表。
理论该提示文件写的就是根的ns列表啊,直接复制到缓存中不行了,为什么还要再请求一次?这是因为该文件可能已经过时(毕竟是本地文件,肯定不如立刻获取得到的新),但是从root提示里面的ns服务器得到的根ns列表肯定是最新的。
总结,hint文件这个名字起的很精确。
3.基本概念
[1]域和区域:除去已经授权出去的子域所包含的域名,一个区域所包含的域名和同名域所包含的域名一样,因此区域也包含了未被授权出去的子域的域名和数据。
例如对于test.com:
test.com域就等于包括所有的以test.com结尾的数据。
test.com区域就是test.com权威服务器zone文件里面的内容,该区域不包括已经授权出去的子域数据(例如子域abc里面的数据)。
abc.test.com域就等于包括所有的以abc.test.com结尾的数据。
abc.test.com区域就是abc.test.com权威服务器zone文件里面的内容,该区域不包括已经授权出去的子域。
总结,test.com域、abc.test.com域表示一个递归范围,区域就是权威服务器zone文件里面的内容数据。
[2]顶级域、二级域:顶级域也就是一级域,顶级域是root的子域,也就是说com、cn等域是顶级域,test.com、test.cn是二级域。
[3]区域(zone)传输:主权威服务器从本地文件读取区域数据,从权威服务器从主权威服务器下载区域数据,这个就是区域传输。
3.解析
解析分为递归解析和迭代解析,迭代解析也就是非递归解析,目前,local DNS向外面发送的查询,都是迭代请求,即请求报文中没有设置递归标记。
另外local DNS发送的查询域名和请求的域名是一样的,例如:客户端向local DNS请求www.test.com.,则local DNS向外面(已知的最接近的ns)发送查询时的请求域名也是www.test.com。理论上local DNS发送的是迭代查询,应该是先向根请求com域的ns地址,再向com域请求test.com域的ns地址,最后向test.com域请求www.test.com的A记录才对。但是并没有这样,因为test.com并不一定有ns,或者com的ns直接就知道原请求域名的结果(例如直接在com的ns的zone配置一条记录www.test.com IN A 1.1.1.1)。
另外local DNS会有很多可选的权威服务器,例如当前服务器知道根服务器有13个地址,test.com域的ns有4个地址,则向哪个服务器发送请求?这个是根据上一次查询往返时间来判断的,向上一次往返时间最小的ns发送查询。
3.DNS notify消息
notify表示zone变更通知,正常情况下,从服务器每隔refresh时间向主服务器发送SOA请求,之后主服务器回给从服务器SOA响应,从服务器比较SOA响应里面的序列号来判断是否进行本地zone更新。但是这种方式当主服务器变更时,只能等待间隔时间到了,从服务器才能根据下载到的SOA数据(序列号大于本地序列号)更新自己的zone文件。因此有了notify消息,工作流程如下:
主服务器发现自己的zone的序列号发生改变时(包括重启进程、rndc reload test.com、收到动态更新),便向zone里面的所有的从服务器(zone文件中的所有的ns记录)发送一条notify消息,从服务收到后会给主服务器发送一个响应(相当于ack)。随后,从服务器便启动正常的SOA查询流程(这个notify消息相当于立刻达到refresh间隔一样)。
另外,从服务器完成了zone传输时候,还会向zone中其他的从权威服务器发送notify消息(注意不给自己的主服务器发送),这么做的目的是,某些从服务器可能无法和主服务器直接通信。这个流程8.2.3之后的版本才有,之前的版本需要额外配置。
要注意的是,只有收到了主服务器或者allow-notify配置的地址的notify消息才会信任,其他地方发来的会打印refused notify from non-master: 10.0.120.192#62278。因此从服务器收到了其他从服务器发来的notify消息会忽略掉。
以下是修改了主服务器zone序列号后,执行rndc reload test.com命令后的传输报文,主(10.0.120.192),从(10.0.110.134):
3.DNS动态更新
动态更新,是更新主权威服务器zone里面的记录,所以不属于权威zone的域名是不会更新的。
动态更新的流程:客户端向权威服务器发送消息,让权威服务器更新zone文件内容,例如增加删除修改某条记录。这里的权威服务器可以是主的也可以是从的,如果是从服务器,则从服务器会转发给自己的主服务器,最后由主权威服务器完成更新。更新完后主服务器notify给自己的从服务器,及后面的流程(上面说明的)。
主服务器收到动态更新数据后,当前序列号加1,并且会在目录新加一个.jnl文件,当前的zone文件并不会改变(里面的序列号也不会变)。这个意思就是说当前的zone有两个文件,程序加载时会顺序加载这两个文件,所以直接修改原来的文件内容可能会导致zone加载失败,例如修改原文件的序列号。
动态更新可以使用bind自带的客户端工具来完成,以下是在命令行执行的步骤:
[root@localhost ~]# nsupdate
server 10.0.120.192
update add dy.test.com 86400 A 3.3.3.3
send
send
另外,一个zone配置了动态更新地址时(使用allow-update 配置),则此时手动编辑zone文件后,执行rndc reload test.com,则会报错:rndc: ‘reload’ failed: dynamic zone,所以手动编辑完zone后可以如下操作:
[root@localhost named]# rndc freeze test.com
[root@localhost named]# rndc reload test.com
zone reload queued
[root@localhost named]# rndc thaw test.com
The zone reload and thaw was successful.
4.IXFR
从服务器向主服务器发送SOA请求(这个SOA请求和普通的请求报文一样,只不过请求类型是SOA),收到响应后,比较里面的序列号是否大于本地的序列号,如果大于,则向主服务器发送IXFR请求,主服务器收到请求后,检查本地是否有两个序列号的变更的记录,如果有则发送两个序列号之间的差异部分,如果没有则发送完整的zone数据。
进行动态更新的数据,主服务器会有序列号更新的记录信息,发送增量传送数据。
而手动编辑zone文件后执行rndc reload test.com,则主服务器会发送完整的zone信息,此时主服务器会打印日志:AXFR-style IXFR started,如果此时也想让主服务器发送增量数据,则需要配置选项:ixfr-from-differences yes;。
另外说一下AXFR:从服务器启动的时候,如果本地没有zone文件,则会向主服务器发送AXFR请求。
5.转发器
forward only和forward first在配置项已经说明。
forward会转发以配置的域名结尾的所有请求,例如:
zone “test.com” { //表示对test.com结尾的所有域名进行转发查询
type forward;
forward only;
forwarders {192.168.0.1;};
};
如果在options里面配置了转发,则会转发所有的域名请求,而如果此时想对某个域不进行转发,则配置如下:
复制代码
options {
forward only;
forwarders {192.168.0.1;}; //对所有的域名进行转发查询
};
zone “test.com” {
type master;
file test.com.zone;
forwarders {}; //表示对test.com不进行转发查询
};
复制代码
如果转发器里面配置了多个地址,则会选择向上一次往返时间最小的地址发送查询,所以和地址里面的配置顺序无关,如果配置了某个地址两次也不会向这个地址查询两次。
最后要注意的是,在named.conf(使用zone “test.com”{ })配置了某个域的转发,此时当前服务器并不是该域的权威服务器,只是表示对以这个域名结尾的域名进行转发查询。
6.视图
视图比较简单,只是有一点注意,视图在named.conf中是有先后顺序的,匹配上某个view之后,便停止后面的view匹配。例如最前面的view接收所有用户的请求,则后面的view相当于就不生效了。
7.rndc配置
首先使用rndc-confgen >/etc/rndc.key生成key文件(如下),之后把里面的部分内容复制到named.conf文件中,则就可以使用rndc命令了。
rndc命令可以在另外一台客户端使用,方法就是把服务器的rndc.key文件复制到客户端,然后在客户端执行:rndc -s 10.0.120.192 -p 953 -k rndc.key status
复制代码
以下表示key数据,这个数据是给rndc命令使用的
Start of rndc.conf
key “rndc-key” {
algorithm hmac-md5;
secret “xskrjwyK0MzW0UHQdqoiKg==”;
};
options {
default-key “rndc-key”;
default-server 127.0.0.1;
default-port 953;
};
End of rndc.conf
以下内容需要手动复制到named.conf文件中供named程序使用,如果不复制,则named程序也会使用下面的默认配置,key则默认使用/etc/rndc.key
Use with the following in named.conf, adjusting the allow list as needed:
key “rndc-key” {
algorithm hmac-md5;
secret “xskrjwyK0MzW0UHQdqoiKg==”;
};
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { “rndc-key”; };
};
End of named.conf
复制代码
几个说明的地方:
[1]secret 后面的字符串就是明文密码,执行rndc命令时,客户端和服务器之间的通信需要使用这个密码对消息进行加密处理(hmac-md5)。
[2]algorithm 表示rndc命令消息传输时的加密算法。
[3]rndc.key中的options语句因为是给rndc命令使用的,所以配置了option,则执行rndc命令时可以省略-s -p参数。
[4]平时使用的时候,只要执行了rndc-confgen >/etc/rndc.key之后,便可以在本机使用rndc命令了,这是因为不配置controls和keys语句的时候,named程序会默认配置。
3.配置示例
[1]主从服务器配置:
主ns域名:ns1.test.com
从ns域名:ns2.test.com和ns.abc.com
sub1.test.com子域的ns域名:ns1.sub1.test.com
sub2.test.com子域的ns域名:ns.abc.com
ns1.test.com的地址192.168.0.1
ns2.test.com的地址192.168.0.2、192.168.0.3
下面配置test.com的主ns的named.conf和zone文件:
复制代码
zone “test.com” IN {
type master;
file “com.zone”;
allow-transfer {any;}; //表示允许任何地址从主ns下载zone文件
allow-update {any;}; //表示允许任何地址向主ns提交动态更新,这个地址不一定需要运行dns服务器
};
$ORIGIN test.com. //$ORIGIN表示域的起始,表示以下的主机都是该域的记录,ns就表示ns.test.com.
$TTL 1D
@ IN SOA ns1.test.com. admin.test.com. ( //ns1.sample.com.表示该域的主ns服务器,admin.sample2.com.就是一个邮箱地址等价于admin@sample2.com.
2017072812 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns1
@ IN NS ns2
@ IN NS ns.abc.com. //这个ns.abc.com不属于当前域,所以不能指定这个ns的A记录
ns1 IN A 192.168.0.1 //ns1和ns2必须列出它们的A记录
ns2 IN A 192.168.0.2
ns2 IN A 192.168.0.3 //一个ns域名对应多个A记录
big IN A 6.6.6.6
$ORIGIN sub1.test.com. //$ORIGIN表示域的起始,表示以下的主机都是该域的记录,ns就表示ns.sub1.test.com.
@ IN NS ns1 //ns1即ns1.sub1.test.com.,此处也就是子域授权配置方式
ns1 IN A 10.10.10.10 //必须指定该ns的A记录,这条记录也叫做GLUE记录
ns1 IN A 11.11.11.11 //多个A记录也是可以的
sub2 IN NS ns.sub2.abc.com. //跨域授权,不能指定该ns的A记录,此时ns.sub2.abc.com.应该配置一个sub2.test.com.的zone文件。
复制代码
8.主从服务器
主服务器从本地文件读取区域数据,从服务器从服务器下载区域数据,这个是区域传输。
从服务器启动时,首先加载本地的zone文件(这些文件正常应该是从主服务器下载得到的),然后再向主服务器请求SOA,比较本地zone是否是最新的,如果不是则向主服务器下载最新的zone数据。
9.相关问题
[1]invalid command from 10.0.120.35#56644: expired
这表示两台设备的系统时间不一致,在另外一台设备执行rndc -s 10.0.120.192 -p 956 -k /etc/rndc.key status时可能会遇到这种情况。
1.主域名服务器、辅域名服务器、子域授权
每个zone可以有一个primary server和多个slave server。所有的这些ns服务器(主ns和辅ns)都应该注册到上级域的ns服务器中,同时这些ns服务器也要列到本地的zone文件中,当然也可以写列出没有在上级注册的ns服务器。所有列出的ns服务器都是这个域的权威服务器,在local DNS看来并没有主辅之分。另外一般情况只要配置主ns服务器就可以,然后辅ns从主ns自动下载zone文件。
子域授权是DNS的最基础的配置流程,LOCAL DNS解析的流程就是根据子域授权迭代解析的流程,在com域注册test.com的意思就是让com域把test.com域授权给自己解析。
所谓子域授权就是把当前域的子域添加一条ns记录,意思是让指定的ns作为子域的权威服务器。
2.一些问题
[1]响应标记中什么时候设置AA标记?
当前服务器是请求域名的权威服务器时,设置AA标记。如果域名为当前域的子域时,响应子域授权信息,这个响应是不带AA标记的,因为子域才是该域名的权威服务器。
但是看到有些服务器响应的子域授权信息时,也会带AA标记,可能是不同服务器的原因,不过对于local DNS来说,这些授权信息都是可信的(因为当前的ns是从上级ns得到的)。
[2]如何理解ANSWER SECTION、AUTHORITY SECTION、ADDITIONAL SECTION?
ANSWER SECTION就是对请求的应答,这个应答有可能不完整(这时候填入已知的最精确的应答)。例如向test.com的权威域请求www.test.com,但是可能回复一个www.test.com IN CNAME www.test.com.cdn.com,这个应答是带AA标记的。
AUTHORITY SECTION表示请求的域名的权威信息。
ADDITIONAL SECTION表示附加信息,保存glue记录,这个glue记录很重要。
[3]各个部分的应答记录,local DNS是否信任?
不管哪个部分的应答,local DNS只信任属于该域的记录,不属于该域的记录则忽略。例如:
[4]glue记录?
sub1.test.com. IN NS ns.sub1.test.com.
ns.sub1.test.com. IN A 10.10.10.10 //这行就是glue记录,是必须指定的
sub2.test.com. IN NS ns.test1.com.
;ns.test1.com. IN A 20.20.20.20 //这行不能指定,因为这行的记录需要在com域中指定
glue记录位于应答报文的ADDITIONAL SECTION中。
一个域的子域的glue记录是必须要指定的,因为ns是它的子域里面的域名,不配置glue记录的话,解析过程便会陷入死循环。
[5]zone里面的当前域的ns记录有什么用,local DNS迭代解析时ns记录和ns记录的A记录都是从上级域得到的(位于应答的权威部分),那当前zone里面还要写一堆ns记录和ns记录的A记录干什么?
虽然权威ns里面的ns记录才是local DNS迭代时最可信的,但是这些ns记录和ns记录的A记录只能通过从上级的授权应答中获取(只有注册到上级域中的ns记录才能让local DNS得到)。所以zone里面的ns记录在普通的local DNS迭代过程中用不到。
所以这些ns记录只用作其他用途,例如就是用来说明当前域的ns信息。
不过根的ns里面的ns记录是有用的,因为程序启动时会向根的ns请求根的ns记录,来更新本地的根ns记录。
[6]named.ca文件有什么用?
bind9程序启动时,首先便要获取根的ns记录(是一个域名)和该ns记录的A记录,但是根已经是最顶了,所以只能从根的ns主机中获取根的ns记录,这便死锁了,因此在named.conf应该指定hint zone,不指定时程序中有固定的字符串(和name.ca内容一样)。
另外还可以看到程序迭代解析时,向根的ns(这个是从本地文件获取的)请求了根的ns记录,这一步只是用来更新程序中的根ns记录(因为本地文件或者固定字符串的记录可能已经过期)。
[7]如何更准确地理解ns记录?
对比普通域名,例如www.test.com,这个域名的功能是从这个域名(对应n个主机)获取内容,因此得到这个域名的A记录的目的就是从这个域名获取数据内容。
ns记录也是一个域名,例如ns.test.com,只不过这个域名(对应n个主机)的功能是解析其他的域名,因此得到这个域名的A记录的目的就是从这个域名解析其他的域名。
不过ns的域名通常一个域名对应一个主机,其实一个ns域名对应多个主机也是可以的。理解了ns记录是一个域名后,也就是明白了ns记录可以跨域(上面的例子已经提到),只是跨域时不能指定该ns记录的A记录了。
一般注册某个域名时,把NS记录设置为某个网站的域名,这意思就是让这个网站的域名(ns域名)来解析自己的域名。
[8]是否可以把当前域授权出去?
当前域的基本信息在SOA中说明,SOA中记录了该域的主ns域名,其他的ns都是辅助ns,所以当前域的多个权威ns之间是主辅关系,不存在授权这一说。另外只有在上级ns中注册的ns才能被local DNS得到。
也就是说在zone文件中写入的@ IN NS ns1.test.com.等这些记录只是说明(在local DNS迭代的过程中用不到)了该域的ns记录。
[9]CDN需要有自己的域名吗?
所谓的CNAME就是说,当前域名的实际名字是CNAME记录,需要让local DNS重新解析这个CNAME记录,从而让local DNS从头迭代到去另一个权威ns(也就是cdn的ns)中请求。所以当然要自己注册一个域名。
如果是子域授权的方式,就是指定了一个ns记录(cdn的ns域名),这时候local DNS得到这个ns记录后,也要从头迭代得到这个ns的A记录,所以也需要有自己注册的域名。
3.CDN配置方式
例如:权威域为test.com,cdn的权威域为cdn.com。
首先可以使用子域授权方式,例如解析sub.test.com域名,具体流程就是:
1.local DNS通过迭代给test.com的ns发送sub.test.com请求,test.com的ns响应一个授权的NS记录(sub.test.com IN NS ns.cdn.com),这时候并没有这个NS记录的A记录。
2.local DNS继续向com域请求ns.cdn.com的A记录,com域给local DNS响应cdn.com的ns记录(cdn.com IN NS ns.cdn.com)和这个NS的A记录(位于ADDITIONAL SECTION)。
3.local DNS向ns.cdn.com请求sub.test.com,最终收到该权威ns发送的最终结果(带AA标记)。
这里有一个注意的地方,第2步,向com域请求ns.cdn.com的A记录,理论得到cd.com的ns后向这个ns请求ns.cdn.com的A记录,但是com域返回的授权信息中已经有了这个ns的A记录。
更多的是使用CNAME方式,例如解析www.test.com域名,具体流程就是:
1.local DNS通过迭代给test.com的ns发送www.test.com请求,test.com的ns响应一个CNAME记录(这个时候test.com可能缓存了这个cname之后的A记录而一并回给local DNS,但是local DNS发现cname后的域名www.test.com.cdn.com不属于当前的test.com域,因此会忽略这些记录,这个时候响应里面也带AA标记,因为响应的CNAME记录确实是权威域的记录)。
2.local DNS继续向com域请求cdn.com的A记录,com域给local DNS响应这个域名的A记录,即cdn.com的ns记录的A记录。
3.local DNS向cdn.com的ns请求www.test.com.cdn.com,最终收到该权威ns发送的最终结果(带AA标记)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DNS文档:https://www.isc.org/community/rfcs/dns/
recursion yes|no; 开关关闭时,只能响应本地zone记录,如果需要从外部查询则会返回失败。即关闭此开关表示dns服务器不提供迭代或者递归(forward)查询。
- view
视图语句的顺序是很重要的,一位用户的请求将会在它所匹配的第一个视图中被解答 。
如果在配置文件中没有 view 语句,在 IN 类中就会自动产生一个默认视图匹配于任何用户,任何指定在配置文件的最高级的 zone 语句被看作是此默认视图的一部分。如果存在外部 view 语句,所有的域视图必须会在 view 语句内部产生。
这就说明,如果配置了view语句,则此时不会生成默认view,此时如果客户端没有匹配到任何view,则会收到refuse响应。
常规的named.conf中会配置hint类型的zone,如果没有配置时会使用程序中默认的配置。因此如果配置了view,每个view中也可以选择配置或者不配置这个zone。
zone “.” IN {
type hint;
file “named.ca”;
};
转自:https://www.cnblogs.com/iamwho/p/11422244.html