一、DNS原理
DNS是为了解决人类记忆IP的困难而出现的。
DNS是个树状分层授权的结构。以根域 "." 为起点,下面是顶级域 (top level domain, TLD),
顶级域下面是二级域名...
这种分层授权类似于各级行政机构。负责根域的服务器只记录和解析顶级域的名称,负责顶级域的服务器记录和解析旗下的二级域名……。
举个例子,一台PC 机 A要解析 www.abc.net 的名称,它将该请求发送给其DNS服务器B,B 首先检查该名称的域 abc.net 是否由其负责,
如果由其负责,则检查解析文件并应答
如果不是由其负责的,则先检查缓存中是否已有答案(当然是未过期的)
如果有,则将此答案返回给A
如果没有
如果B就是负责net域的DNS服务器,则根据区域解析文件找到负责abc.net 的DNS服务器,然后向其请求www.abc.net的A记录
如果B不是负责net域的DNS服务器
检查缓存中是否有abc.net域的NS记录,
如果有,则根据该记录向负责解析 abc.net 的服务器发送 针对www.abc.net 的查询请求
如果没有,检查缓存中是否有net域的NS记录
如果有,根据缓存的记录向负责net域的DNS服务器请求请求www.abc.net的A记录,而负责net域的DNS服务器则会返回 abc.net 的NS记录
如果没有,根据 "." 域的解析文件向其中一个负责根域的DNS服务器发送针对www.abc.net 的查询请求,负责根域的DNS服务器返回负责net域的DNS服务器的IP
二、DNS 配置
主配置文件 /etc/named.conf (该配置文件会包含/etc/named.rfc1912.zones,/etc/named.root.key)
options 段定义全局的缺省的配置,(在各个区域(zone)中可以被覆盖?)
主配置文件和区域配置文件均采用C语言风格的注释
分号作为结尾
花括号中的内容与花括号中需有空格,花括号内部也需以分号表示结束
重要选项介绍:
listen-on port 53 { 127.0.0.1; };
// 设置监听的IPv4地址和端口,缺省只监听本地lo口。需修改才能接受客户端的查询。如果不设置IP地址,则表示监听所有地址
listen-on-v6 port 53 { ::1; };
// 设置监听的IPv6地址和端口
directory "/var/named"; //指定named进程的工作目录,配置文件中使用的相对路径名都是相对于这里指定的目录的
allow-query { localhost; };
//接受哪些客户端的查询,针对实际需要修改
recursion yes;
//是否接受递归查询
forward only;
//只转发查询,不替客户端进行迭代查询,用于缓存DNS服务器。当缓存中没有要查询的结果时,自己作为客户端向下面设置的 forwarders 发送递归查询请求,得到结果后返回给客户机并缓存
forwarders { IP1;IP2; };
//设置将查询转发给谁
allow-transfer { SLAVE_IP; };
//设置允许那些IP可以连接过来进行区域传送,可针对zone进行设置
notify yes|no;
//区解析文件修改时主服务器是否通知从服务器,注意从服务器需在区域解析文件中列出来
zone定义:
zone "." IN { type hint; file "named.ca"; };
这里定义根域,仅转发的DNS服务器不需要。
include "/etc/named.rfc1912.zones";
//包含文件,这个文件通常用于定义其它的zone
区(zone解析文件
在DNS服务器中,域名和IP的映射关系都记录在区域配置文件中,除了$TTL和 $ORIGIN 之外,区域配置文件主要由 SOA,NS,A,CNAME,PTR,MX 等资源记录(RR)组成。
$TTL 设定缓存的肯定回答的存活时间,而 minimum-TTL 指定缓存的否定回答的存活时间。如果没有后缀,缺省的时间单位是秒。
$ORIGIN 配置指令用于设置域名,如果区配置文件中未使用 "$ORIGIN DomainName" 定义域名,则 named 会将 named.conf 中 "zone DomainName" 中定义的名字作为缺省的域名。在任何资源记录中,定义的主机名如果不是规范域名(即不是以 . 结尾,则named会将域名附加到主机名的后面,形成FQDN),注意在主配置文件中域名可以不以 . 结尾,但在区域配置文件中,没有以 . 结尾的都会被附加域名
expire 参数用于指定从服务器在联系不到主服务器的情况下区记录的副本的权威性的持续时间长短。
解析文件中不需要以分号表示结束,但若需要行尾注释,则需在注释前加分号
SOA 记录中5个值如果需要跨行,可在圆括号内换行
区域解析文件范例:
$TTL 1D $ORIGIN abc.net. @ IN SOA ns1.abc.net. admin.gmail.com ( ;注意左圆括号必须和SOA在同一行 2013081401 ; serial,每次修改必须增大该序列号,否则从服务会认为该文件没有更新 1D ; refresh, 隔多久从服务器会检查该文件是否更新 1H ; retry, 当连接主服务器出现问题时,从服务尝试重新连接的间隔 1W ; expire,指定从服务器在联系不到主服务器的情况下区记录的副本的权威性的持续时间长短 3H ) ; minimum, 否定回答的缓存时间。 IN NS ns1.abc.net. ns1.abc.net. IN A 192.168.9.11 www.abc.net IN A 192.168.9.13
@表示当前域名,即$ORIGIN 指定的值,$ORIGIN 在一个配置文件中可以使用多次
区域解析文件中分号不是必须的,但可以用分号表示结束,其后跟注释
所有时间单位缺省是 s(秒)
每个记录的第二个字段指定TTL,但可以被省略,省略则使用 $TTL 指定的值
第一个字段为空则其值和上一行第一个字段相同
三、缓存DNS服务器
所谓缓存服务器是指本身没有区数据文件(除localhost之类的),不负责维护任何区域的域名解析工作的DNS服务器。
缓存服务器会代替客户端向其它域名服务器发出查询请求,并将请求结果缓存起来,在缓存未过期之前,有客户端请求解析同样的名称时,便将缓存中的结果返回给客户机。如此可以加快对客户机的相应速度,节省流量,也可用于控制客户机对互联网的访问
配置缓存服务器的要点在于
recursion yes; forward ( first | only ); forwarders [ port integer ] { ( ipv4_address | ipv6_address ) [ port integer ]; ... };
如果是 forward only 的缓存服务器,连 .的 hint文件都不需要
四、主服务器
主服务器是针对区域而言的,在 zone 语句中定义 "type master" 的即为主服务器。管理员负责维护主服务器上的区域解析文件。当区域解析文件被修改(且序列号增大)后,主服务器会通知(如果notify yes,这是缺省设置)从服务器来进行区域传送。主服务器只会通知在区域解析文件中列出来的从DNS服务器(即有相关的NS记录和A记录)。
五、从服务器
从服务器即在 zone 语句中定义为 "type slave" 的DNS服务器
从服务器从主服务器上同步区域解析文件,不应在从服务器上编辑区域解析文件。从服务器可与主服务器一起承担域名解析工作
六、ACL
利用ACL语句可以定义命名的访问控制列表,在其它语句和选项中引用,必须先定义ACL然后再可以引用。
系统内置的有4个ACL:
any:匹配任何主机
none:不匹配任何主机
localhost:匹配本机的所有网络接口的IP地址
localnets:匹配所有和本机的任一网络接口的IP地址在同一网络中的主机
ACL 的用法
acl acl-name { IP; ... };
例如
acl trust-net { 172.16.9.0/24; };
这个应该和 cisco 中的ACL一样,172.16.9.0/24 中的 /24 起的是通配符掩码的作用,匹配的主机其IP地址掩码并不一定得是/24。不过我没试过
可以在一个IP和网络前加 ! 表示否定。
七、 view
view可以根据客户端IP 的不同给予使用不同的解析文件应答。通常应用于CDN。
如果使用了 view, 则所有的 zone 都必须包含在 view 中,包括 "." 。
view 中的关键语句是
match-clients { address_match_element; ... };
bind 将客户端IP与view 语句 中的match-clients进行匹配,如果匹配成功,就使用该view中的zone文件应答。匹配是自上而下的。
八、其它
权威答案即非缓存的答案。
命令:
dig -t TYPE 名称 @SERVER
View
所有的zone都必须在 view 内
像下面的配置
www IN A 172.16.9.11 ; ftp IN CNAME www ; ftp IN A 172.16.9.12 ;
会导致报错 "CNAME and other data"
但是可以这样配置
www IN A 172.16.9.11 ; ftp IN A 172.16.9.11 ; ftp IN A 172.16.9.12 ;