概念部分
linux客户端默认的dns查找顺序:
本地DNS缓存→本地hosts文件→首选的DNS服务器(递归)
linux的DNS服务器查找顺序:
首选服务器的DNS缓存→首选服务器自己所负责的域→向外迭代查询信息。
DNS缓存:
ttl:time to live
就是被请求的域名或主机名等对应的IP条目在客户端本地的有效时间。
这个时间由被请求域的 主DNS服务器根据其条目的变化频率自行决定,而非本地可以定义。
但是客户端本地可以查看和清除。例如:
windows上:ipconfig/displaydns查看DNS缓存,ipconfig/flushdns清除DNS缓存。
迭代查询:
一般由缓存DNS服务器向其他DNS服务器发起,从根"."开始,然后顶级域".com.",直到找到目标域。
递归查询:
一般由客户端向缓存DNS服务器(首选DNS服务器)发起,然后由其向外进行迭代查询,返回给客户端的则是最终的答案。
权威应答:
由被请求域的 DNS服务器 返回的答案。
非权威答案:
由缓存服务器提供的答案,
缓存DNS服务器:
直接响应客户端请求,为其从根开始直到返回答案,或者提供客户端已经被缓存过的条目。
主DNS服务器:
由管理员手动完成新条目的添加、删除及修改的服务器。同时向外提供权威DNS答案。
从DNS服务器:
为了实现负载均衡、冗余等功能而设计的服务器。
但是在主DNS服务器宕机一定时间后,从服务器也会停止响应服务。
DNS解析类型:
正向解析:FQDN→IP,由FQDN查找IP。
正向根:"."
反向解析:IP→FQDN,由IP查找FQDN。
反向根:".in-addr.arpa."
DNS服务器软件:
bind:linux端软件
powerdns:windows端软件。
下面以bind为例:
名称解析库:
位于/var/named/,其中的部分".zone"结尾的文件中就存储我们需要查询的条目。
资源记录格式:
/var/named/*.zone文件中存储条目的一种固定格式:
[domain] IN [[RR type] [RR data]]
域名. IN SOA 管理此域的7个重要参数
域名. IN NS 管理这个域的服务器的主机名字
域名. IN MX 优先级 邮件服务器的主机名字
主机名. IN A IPv4的IP地址
主机名. IN AAAA IPv6的IP地址
主机别名. IN CNAME 实际的主机名字
IP IN PTR 实际的主机FQDN(这里必须是FQDN,不能有任何省略)
RR data:
(注意:这里的主机名不是指hostname命令看到内容,而是DNS查询中所定义使用的主机名)
SOA:
通常是第二行($TTL等为第一行),用于查询管理域名的服务器的管理信息。
1、确定此域的 主DNS服务器 是哪个。
2、管理员的Email地址。
在创建资源记录时,会使用"@"代替"域名.",也就是配置文件中的zone后的"baidu.com."。
所以由于@具有其他意义,所以这里使用"."替代。例如"root.baidu.com."。
3、序列号,数字是越大越新,在从DNS服务器要判断是否主动下载新的资源记录条目时的依据。
4、刷新频率,就是Slave(从DNS服务器)每隔多长时间主动向Master(主DNS服务器)发起更新。
但在序列号没有增大时,就不会进行下载更新。
5、重试时间,在上一次连接Master刷新失败的情况下,Slave会再隔一个"重试时间"重试刷新。
6、失效时间,当重试一直在失败,直到达到"失效时间",那么Slave就不会重试刷新,
而且停止DNS的响应服务器,等待管理员的处理。
刷新时间 >= 重试时间*2
刷新时间 + 重试时间 < 失效时间
失效时间 >= 重试时间*10
失效时间 >= 7天
7、如果当资源记录内容中没有我们要求的条目,那么就会以此值作为查询端的TTL值。
NS:
Name Server,指定当前域的DNS服务器有哪些。
如果此域有从DNS服务器,就必须也写上。否则Mster不会主动通知Slave数据已经改变。
后面必须同时指定NS记录中的服务器的A记录,也就是IP地址。
MX:
查询当前域的邮件服务器的主机名。
其数字部分表示优先级,数字越小,优先级越高。