DNS是互联网的核心协议之一。无论是上网还是编程,都需要有所了解。
本文详细介绍了DNS的原理,以及如何使用工具软件观察其运行。我的目标是,看完这篇文章,你能充分了解DNS。
一、什么是DNS?
DNS(域名系统的缩写)的作用很简单,就是根据域名找出IP地址。你可以把它想象成一本巨大的电话簿。
例如,如果你想访问域名math.stackexchange.com,你必须首先通过DNS找到它的IP地址是151.101.129.69。
如果你不知道为什么一定要找出IP地址才能在网上交流,我建议你先看看我写的互联网协议入门。
二。查询过程
虽然只需要返回一个IP地址,但是DNS的查询过程非常复杂,分为几个步骤。
Dig可以显示整个查询过程。
$挖math.stackexchange.com
上面的命令将输出六条信息。
第一段是查询参数和统计。
第二段是查询的内容。
以上结果显示,查询域名math.stackexchange.com的A记录,A是地址的缩写。
第三段是DNS服务器的回复。
上述结果表明,math.stackexchange.com有四个A记录,即四个IP地址。00是TTL值(生存时间的缩写),表示缓存时间,即600秒内不需要再次查询。
第四部分显示stackexchange.com的NS记录(名称服务器的缩写),即哪些服务器负责管理stackexchange.com的DNS记录。
上述结果表明,在stackexchange.com有四个NS记录,即四个域名服务器。你可以通过查询任何一个来找到math.stackexchange.com的IP地址。
第五段是上面四个域名服务器的IP地址,和上一段一起返回。
第六段是DNS服务器的一些传输信息。
以上结果显示,本地DNS服务器为192.168.1.253,查询端口为53(DNS服务器默认端口),响应长度为305字节。
如果不想看到那么多内容,可以使用+short参数。
$dig+做空math.stackexchange.com
151.101.129.69
151.101.65.69
151.101.193.69
151.101.1.69
上述命令只返回与math.stackexchange.com对应的四个IP地址(即一条记录)。
三。DNS服务器
我们按照前面的例子一步步还原吧。这台机器怎么能得到域名math.stackexchange.com的IP地址?
首先,电脑必须知道DNS服务器的IP地址,否则无法上网。只有通过DNS服务器才能知道一个域名的IP地址是什么。
DNS服务器的IP地址,可能是动态的,每次上线都是由网关分配的,这叫DHCP机制;也可能是预先指定的固定地址。在linux系统中,DNS服务器的IP地址保存在/etc/resolv.conf文件中。
上例中的DNS服务器是192.168.1.253,这是一个内部网地址。还有一些公共DNS服务器也可以使用,最著名的有谷歌的8.8.8.8和Level3的4.2.2.2。
这台机器只查询自己的DNS服务器,dig命令有一个@参数,显示查询其他DNS服务器的结果。
$dig@4.2.2.2math.stackexchange.com
上述命令指定查询DNS服务器4.2.2.2。
四。域名层次结构
DNS服务器怎么知道每个域名的IP地址?答案是分级查询。
请仔细看前面的例子。每个域名的末尾都多了一个点。
例如,域名math.stackexchange.com显示为math.stackexchange.com。这不是疏忽,实际上所有域名的末尾都有一个根域名。
例如,www.example.com的真实域名是www.example.com.root,缩写为www.example.com。因为根域名。root对于所有域名都是一样的,通常会被省略。
根域名的下一级称为“顶级域”(TLD),如。com和。网;;下一级称为“二级域”(缩写为SLD),如。www.example.com的例子。这个级别的域名可以由用户注册;下一级是主机名(host),如www.example.com的www,也称“三级域名”,是用户在自己的域内分配给服务器的名称,用户可以任意分配。
综上所述,域名的层次结构如下。
主机名。子域。顶级域名。根域
#那就是
主机.sld.tld.root
五、根域名服务器
DNS服务器根据域名的级别进行分层查询。
需要明确的是,每个级别域名都有自己的NS记录,NS记录指向该级别域名的域名服务器。这些服务器知道下一级域名的各种记录。
所谓“分层查询”,就是从根域名开始依次查询每一级域名的NS记录,直到找到最终的IP地址。流程大致如下。
仔细看上面的过程,你可能会发现其中并没有提到DNS服务器是如何知道“根域名服务器”的IP地址的。答案是“根域名服务器”。一般NS记录和IP地址不会改变,所以内置在DNS服务器中。
以下是内置根域名服务器IP地址的示例。
在上面的列表中,根域名的三个NS记录(。root)列出了:A.ROOT-SERVERS.NET、B.ROOT-SERVERS.NET和C.ROOT-SERVERS.NET,以及它们的IP地址(即A记录):198.41.0.4、192.228.79.201和192.33.4.12。
另外可以看到所有记录的TTL值都是3600000秒,相当于1000小时。即每1000小时查询一次根域名服务器列表。
目前,世界上有十三组根域名服务器,从A.ROOT-SERVERS.NET到M.ROOT-SERVERS.NET。
六。分层查询的示例
dig命令的+trace参数可以显示DNS的整个分层查询过程。
$挖掘+追踪math.stackexchange.com
上述命令的第一段列出了根域名的所有NS记录。,即所有根域名服务器。
DNS服务器根据根域名服务器内置的IP地址,向所有这些IP地址发送查询请求,查询顶级域名服务器com的NS记录。在math.stackexchange.com。最先回复的根域名服务器将被缓存,以后只向此服务器发送请求。
然后第二段。
结果显示13NS的记录。com域名,并返回每条记录对应的IP地址。
然后,DNS服务器向这些顶级域名服务器发送查询请求,查询math.stackexchange.com子域名stackexchange.com的NS记录。
上面的结果显示stackexchange.com有四个NS记录,返回每个NS记录对应的IP地址。
然后,DNS服务器向上述四个NS服务器查询math.stackexchange.com的主机名。
上述结果表明,math.stackexchange.com有四个A记录,即所有四个IP地址都可以访问网站。它还显示第一个返回结果的NS服务器是ns-463.awsdns-57.com,其IP地址是205.251.193.207。
七。NS记录查询
Dig命令可以分别查看每个域名的NS记录。
$dignscom
$挖nsstackexchange.com
+短参数可以显示简化的结果。
$dig+shortnscom
$dig+shortnsstackexchange.com
八。DNS的记录类型
IP和域名的对应关系称为“记录”。根据使用场景,“记录”可以分为不同的类型(类型)。正如你之前看到的,有A记录和NS记录。
常见的DNS记录类型如下。
(1)A:Address记录(Address),返回域名指向的IP地址。
(2)NS:域名服务器记录(NameServer),返回存储下一级域名信息的服务器的地址。该记录只能设置为域名,不能设置为IP地址。
(3)MX:邮件交换,返回接收邮件的服务器地址。
(4)CNAME:规范名称记录,返回另一个域名,即当前查询的域名是另一个域名的跳转。详见下文。
(5)Ptr:指针记录,仅用于从IP地址查询域名。详见下文。
一般来说,为了保证服务的安全性和可靠性,至少应该有两条NS记录,可以有多条A记录和MX记录,这样就提供了服务的冗余性,防止了单点故障。
CNAME记录主要用于域名内部跳转,为服务器配置提供灵活性,用户不易察觉。例如,域名facebook.github.io就是一项CNAME记录。
$digfacebook.github.io
...
;;回答部分:
github.map.fastly.netCNAME的facebook.github.io.3370。
github.map.fastly.net。600英镑一辆103.245.222.133
以上结果显示facebook.github.io的CNAME记录指向github.map.fastly.net。也就是说,当用户查询facebook.github.io时,实际返回的是github.map.fastly.net的IP地址。这样做的好处是,当你更改服务器的IP地址时,只需要修改github.map.fastly.net的域名,用户的facebook.github.io域名不需要修改。
因为CNAME记录是替换的,一旦在域名中设置了CNAME记录,就不能设置其他记录(如A记录和MX记录)。这是为了防止冲突。例如,foo.com指向bar.com,两个域名有各自的MX记录。如果不一致,就会出现问题。由于MX记录通常是为顶级域名设置的,一般不允许用户为顶级域名设置CNAME记录。
Ptr记录用于从IP地址反转域名。dig命令的-x参数用于查询Ptr记录。
$dig-x192.30.252.153
...
;;回答部分:
153.252.30.192.in-addr.arpa.3600inptrpages.github.com。
以上结果显示,这台服务器在192.30.252.153的域名是pages.github.com。
反向查询的一个应用是防止垃圾邮件,即验证邮件的IP地址是否实际具有所声称的域名。
Dig命令可以查看指定的记录类型。
$挖一个github.com
$挖nsgithub.com
$digMXgithub.com
九。其他DNS工具
除了dig,还有其他一些小工具可以用。
(1)主机命令
host命令可以看作是dig命令的简化版本,它返回当前请求的域名的各种记录。
$主持人github.com
github.com已经和192.30.252.121谈过了
github.com邮件由ALT2.ASPMX.L.GOOGLE.COM五号负责处理。
github.com邮件由ALT4.ASPMX.L.GOOGLE.COM10号处理。
github.com邮件由ALT3.ASPMX.L.GOOGLE.COM10号处理。
github.com邮件由ALT1.ASPMX.L.GOOGLE.COM五号负责处理。
github.com邮件由ASPMX.L.GOOGLE.COM1号处理。
$主持人facebook.github.com
facebook.github.com是github.map.fastly.net的别名。
github.map.fastly.net已经和103.245.222.133谈过了
host命令还可以用于反向查询,即从IP地址查询域名,相当于dig-xx。
$主持人192.30.252.153
153.252.30.192.in-addr.arpa域名指针pages.github.com。
(2)nslookup命令
nslookup命令用于交互式查询域名记录。
$nslookup
>facebook.github.io
服务器:192.168.1.253
地址:192.168.1.253#
53非权威回答:
Facebook.github.iocanonicalname=github.map.fastly.net。
姓名:github.map.fastly.net
地址:103.245.222.133
>
(3)whois命令
whois命令用于检查域名的注册情况。
$谁是github.com
X.参考链接
DNS:精彩部分,作者皮特·基恩
DNS101,作者马克·麦克唐纳
(完)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)