admin管理员组

文章数量:1565790

一、背景描述

DNS 就是Domain Name System,DNS服务器可以分为三种,高速缓存服务器 (Cache-only server)、主服务器(Primary Name server)、辅助服务器(Second Name Server)。Linux本地静态DNS一般利用本地静态解析文件/etc/resolv.conf指定dns服务器来实现;


网上收集了一些开放的DNS地址,大家可以参考使用:

DNS用户数国家省份地区运营商用户数排名(省份)用户数比例(省份)
112.4.0.551111900中国陕西西安移动59.84%
221.131.143.691022100中国江苏徐州移动45.17%
211.138.106.2633600中国山西吕梁移动66.79%

以上DNS信息转载于http://avzz/wwzt/2018-06-16/243.html,其他资源:EDNS

二、DNS回顾

1)DNS服务器数据流架构概览:


2)DNS查询过程图:


3)DNS协议

DNS 是3层传输层协议,DNS 域名服务器使用的端口号是 53 ,并且同时支持 UDP 和 TCP 协议。

因 DNS 响应报文中有一个删减标志位,用 TC 表示。当响应报文使用 UDP 封装,且报文长度大于 512 字节时,那么服务器只返回前 512 字节;同时 TC 标志位置位,表示报文进行了删减。当客户端收到 TC 位置位的响应报文后,将采用 TCP 封装查询请求。DNS 服务器返回的响应报文长度大于 512 字节。UDP 报文的最大长度是 512 字节,最多可以包含 13 台根域名服务器数据,因此 ipv4 根域名服务器只能限制在 13 个,且每个服务器使用单个字母命名,也是 IPv4 根服务器是从 A ~ M 命名的原因。因此会有辅助域名服务器,它会查询时会向主DNS服务器进行区域同步,因为区域传送的数据多,所以传送的数据采用 TCP 封装。故UDP 用于 client 和 server 的查询和响应,TCP 用于主从 server 之间的传送。使用UDP时,DNS消息的大小限制为512字节。 基本DNS消息以固定的12字节标头开头,后跟四个可变长度的部分:

问题(或查询)
答案
权威记录
附加记录

从上图可知,当前表单中的DNS消息没有足够的空间来添加更多信息。在此背景下,提出了DNS的扩展机制,即EDNS。 EDNS(Extension Mechanisms for DNS)是一种DNS扩展协议,它允许DNS服务器和客户端在DNS查询和响应中传输更多的信息。EDNS的主要目的是解决DNS协议的一些限制问题,如最大包长、类型码、查询响应等方面的限制。EDNS允许DNS消息中包含更多的扩展字段,以支持更多的功能和特性。其中一些功能包括:DNSSEC签名验证、大规模查询分片、更好的IP地址管理、广告拦截等。EDNS是一个开放标准,并已被广泛采用和支持。在较高的层面上,EDNS允许我们克服DNS标头中几个标志字段,返回码和标签类型的大小限制。它还允许将DNS消息大小从512字节扩展(当UDP用作传输协议时),而无需切换到TCP。EDNS允许DNS消息在其头部外添加额外的数据信息,格式上是在查询 DNS 头的基础上增加一个 “Additional Section” 来传输附加信息。可参考:EDNS,具体内容包括:

版本号 (Version):表示使用的 EDNS 版本号,通常为0。
最大载荷大小 (Maximum UDP Payload Size):它的值表示希望接收端返回的 UDP 数据包的最大长度。
DNSSEC标记 (DNSSEC OK):将 DNSSEC 标志位置为 1,则表示支持 DNSSEC。
安全(DNSSEC)承载标识(DNSSEC Algorithm and Key Tag): 在 DNSSEC 中,它被用来确定哪个密钥用于验证 DNS 记录的签名,以及签名算法的标识符。
扩展数据:表示负载中包含额外格式的数据。例如 DNS COOKIE,它是一种反欺诈机制,避免 DNS 投毒或 DOS 攻击。

2.1、DNS查询实现方式:

递归查询: 主机向本地域名服务器的查询一般都是采用递归查询,本地服务器将结果返回给主机,只发出一次请求。客户端只发一次请求,要求对方给出最终结果。客户端<—>本地dns服务端:这部分属于递归查询。递归查询时,返回的结果只有两种:查询成功或查询失败。这种模式下,客户端相当于只进行一次DNS查询,然后就等本地将结果返回即可;

迭代查询: 本地域名服务器向根域名服务器的查询的迭代查询,发出多次请求,最后由最终dns服务器直接返回给客户端。客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,客户端根据该列表反复多次请求 ,最终直接获取目标应答。本地DNS服务端<—>外网:这部分属于迭代查询,返回的是最佳的查询点或者主机地址。这种模式,需要客户端一级级问,指导找到结果,比较“累”。

一次完整的DNS查询请求经过的流程:

  1. 当你请求www.xxx这个域名时, 会先去查找本地hosts文件, 如果本地hosts文件中有结果, 则直接返回
  2. 如果hosts文件中没有结果, 则会请求DNS serveice, DNS service会先查找Local DNS Cache, 有结果则直接返回
  3. 如果没有结果, 就去会从根域服务器开始迭代查询
  4. 最后迭代查询有结果就直接返回给客户端

相关参看:https://wwwblogs/qingdaofu/p/7399670.html

2.2、DNS软件部署结构


如上图所示,Linux下的dns功能是通过bind软件实现的,使用TCP/UDP 53端口。bind软件安装后,会产生几个固有文件,分为两类,一类是配置文件在/etc目录下,一类是 dns记录文件在/var/named目录下。加上其他相关文件,共同设置dns服务器。

安装参看:使用Bind9自建私有权威DNS。

2.3、常用配置文件说明

1)/etc/named.conf ##DNS主配置文件

#named.conf

options {

    listen-on:    ##用于配置监听的端口以及IPv4地址,默认的监听端口为:53;
    listen-on-v6:##用于监听 IPv6 地址以及端口;
   // zone文件的位置

    directory "D:\DNS\etc"; ##/指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/cache/bind;
   dump-file:  ##用来设置域名缓存数据库文件的位置,可以自己定义。默认的存储文件为:named_dump.db;执行rndc dumpdb命令后的导出文件存放绝对路径
   // 无法解析的域名就去查询ISP提供的DNS;设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址,其中 8.8.8.8 和 8.8.4.4 是谷歌的免费DNS服务器的网络地址;233.5.5.5 和 233.6.6.6 是阿里云的免费DNS地址。当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发都设置的DNS转发器,由DNS转发器 完成转发操作。

   forwarders {
       202.96.69.38;  // 填写ISP的DNS地址
   };

   // 仅允许本机和子网内的机器查询,默认值为localhost, 可以设置为某个网段、任意地址、具体的某台主机三种情况。例如,要修改为任意地址,就在括号内的加入 any,也可以引用之前创建的 acl 内的所有地址;
   allow-query {

       any;

   };
  dnssec-enable: ##选项用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
  dnssec-validation:##选项用来设置是否启用DNSSEC确认,默认值为yes,可以选择 auto。
  bindkeys-file : ##用来设置内置信任的密钥文件,其默认值为 /etc/named/iscdlv.key;
  ## acl <string> { <address_match_element>; ... };bind内置了4个acl分别是:
  ##any(不是all)        对应所有的,也就是0.0.0.0/0.
  ##none        对应为空.
  ##localhost        对应本地机器.
  ##localnets        对应本地网络.
  acl acl-name {
    #address_match_list //address match list是一个地址列表,如”192.168.0.0/24;”,必须以分号结尾,有多个的话中间用分号格开
    10.0.0.0/8;172.16.0.0/12; 192.168.0.0/16;
	};
};
##DNS服务器上的所有日志记录被存储到了指定的文件中
logging {
	
     category default { #//category 用来区分不同的事件产生的类别或者场景
         default_syslog;
         default_debug;
     };
     category unmatched {
         null;
     };
     channel <string> {  #//指定日志输出的方式、日志格式的选项和事件的严重性,,每一个channel 可以指定一个 category 来指定记录的事件类型;BIND9 对于创建 channel 的数量没有限制。
        buffered <boolean>; #规定是否刷新错误日志的文件, yes/no
	    file <quoted_string> #将日志输出流通过通道直接输出给文件
	    [ versions ( unlimited | <integer> ) ] #//指定log文件数存储到本地的上限值,默认的参数值为unlimited,当指定的文件的大小超过设定的size值得时候,如果没有指定 versions,那么系统就不会继续写进log;如果制定了versions,那么就会继续写入;
        [ size <size> ] #//用来限制log文件的大小,如果大小超过了设定的阈值,那么系统会自动停止输出内容到文件中;
        [ suffix ( increment | timestamp ) ];
        null;
        print-category <boolean>; ##打印日志消息配置category 的信息
        print-severity <boolean>; ##打印日志的严重等级
        print-time ( iso8601 | iso8601-utc | local | <boolean> ); ##//yes/no可以设定不同的输出到日志文件的时间格式;
        severity <log_severity>;#//定义日志严重级别的定义角色,相当于 syslog - priorities。一般常用的严重等级: debug[level]、notice、warning、dynamic - 与当前服务器的日志保持一致;
        stderr; #//将通道指向服务器的标准错误流。这是为了在服务器作为前台进程运行时使用;
        syslog [ <syslog_facility> ];#//将通道定向到系统的日志文件流中; 常用的支持日志文件服务为:dameon、syslog、local6、local7;
    };
};
lwres { //定义named为一个轻量级的解析进程

    [ listen-on { ip_addr[port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]

    [ view view_name; ]

    [ search { domain_name ; [domain_name ; ... ] }; ]

    [ ndots number; ]

};

// 根DNS

zone "." {

   type hint;

   file "named.root";

};

zone "moon.zone"{		//建立一个moon的域

   type master;

   file "D:\DNS\etc\moon.zone";

};

zone "56.168.192.in-addr.arpa"{  //建立一个moon的域的反向解析

   type master;

   file "D:\dns\etc\56.168.192.in-addr.arpa ";
};

# End of named.conf

参考示例如下:


/etc/rndc.key ##密钥配置文件

/var/named/*.zone ##区域数据文件,具体文件从模板拷贝后自定义生成,指定后所有的DNS数据文件都存放在此目录下,分正/反向解析文件,目录下文件named.localhost为正向解析模板;配置示例如下所示:


反向区域配置:

zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa.zone";
}; ##指定named作为127.0.0网段地址转换主服务器,named.local文件中包含了127.0.0.*形式的地址到域名的转换数据(127.0.0网段地址是局域网接口的内部 loopback地址);

zone "localhost" {
type master;
file "localhost.zone";
};   ###指定包含localhost的DNS文件数据存放在/var/named/localhost.zone中;

zone "ruoheng" {
type master;
notify yes;
file "ruoheng.zone";
};###以上语句表明域21php的DNS数据存放在/var/named/目录下的ruoheng.zone中;

打开区域数据文件:vim /var/named/ruoheng.zone,如下:


图例文字说明:
$TTL 1D
@ IN SOA @ admin.ruoheng. (
0 ; serial —————— #版本序列号
1D ; refresh —————— #刷新时间,找主服务器同步
1H ; retry —————— #重试连接
1W ; expire —————— #最大忍耐时间
3H ) ; minimum ——————#缓存最多保持3个小时
NS @ —————— #服务器的名字
A 192.168.120.5 —————— #主机服务器的地址
IN MX 5 ruoheng. —————— #邮件交换记录
mail IN A 192.168.120.5 —————— #邮箱正向解析的地址
www IN A 192.168.120.100 —————— #主机名解析
smtp IN CNAME mail.ruoheng ——————#别名解析
IN A 8.8.8.8 ——————#泛域名解析

/etc/resolve.conf ##本地DNS解析器,指定远程DNS服务器地址,而hosts文件可作为指定DNS服务器的域名静态解析。resolve.conf 格式:

domain 默认的查找域名
nameserver 指定的DNS地址

命令:named-checkzone “区域名” 区域数据文件------->检查文件配置是否正确

named-checkconf /etc/named.conf
named-checkzone linux /var/named/linux.zone
named-checkzone 1.0.0.127.in-addr.arpa /var/named/1.0.0.127.zone

【DNS区域数据文件资源记录定义说明】:

# 语法: name    [TTL]   IN  tt_type     value
# name: 当前区域的名字, 例如: lantian
# value: 有多部分组成
    # 当前主区域的DNS服务器的FQDN, 也可以使用当前区域的名字
    # 当前区域管理员的邮箱地址, 但地址中不能使用@符号, 一般用“.”代替, 例如linuxedu.magedu
    # 主从服务协调属性的定义以及否定的答案的统一的TTL
#其他说明:
    # TTL可从全局继承
    # “@”可用于引用当前区域的名字
    # 同一个名字可以通过多条记录定义多个不同的值, 此时DNS服务器会以轮询方式响应
    # 同一个值也可能有多个不同的定义名字, 通过多个不同的名字指向同一个值进行定义; 仅此表示通过多个不同的名字可以找到同一个主机而已

## 示例如下:
lantian.(直接写@也行)	86400	IN	SOA	ns.lantian.	nsadmin.lantian.	(
			2021082401	;序列号
			2H			;刷新时间
			10M			;重试时间
			1W			;过期时间
			1D			;否定答案的TTL值
)
#NS记录: name  IN  NS value
# name: 当前区域的名字
# value: 当前区域的某DNS服务器的名字, 例如: ns.leistudy.
# NOTE: 一个区域可以有多个NS记录,NS记录而言, 任何一个ns记录后面的服务器名字, 都应该在后续有一个A记录

# 示例:
lantian.   IN  NS  ns1.lantian.
lantian.   IN  NS  ns2.lantian.

#MX记录:
#name: 当前区域的名字
# value: 当前区域的某邮件服务器(smtp服务器)的主机名, 一个区域内, MX记录可有多个; 但每个记录的value之前应该有一个数字(0-99), 表示此服务器的优先级, 数字越小, 优先级越高

# 示例:
lantian.    IN  MX  10  mx1.lantian.
                IN  MX  20  mx2.lantian.

# NOTE: 对MX记录而言, 任何一个MX记录后面的服务器名字, 都应该在后续有一个A记录
lantian.   IN  MX  10  mx1.lantian.

#A记录: name.   IN  A   ip地址
# name: 某主机的FQDN, 例如www.lantian.
# value: 主机名对应主机的IP地址
#AAAA记录: name  IN AAAA  value
# PTR记录
192.168.3.5.in-addr.arpa. IN    PTR www.lantian
#CNAME记录:
web.lantian.   IN  CNAME   www.lantian.

2.4 解析验证



一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存。如果未命中则访问OS缓存,最后再访问DNS服务器(一般是ISP提供),然后DNS服务器会递归式的查找域名记录,然后返回。DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS缓存会参考ttl值,但是不完全等于ttl值,而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。

命令:dig @server name type

说明:

@server: 指定域名服务器
name:指定查询请求资源的域名
type:指定查询类型,如A、CNAME、SRV、MX、SIG等,如果不指定type,默认为A

eg:$dig @8.8.8.8 163 +trace //查询某个域名解析的全过程:(此时为迭代查询)

本文标签: 静态手册Linuxdns