了解BIND区域文件的DNS解析

2020-08-25 11:20:09

如果您想成为一名系统管理员或任何类型的网络管理员,有一项基本技术您确实需要了解-DNS,即域名服务。曾经有一段时间,不想管理可访问互联网的服务的系统管理员可能在不了解DNS的情况下勉强过活,但那个时代已经过去很久很久了。

您不可能在一篇文章中了解有关DNS的所有知识。但这不是我们今天要做的事情;相反,我们想给您一个清晰、简明的指导,让您了解域名系统最重要部分的结构和含义:区域文件,如BIND中所示,即伯克利互联网名称守护程序(Berkeley Internet Name Daemon)。

上面,我们有一个典型区域文件的小而完整的示例-事实上,它是我管理的域上的生产区域文件的匿名版本。让我们逐行过一遍。

每当您在区域文件中看到$Origin行时,这是一个快捷方式,它让BIND知道该行后面的任何未终止的主机名引用都应假定以$Origin之后的参数结束。在本例中,是';s.tld-example.tld虚构的顶级域。

下一行,$TTL5M,声明以下行的生存时间为5分钟。这个相对较短的值意味着远程DNS解析程序在再次请求记录之前,应该只缓存从该区域检索到的记录5分钟。如果您相对确定给定域的DNS不会经常更改,您可能会考虑增加该值,以减少远程主机必须查询您的名称服务器的次数-但请记住,TTL越长也意味着停机时间越长,此时您必须更改DNS(或进行意外损坏的更改)。

$Origin和$TTL都可以在同一区域中定义多次-每次重新定义它们时,都会更改同一区域文件中新值下面的任何行的值。

SOA中的示例ns1.example.tld。Hostmaster.example.tld。(90;串行4h;刷新15m;重试8h;过期4m);负缓存TTL。

我们的示例区域文件(或任何普通区域文件)中的第一个实际记录是SOA记录,它告诉我们域的Authority开始。它也很容易成为整个DNS系统中最容易混淆的记录类型。

对于任何记录列表,包括此SOA记录,第一个参数是记录适用的主机名-在本例中为示例。还记得我们如何在区域文件的第一行设置$Origin TLD吗?这意味着这个未终止的主机名示例将扩展到example.tld-因此,我们重新定义了FQDN(完全限定域名)example.tld的SOA。

我们在示例中将此主机名称为未终止,因为它不以点结尾。如果我们想绕过$Origin设置而直接引用FQDN,我们将以最后一个点(例如example.tld)结束它。这将是这里的FQDN,后面有一个圆点。

我们看到的下一个参数是IN,它是Internet的缩写。";这是Record类。还有其他DNS记录类,但您可以轻松地完成整个职业生涯,而不会看到它们中的任何一个(如CH,代表混乱)投入生产。Record类是可选的;如果省略,BIND将假定指定的记录属于IN类。但是,我们建议不要省略它,以免在绑定更新后发生变化,并且所有的区域文件都会突然被破坏!

接下来的两个论点是FQDN-至少,它们看起来是这样的。第一个FQDN实际上是一个FQDN,它应该是域本身的主名称服务器的FQDN-在本例中为ns1.example.tld。-请注意,您可以在此处使用未终止的主机名-例如,我们可以只使用ns1.example.tld作为此参数,该参数将扩展为ns1.example.tld。这要归功于我们的$Origin.tld行-但最好在此明确表示。

第二个FQDN hostmaster.example.tld实际上根本不是FQDN。相反,这是一种不正当的重写电子邮件地址的方式。@@是区域文件中的保留字符,原始BIND使用此字符的第一部分作为电子邮件地址的用户部分-因此,这将转换为地址[email protected]。在现实生活中的专区文件中看到这一点是非常常见的-谢天谢地,这并不是什么大不了的事情。我们不知道是否有人真正使用DNS区域的这一功能来联系任何人。

接下来,我们对括号内的区域进行了串行、刷新、重试、过期和负TTL测试。注意,你在这里看到的标注它们的注释并不是必需的-在现实生活中,你很少看到它们。我们强烈希望将这些注释放在生产区文件中,以便于阅读,但是BIND本身并不在意!

序列-这是区域文件的简单序列号,每次区域内容更改时必须递增。如果您不更新区域文件序列,您对区域所做的更改将不会被以前缓存了您区域中的记录的DNS解析器获取!在过去的日子里,这曾经是一种YYMMDDnn格式-但现在不再需要该格式,或者在某些情况下甚至不再支持该格式。只需从序列1开始您的区域,下次更改区域时递增到2,以此类推。

刷新-在此时间段之后,辅助名称服务器应向主名称服务器查询此SOA记录,以检测序列号的更改。如果序列号已递增,则必须使任何缓存的记录无效,然后重新从主命名服务器获取。

重试-如果主名称服务器没有响应SOA请求,则辅助名称服务器应该在尝试再次查询主名称服务器之前等待这么长时间。

过期-如果主名称服务器在这段时间内未能响应辅助名称服务器的SOA请求,则辅助名称服务器应完全停止为该域提供DNS解析。

负面缓存TTL-此选项控制负面响应(例如,我没有您请求的记录)应缓存多长时间。

SOA记录中最容易混淆的区域之一是参数刷新、重试和过期有什么影响。这些参数根本不会影响DNS解析程序-仅影响域的次要权威名称服务器。如果您的域没有一个或多个使用绑定复制从主服务器检索更新的辅助名称服务器,则这些参数不会有任何效果。

最后一点注意:旧版本的BIND要求所有这些时间都在几秒钟内……。即使实际时间间隔是以天或周为单位。BIND9是近20年前于2000年10月发布的,它支持人类可读的时间前缀,如表示分钟的";m&34;、表示小时的";h";和表示天的";d";。“请在编写区域文件时使用这些人类可读的后缀;任何人都不必打开计算器就能计算出86,400秒等于一天!”

在这两条记录中,我们定义了主机名,它们是我们区域的权威名称服务器。再一次,我们为这些记录使用了点终止的FQDN。再一次,我们本可以使用未终止的主机名-ns1.example和ns2.example-并依靠我们的$Origin.tld命令来扩展它们。然而,这样做会使该区域更加混乱和难以阅读。

请注意,NS记录指定的是主机名,而不是IP地址。对于DNS新手来说,这是一个常见的困惑来源,正确处理是很重要的。您不能将空IP地址指定为域的名称服务器;您绝对必须在此处指定主机名。

最后,请注意,我们没有在这两行中指定域名本身-这是因为我们从上面的SOA记录中继承了它。我们从Example开始该行,它扩展到example.tld。由于我们没有指定另一个主机名,因此默认情况下,这些新的NS记录也适用于该主机名。

在现实世界中,您可能还会看到带有$Origin example.tld的区域文件,以及以SOA开头的区域文件,可能还会看到以特殊保留字符@开头的其他行。当您在区域文件中看到@作为主机名时,这仅仅意味着您正在使用空的$Origin,而没有任何进一步的限定符。

在这个简单的域中,我们只有一个邮件服务器,它的mail.example.tld。MX记录只告诉任何想要在example.tld中发送电子邮件到任何地址的人建立到此记录中指定的主机名的SMTP连接。

前面的参数-在本例中为10-是此特定记录中邮件服务器的数字优先级。数字越小,优先级越高。当一个域有多个SMTP服务器可用时,您还会看到多个MX记录,每个记录都有不同的优先级。从理论上讲,应该始终先尝试较高优先级的邮件服务器,而只有在较高优先级的服务器出现故障时才尝试较低优先级的邮件服务器。

行为良好的SMTP服务器确实遵循此协议-但垃圾邮件发送者有一种倾向,即首先故意以较低优先级的邮件服务器为目标,根据高优先级服务器可能是反垃圾邮件网关,而最低优先级服务器可能是裸露的、未过滤的终端服务器的理论进行操作。垃圾邮件发送者很烂。

A记录是区域文件的一部分,它实际上执行大多数人认为DNS所做的事情-它们将主机名转换为空的IPv4地址。在本例中,这只是一个示例文件-我们的example.tld的A记录仅解析为localhost,这与电影中的电话号码始终以exchange 555开头的原则相同。当然,在现实生活中,当您ping example.tld、将网络浏览器指向https://example.tld/,等等时,您需要输入预期回答的服务器的IP地址。

在这个简单的区域文件中,对于example.tld,我们只有一条A记录。在现实生活中,您可能会遇到几个-可能有多个网关服务器能够响应https://example.tld/;的网络请求,如果是这样的话,每个网关服务器都会在自己的线路上获得自己的A记录。

此TXT或文本记录仍然位于区域文件的HEAD部分,位于主机名example.tld下。所以它的作用域是整个example.tld域。您几乎可以将任何内容放在TXT记录中;这个特定的记录是SPF记录,其格式是为邮件服务器提供有关哪些机器被授权代表example.tld发送邮件的信息。

在这种情况下,我们是说我们使用的是SPF1版本的格式化。然后,我们通知查询此记录的任何人,example.tld的任何有效A记录都有权代表其发送邮件,该域的任何有效的A MX记录也是如此,最后,与mail.example.tld和www.example.tld的A记录相关联的IP地址有权发送邮件。最后,所有人都说,如果任何其他机器说它想要从example.tld的某个地址发送邮件,那么应该允许它...。但应该比专门授权的主机更仔细地检查它。

$Origin example.tld.ns1 in A 127.0.0.2ns2 in A 127.0.0.3 www in CNAME example.tld.mail in AAAA::1mail in A 127.0.0.4。

既然我们已经为域定义了所需的一切,我们就可以开始添加位于example.tld本身之下的任何主机名和子域的记录了。我们在这里做的第一件事是将我们的$Origin变量更改为example.tld。再次注意最后一个结束点-如果您忘记了它,事情会变得非常奇怪,您会想知道为什么您的记录都没有正确解析!

我们在这里看到了NS1、NS2和电子邮件的A组记录。这些A级记录的工作方式与域本身的A级记录相同-我们告诉BIND要将该主机名的请求解析到哪个IP地址。

我们还有mail.example.tld的AAAA记录-AAAA记录与A记录类似,但它们用于解析IPv6而不是IPv4。再一次,我们在示例中选择使用本地主机地址。如果您希望设置自己的邮件服务器,您将需要熟悉AAAA的记录-几年前,在没有完全使用IPv6 DNS的情况下,Google不再愿意与邮件服务器交谈!

我们在这里看到的最后一个记录类型是CNAME,它是Canonical name的缩写。这是一个别名-它允许您告诉BIND始终使用TARGET参数中指定的A记录解析对CNAMED主机的请求。在这种情况下,www in CNAME example.tld意味着如果有人要求www.example.tld,也应该分发example.tld本身的IP地址。

CNAME的记录很方便,但它们有点时髦。值得记住的是,CNAME的每个级别都需要另一次DNS查找-在这种情况下,请求解析www.example.tld的远程计算机将被告知";请查找example.tld。要找到您的答案,&34;然后需要为与example.tld关联的A记录发出单独的DNS请求。如果您的CNAME指向CNAME指向CNAME,则您'。致您的用户!

CNAME的记录还有进一步的限制。还记得我们怎么告诉你,MX和NS的记录必须指向主机名,而不是原始IP地址吗?更具体地说,他们必须直接指向A类记录,而不是CNAME类记录。如果您尝试设置MX mail.example.tld,后跟mail.example.tld。CNAME example.tld,您的区域文件将被破坏,并且MX的查找尝试将返回错误。

如果您正在管理您自己的域名系统,您将需要熟练使用命令行工具直接查询您的DNS服务器并查看它如何响应请求-很难仅通过将https://example.tld/应用程序放入浏览器并查看发生的情况来确定问题是DNS还是其他原因。

You@box:[email protected] NS example.tld;<;<;>;dig9.16.1-ubuntu;<;<;>;>;NS example.tld;全局选项:+cmd;;得到答案:;;->;>;Header<;<;-opcode:查询,状态:无,ID:51417;;标志:QQ。Edns:版本:65494,标志:;udp:65494;;问题部分:;example.tld。在NS;中;答案部分:example.tld。300英寸NS ns1.example.tld.example.tld。300 IN NS ns2.example.tld;;查询时间:40毫秒;;服务器:127.0.0.1(127.0.0.1);;时间:2020年8月22日星期六22 00:54:26;;消息大小rcvd:74。

如果您可以访问Linux、Mac或Windows Subsystem for Linux,那么到目前为止最好的命令行工具是DIGH。使用摘要就像指定要查询的服务器、要查找的记录类型以及它应该关联的FQDN一样简单。

在上面的示例中,我们要求地址为127.0.0.1的DNS服务器向我们显示与example.tld关联的所有NS服务器记录。除了我们想要的答案,我们还得到了大量的诊断信息-我们查询的DNS服务器在查询时没有返回错误,它说它是有问题的域的权威,等等。

如果您想要挖掘机闭嘴,并在没有所有冗长的诊断的情况下给出您正在寻找的答案,您还可以提供一个+短小的参数:

不过,请注意,如果没有任何答案可用于简短查询(例如,如果您输入了域名),即使被查询的DNS服务器返回错误,您也不会得到任何响应。

如果你想找出为什么你没有得到答案,你需要丢掉这个简短的论点才能找出答案。

如果您没有权限进行挖掘,您通常可以使用nslookup勉强度日。最常见的情况是,对于坐在Windows包厢中、无法访问Windows Subsystem for Linux、Cygwin或其他方式的用户来说,这是一种半受诅咒的解决方法,无法访问比Windows CLI提供的更高级的工具。

Nslookup通常在没有参数的情况下调用,并以交互模式进行查询。以下是一个示例会话:

通过设置服务器127.0.0.1,我们将nslookup指定为使用该计算机作为要查询的DNS服务器。您不必指定此名称;如果您不指定,nslookup将使用您计算机上的默认DNS解析器。

在可选地设置服务器之后,您只需在nslookup的交互提示符中键入一个空主机名,它将返回它可以为该主机名找到的任何A或AAAA记录。

如果要在远程服务器上查询不同类型的记录,则需要使用set type命令。

>;set type=ns>;example.tldServer:127.0.0.1地址:127.0.0.1#53非权威答案:example.tld namerver=ns1.example.tld.example.tld namerver=ns2.example.tld权威答案可从:>;set type=mx>;找到。Example.tldServer:127.0.0.1地址:127.0.0.1#53非权威答案:example.tld邮件交换器=10 mail.example.tld权威答案可从以下地址找到:example.tld名称服务器=ns2.example.tld.example.tld名称服务器=ns1.example.tld.mail.example.tld互联网地址=127.0.0.4>;exit。

在上面的示例中,我们使用set type=ns和set type=mX来查询远程DNS服务器以获得example.tld的NS和MX记录。它起作用了,你会得到你的答案..。但是语法很繁琐,可用的诊断信息较少,可脚本化程度大大降低,如果您和我们一样,在完成之前,您很可能会咒骂这个过时的东西一两次。

退出nslookup交互模式的正确方法是命令exit。希望您永远不需要查找也名为Exit的顶级域的信息-或者,如果您这样做了,那么当您这样做时,您将拥有一个比nslookup更好的工具。

希望您今天学到了一些关于DNS如何工作以及它的信息是如何存储的有价值的东西。虽然BIND不是唯一的DNS服务器平台-尤其是Windows管理员需要使用Active Directory DNS-但这里学到的经验几乎同样适用于所有平台和应用程序。

尽管存储格式可能会因服务器而有所不同-例如,Active Directory域控制器在Active Directory本身内部直接存储区域,而不是纯文本文件-但是记录类型是通用的,并且格式至少接近通用。

如果您是一名初出茅庐的系统管理员或对运行您自己的DNS服务器感兴趣的发烧友,我强烈建议您这样做-当您这样做时,请使用原始平台;绑定到Linux或BSD上。运行域名服务器的系统负载几乎不存在,除非是真正巨大的规模;一个5美元的Digital Ocean或Linode盒子就可以很好地处理这项工作。

除了学习如何管理这些东西的纯粹乐趣之外,您可能还会发现,您看重将TTL设置得短得离谱的能力-大多数托管DNS服务器不允许TTL小于3000万,而且大多数服务器会尝试将您的TTL默认为长达一周的TTL。这对于DNS区域来说是很好的,它已经正确设置,不需要更改。但是如果你的IP地址改变了,你的DNS也需要随之改变,五分钟的TTL是非常非常好的。