DNS是一个用来把名称解析为IP地址的协议,它是标准TCP/IP协议簇的一部分,是几个能提供名称解析功能的协议中的一个,其他的协议包括NIS和LDAP。 DNS与这些协议的不同之处在于它只做名称解析这一件事,NIS和LDAP还能做其他解析操作,例如对网络用户和组账户的解析。
DNS也是名称解析的行业标准,被因特网上绝大多数系统所采用。 DNS客户端配置非常简单,如linux只需要在本地名为/etc/resolv.conf的文件里指定要使用的DNS服务器的地址即可:
全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织。它的总部在美国加州。
它原来是美国商务部下面的一个非盈利机构。2016年,美国政府宣布,ICANN 不再隶属于商务部,成为一个自我管理的独立机构。
ICANN 负责管理全世界域名系统的运作。它的一项主要工作,就是规定顶级域名(top level domain,简写为 TLD)。
顶级域名有1000多个,ICANN 自己不会去管理这些顶级域名,每个顶级域名下面都有许多批发商。
ICANN 的政策是,每个顶级域名都找一个托管商,该域名的所有事项都由托管商负责。ICANN 只与托管商联系,这样管理起来就容易多了。举例来说,域名的托管商就是中国互联网络信息中心(CNNIC),它决定了域名的各种政策。
目前,世界最大的顶级域名托管商是美国的 Verisign 公司。
由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,被写成,即最后还会多出一个点。这个点就是根域名。
DNS 域名解析服务采用了类似目录树的层次结构来记录域名与 IP 地址之间的对应关系,从而形成了一个分布式的数据库系统
理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。
比如,要访问,就必须先询问 ICANN 的根域名列表,它会告诉我域名由 Verisign 托管,必须去找 Verisign,它会告诉我服务器在哪里。
DNS 根域名服务器
保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。
由于早期的 DNS 查询结果是一个512字节的 UDP 数据包。这个包最多可以容纳13个服务器的地址,因此就规定全世界有13个根域名服务器,编号从一直到。分布在世界各地,其管理单位、具体的地理位置,以及 IP 地址如表
- 注:DNS服务器会保存根服务器的信息,Bind系统默认保存在/var/named/named.ca
美国军方控制的:
- U.S. DOD Network Information Center(G根)
- U.S. Army Research Lab(H根)
企业控制的:
- Verisign (A根、J根)
- Cogent Communications(C根)
- Netnod(I根)
高校控制的:
- USC(B根)
- University of Maryland(D根)
政府组织控制的:
- NASA Ames Research Center(E根)
其他组织控制的:
- Internet Systems Consortium, Inc.(F根)
- RIPE NCC(G根)
- ICANN(L根)
- 日本WIDE组织(K根)
这13台根域名服务器由12个组织独立运营。其中,Verisign 公司管理两台根域名服务器:A 和 J。每家公司为了保证根域名服务器的可用性,会部署多个节点,比如单单 Verisign 一家公司就部署了104台根域名服务器(2016年1月数据)。
所以,根域名服务器其实不止13台。据统计,截止2021年12月,全世界共有 1478 台根域名服务器。可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。
DNS根区
根域名列表的正式名称是 DNS 根区(DNS root zone),ICANN 官网可以查看这个根区文件。
该文件保存所有顶级域名的托管信息,所以非常大,超过2MB。
举例来说,顶级域名可以查到13个域名服务器。
com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net.
DNS 域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。
- 递归查询,是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。
- 迭代查询,DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果
在一般情况下,当用户向配置指定的 DNS 服务器发起对某个域名的查询请求(这里以www.cisco.com为例),其查询流程大致如图
BIND 9
现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早由伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Internet Systems Consortium)编写和维护。BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows),BIND服务的名称称之named。DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)。
BIND服务器通常从因特网可直接访问。只要有一个通过因特网可以直接访问的系统,安全就成了一个大问题。这些安全问题包括有人破坏了服务器上的数据(有时称为数据投毒)和黑客控制了暴露的服务器进程,允许被劫持的服务器未经授权访问其他系统文件。
named进程在处理传人的DN查询时与网连接起交互。任何时候,只要一个进程是通过网络可访问的,那么这个进程就有可能受到动击。在这种攻击中,远程系统上的用户控制本地服务器上的进程。一旦这个用户有了提制权,他们就可以访问本地系统,包括查看或修改文件。
当被劫持的进程是以非root身份运行时,虽然危害是有限的。但是,像/etc/passwd这样 的系统核心文件。系统上的每个用户,包括named用户,都能查看/etc/passwd文件的内容,因为每个用户都有这个文件的读取权限。
chroot jail的目的是限制对系统文件的访问。named进程被放入jail,在那里它只能看到和BIND相关的配置。这是通过将BIND的配置文件放到特定的子目录中并启动named进程实现,这样文件系统的根看起来就是前面提到的子目录(chroot代表 change root,就好像是更改这个进程的文件系统根路径)。
bind-chroot本质上是使用chroot方式给bind软件换了个“根”,这“根”在/var/named/chroot下,把yum安装的bind-chroot在/etc下的产生的配置文件硬链接到/var/named/chroot/etc下。配置起来就跟BIND9没什么区别。 yum查看bind-chroot的info
可以看到此安装包是为Bind安装包加了chroot 的jail。
在CentOS 7下可以用yum直接安装
注意:
安装了bind,bind-chroot和python-ply
启动服务:
Bind的基础配置工作是配置主配置文件和区域文件,其关系如下:
主要配置文件named.conf
Bind服务器的主要配置文件/etc/named.conf,默认如下:
全局配置options
options 的参数设置会影响整个 BIND9 DNS环境的配置,具体各部分常用到的配置参数如下:
- : 用于配置监听的端口以及IPv4地址,默认的监听端口为:53;
- listen-on-v6:用于监听 IPv6 地址以及端口;
- : 用于指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/nemed;
- dump-file:选项用来设置域名缓存数据库文件的位置,可以自己定义。 默认的存储文件为:cache_dump.db;
- statistics-file:选项用来设置状态统计文件的位置,可以自己定义,默认/var/named/data/named_stats.txt;
- memstatistics-file :选项用来设置服务器输出的内存使用统计信息。默认保存在 /var/named/data/named_mem_stats.txt;
- :选项用来设置允许DNS查询的客户端地址,默认值为localhost, 可以设置为某个网段、任意地址、具体的某台主机三种情况。 例如,要修改为任意地址,就在括号内的加入 any,也可以引用之前创建的 acl 内的所有地址;
- :用于设置递归查询,一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出查询请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。此选项有yes和no两个值。这个选项用于设置 Failover 非常有用; 系统的解释如下:
- 如果您正在构建一个权威性DNS服务器,不要启用递归。
- 如果您正在构建一个递归(缓存)DNS服务器,您需要启用递归。
- 如果您的递归DNS服务器有一个公网IP地址,您必须启用访问控制,以限制对您的合法用户的查询。 如果不这样做,将导致您的服务器成为大规模DNS放大攻击的一部分。 在您的网络中实现BCP38将大大减少此类攻击
- dnssec-enable: 选项用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
- dnssec-validation:选项用来设置是否启用DNSSEC确认,默认值为yes,可以选择 auto。
- bindkeys-file : 用来设置内置信任的密钥文件,其默认值为 /etc/named.root.key;
- managed-keys-directory: 选项用于指定目录中的文件存储位置,跟踪管理 DNSSEC 密钥;
未在默认named.conf中的重要参数:
-
:用于设置DNS转发的工作方式,有两种选择
-
forward first 设置优先使用forwarders DNS服务器做域名解析,如果查询不到再使用本地DNS服务器做域名解析。
-
forward only设置只使用forwarders DNS服务器做域名解析,如果查询不到则返回DNS客户端查询失败。
-
:DNS转发器。 用于设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址。可以设置 8.8.8.8 和 8.8.4.4 (谷歌的免费DNS服务器的网络地址);233.5.5.5 和 233.6.6.6 (阿里云的免费DNS地址)。 当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发都设置的DNS转发器,由DNS转发器完成转发操作。因此这台转发器的缓存中就记录了丰富的域名信息。因此如果遇到非本域的查询,转发器的缓存就可以做到查询,从而减少了向外部的查询流量。 在BIND8.2以后引入了一个新的特性:转发区(forward zone),它允许把DNS配置成只有查找特定域名的时候才使用转发器。( BIND 9从9.1.0才开始有转发区功能 ) 例如,你可以使你的服务器将所有对 etaon.cn 结尾的域名查询都转发给 etaon.cn 的两台名字服务器: zone “etaon.cn” { type forward; forwarders { 3.203.8.8; 3.203.8.2; }; };
-
rrset-order: 在 BIND 9 提供的负载均衡策略建立在一个名称(域名 - Name)使用多个资源记录 ( Records ) 的情况下,其实现的轮询机制并不是传统的负载均衡服务器实现的轮询机制 - 即追踪和记录每一次应答的资源顺序; BIND 9 实现了一个类似 List 的数据结构,将所有的资源记录填入到 一个顺序表中,这个填入的次序随机,或者根据设定的参数随机;
格式:
[class class_name] [type type_name] [name “domain_name”] order ordering
如果参数没有被赋值,那么默认的赋值为: class: ANY type: ANY Name: * 参数:
- fixed : 根据 zone 文件定义资源记录的顺序按照顺序逐个进行解析;
- random: 根据 zone 文件资源记录随机返回解析记录;
- cyclic: 创建一个循环,循环输出资源记录;
- none: 完全随机的资源返回形式;
logging
部分的配置为DNS解析服务器提供了日志记录的功能,DNS服务器上的所有日志记录被存储到了指定的文件中。其通用的配置文件为:
从上边的通用配置格式可以看出来, 模块分为两个部分, 和 category 用来区分不同的事件产生的类别或者场景,比如:客户端请求-、配置文件解析处理-。 的作用是指定输出的方式、日志格式的选项和事件的严重性,每一个channel 可以指定一个 category 来指定记录的事件类型。
默认named.conf
: 将日志输出流通过通道直接输出给文件
:用来承担定义日志严重级别的定义角色,相当于 - 。 比如说定义了日志的严重级别为 ,那么会输出日志事件 以上的错误到文件中。 一般常用的严重等级: 、、、
Zone 的引导配置
常用的参数配置如下:
- :用于指出域名与IP地址解析的数据库配置区域文件;
- : 这个地方的配置是用来给出 Failover 或者递归查询DNS服务器的IP地址,如果之前在 里配置的如果设置成了参数 , 那么需要在这里指出递归查询服务器的IP地址;
- : 用于指定当前DNS解析服务器的位置,有三个选项
- master:表示定义的是主域名服务器
- slave :表示定义的是辅助域名服务器
- hint:表示是互联网中根域名服务器
在默认里指定了根域”.”使用named.ca文件,在此文件中已经记录了13个根域服务器地址。
另外使用了/etc/named.rfc1912.zones:
/etc/named.rfc1912.zones的内容格式和named.conf中zone引导配置一致,用于不同域的配置并指定区域文件。如果不用/etc/named.rfc1912.zones,也可以直接在named.conf中写zone引导。
我们可以看到整个基础配置的配置链: 其中,/var/named/named.ca由系统提供,我们需要配置主配置文件和其他区域文件。
区域文件Zone File
区域文件用于记录主机名到IP地址的转换以及该域的其他信息,使用Bind的标准安装,区域文件会存放在/var/named目录下。
规则
- 注释以分号(;)开始,直到行尾结束。
- 每一行就是一条记录,大多数情况下,一行的结束就是一条记录的结束。在某些情况下,一条记录可以跨多行(如SOA)。
- 每条记录是由空格或制表符tab分隔的字段组成,这些字段定义了名称生存时间、记录类别、记录类型和记录数据。
- @符号在区域文件里有特殊含义,它代表当前来源,就是指当前域。 因此,在 etaon.com域的正向查找区域文件中,@符号的意思是 etaon.com.(注意结尾的那个点,在区域文件中是必需的)。 通过使用$ORIGIN设置可以修改@字符的含义(例如,$ORIGIN example.com.即把@改成example.com.)。
- 每个区域文件都应该以$TTL开始,用于设置默认的生存时间(TTL)。
注意:无论何时在区域文件中使用FQDN,结尾的点(.)字符很重要。相对域名不需要结尾的点字符,因为相对域名会追加上$ORIGIN的值。
常见区域记录类型
SOA记录
SOA(Start of Authority)记录类型用于定义域的权威信息(可以将其视为域的操作说明)。如
圆括号()允许将数据分散到多行,并为每个数据值提供注释。 虽然这是为了方便阅读,但不是必需的。也可以使用单行格式的记录:
在name字段中,提供整个域的名称。
- @字符表示当前城名,它由/etc/named.conf文件中的区域条目决定。 通常,如果ttl字段被省略了则使用区域文件的默认值。
- 记录类别通常使用IN
- 记录类型为SOA。
- 记录的数据字段包含7个值
- 名称服务器:主名称服务器的域名。例如,ns.etaon.com
- 本域的DNS管理员的电子邮件地址:这里不是使用@来分隔用户名和域名,而是使用 “.”字符。例如,root.etaon.com,相当于root@etaon.com
- 序号:如果有从服务器,这个数字很重要,因为这个值用于确定是否应该启动区域传输。从服务器会定期查询主服务器,以确定此序号是否有更新。 例如,假设当前序号为100,并在主服务器上修改了区域文件,那么执行修改的管理员应该将此序号的值至少增加1(例如101)。然后从服务器才能知道区域文件有了更改,并通过一个名为区域传输的过程向主服务器获取这些更改。 序号的值限制为最多10位数。这样可以使用这么一种格式,这种格式总是递增的。 同时,序号又可以表示区域文件的最后修改时间,这种格式是:YEARmonthDAYrev。 YEAR是4位数字的年份,month是2位数字的月份,DAY是2位数字的天数,而rev是文件在当天的版本号。 例如,区域文件在2017年1月31号的第一次修改,序号可能是2017013100,这种格式允许每天最多更新区域文件100次,直到9999年12月31日。
-刷新频率:从服务器多久查询一次主服务器,以判断序号是否变更。这就是刷新频率的用途。通常,默认1D表示从服务器每隔24小时向主服务器发起一次查询。但在区域文件变更很频繁的域中,可以使用如1H或6H的值,让从服务器每隔1小时或6小时就查询一次
- 重试间隔:这个值是从服务器再次向主服务器发起查询的等待时间。例如,假如刷新频率设置为1D,当从服务器向主服务查询更新时,若主服务器没有响应,就会使用重试间隔。1H会使从 服务器等待1小时,然后才会再次向主服务器发起查询请求
- 过期时间:如果主服务器一直不能访问,过期时间用来指定从服务器何时不再响应DNS客户端的查询请求。主服务器这么长时间都没有响应,DNS条目可能不再有效。过期时间通常设置为1周或2周
- 最小值:最小值用于设定否定的DNS响应的缓存时间。如果域更新频繁,可设置小一些的值(也许是1小时或更小),如果域很少更新,可以设置大一些的值(但可能不会大于1天)
A记录
A记录(也称为地址记录)用于定义域名到IP地址的转换,典型示例如下所示:
第一个字段是域名(例如www),此例中,域是相对形式,相对于$ORIGIN定义的默认域,当然也可以用完整域名形式:
A表示这行是一条A记录,138.29.16.101是域名www.etaon.com.所关联 的IP地址。 注意,A记录仅存在于正向查找区域文件中。
别名记录cname 在某些情况下,域中的一台主机不止一个角色,因此应该使用多个域名来访问。 例如,etaon.com域中的Web服务器通常也是FTP服务器,因此,这一个主机既可以使用www.etaon.com访问,也可以使用ftp.etaon.com访问。 但是,每个IP址应该只有一条A记录。因此,为了要把多个域名转换为同一个IP地址,使用别名记录。 别名记录(也称为cname)像是一个昵称,通常就像下面所示的第二条记录:
像这样的条目,域名ftp.etaon.com会被转换为域名 www.etaon. com,后者又进一步被转换为IP地址138.29.16.101。
NS记录
每个域可以有一个或多个名称服务器,这些可以由NS记录(也称为域名服务器记录)定义。 首选(或主)名称服务器在SOA记录中指定,但还是需要一条NS记录。此外,还需要用NS记录定义其他(辅助或从)名称服务器。 要定义名称服务器,如下所示:
所有的名称服务器都需要有相应的NS记录,即使是主名称服务器也要有相应的NS记录。 NS记录的数据是域名的形式,不是IP地址,因此需要为每个域名服务器创建一条A记录,这一点很重要。 注意,NS示例中的@字符可能已经被彻底移除了。如果省略了第一个字段,则假定它是$ORIGIN的值。
邮件交换记录
假设要给info@etaon.com发送一封电子邮件,发送域的MTA(Mai Tamea Agent,邮件传输代理)需要知道 onecoursesource.com域中哪台主机负责处理电子邮件,MTA通过向域名服务器查询邮件交换(MX)记录来获得这个信息。
域的MX记录通常如下所示:
10和20这些数字代表优先级,数字越小,优先级越大。 如果一台邮件服务器的优先级是10,另一台是20,邮件发送域的MTA会先尝试把邮件发送给优先级是10的服务器,如果这台服务器没有响应,则会发送给优先级为20的服务器。可能永远不会使用到第二台邮件服务器,因为大多数邮件服务器都是7*24可用的。 更常见的是为每台邮件服务器设置相同的优先级,以达到负载均衡的效果。在这种情况下,邮件服务器的利用率大致相同(“大致”是因为缓存DNS服务器会使负载稍微失衡)。 只有一个MX记录的情况也很常见,因为许多中小型公司不需要多个邮件服务器来处理传入的电子邮件。
指针记录
前面描述的A记录用于正向查找区域文件中把域名转换为IP地址,指针(PTR)记录则用于反向查找区域文件中把IP地址转换为域名。 下面是典型的PTR记录的示例:
:PTR记录中的IP地址格式是实际IP地址的逆序形式再加上in-addr.arpa.
例如,101.16.29.138.in-addr.arpa.表示IP地址是138.29.16.101 在大多数情况下,不需要指定完整的IP地址,因为$ORIGIN被设置为当前的反向查找网络域(例如,16.29.138.in-addr)。如果是这样,只需提供IP地址中的主机地址:
$ORIGIN linuxdns.com
配置主配置文件named.conf
配置/etc/named.rfc1912.zones
配置/var/named/linuxdns.com.zone
配置/var/named/172.16.21.arpa
采用简单写法
重启服务:
在MySQL.linuxdns.com上查询
linuxdns.com :
Internet :
Tcpdump该查询的过程
第一步,向顶级com.ns服务器发起请求。其中,192.52.178.30为com.的顶级ns服务器k.gtld-servers.net. 位于东京,是离本地最近的。
第二步,拿到顶级服务器的信息后,查询topgoer.com,指向了106.11.141.115。只能查询到该地址是一个阿里云的IP地址。该服务器直接回答查询的A 记录为122.114.11.160
第三步,本地dns服务器再次询问l.gtld-servers.net.-位于美国弗吉尼亚州的ICANN,得到同样的A记录
第四步,本地dns服务器将A记录返回客户端172.16.21.9。
- 主机:主机通常是连接到网络的一台计算机(台式计算机、笔记本计算机、平板计算机或手机),另一种看法是主机就是可以进行通信的设备。
- 域名:因特网上的主机使用IP地址相互寻址。人们很难记住这些数字,因此会为主机分配一个唯一的名称,当这个名称在一个授权DNS服务器上注册后,名称就被视为“域名”。
- 顶级域名:域名在结构上以树状形式呈现,就像文件在虚拟文件系统结构中一段,DNS结构的最顶层简单地称为“点”,并用“.”来表示。直接位于“”下面的发是顶级域。最初的顶级域名有.com、.org、.net、.int、.edu、.gov和.mil,近年来还增加了许多其他的顶级域。
- FQDN:完全限定域名(Fully Qualified Domain Name,FQDN)是指从DNS结构顶部开始的主机域名。例如,“www.etaon.com.”就是一个FQDN,注意FQDN最后结尾的“.”符号,它是顶级以上的域名。当用户提供域名时,通常会省略此字符,因为大多数情况下,“.”符号被认为是FQDN的最后一个字符。但是,如果要管理DNS服务器,则应该习惯于加上“.”符号,因为在某些DNS 务器配置文件中将需要它。
- 子域:子域是较大域的组成部分,例如,假设你想用3个域来按照功能分类管理公司的主机,可以将这些域称为sales、eng和support。如果公司的域名是“etaon.com.”,则这3个子域的名称分别是“sales.etaon.com.””eng.etaon.com.”和“support.etaon.com.”。
- 名称服务器:名称服务器是响应DNS客户端请求的系统。名称服务器提供从IP地址到域名的转换(有时是相反的,即域名到IP地址的转换)。请注意,名称服务器要么在本地存储有此信息的副本(称为区域文件),要么是将从其他名称服务器获取的信息临时存储在内存中,抑或将查询请求转发给具有该信息的其他服务器。
- 权威名称服务器:权威名称服务器是根据系统本地存储的信息(原始主记录)返目结果的服务器。
- 区域文件:用来存储IP地址到域名转换信息(即DNS记录)的文件的名称。此文件还包含用来定义域自身所需的信息。
- 记录:在区域文件中,记录是为区域定义单个信息块的一个条目,例如将一个地址转换为域名的数据。
- 缓存名称服务器:缓存名称服务器是基于从另一个名称服务器(如权威名称服务器)获得的信息返回结果的服务器。缓存名称服务器的主要优点是它可以加速IP地址到域名的解析,因为它会把查询结果缓存起来,并能够直接使用此缓存中的信息响应后续的请求。
- TTL:存储在缓存名称服务器中的数据通常不会永久存储。提供数据的名称服务器还为缓存名称服务器提供了该数据的TTL值,又叫作生存时间(Time To Live)。