赞
踩
在互联网上有多达到上亿的设备,而这些设备之间互相联通网络,每一台主机都需要一个唯一的标识符(就像是我们每个人都有一张身份证),而这个标识符就是IP地址,由于IP地址是数字,不利于人来使用,人们为了方便记忆,发明了点分十进制,但是还是不方便,又发明了域名,日常生活中使用的是域名。为了将域名和IP地址对应起来,又发明了DNS服务器。
DNS 是互联网上重要的基础应用程序,它作为一个分布式数据库,域名服务器分布在世界各地,储存着域名与 IP 地址的映射关系,每个域名服务器上值存储了部分域名信息。因此为了完成域名解析,通过需要在多个域名服务器之间进行查询。
什么时候需要DNS服务。 当浏览器解析到网址是一个域名,那么在发送数据报之前需要将域名转换为IP地址,才能去发包
当然,我们并不是直接就去访问DNS服务器,而是先去缓存中查询:
DNS只要使用TCP/UDP的53端口;
DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议;
区域传送使用TCP的原因:
域名解析时使用的是UDP协议:
客户端向DNS服务器查询域名,一般返回内容都不超过512个字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包;
DNS 为了实现域名的有效管理与高效的查询,它是按层级结构进行组织的,并且该层次结构与域名的结构( . 分隔)相对应,每个以点分隔的为 标签(label)。它所使用的所有名称集合构成了 DNS 名称空间(name space)。
域名的层级是从右往左看: 三级域名.二级域名.顶级域名.根域名
主机名.次级域名.顶级域名.根域名
baike.baidu.com.root
例如:客户端想要查询www.yahoo.com的IP
补充:DSN本质是一个数据库服务器,对于根域名服务器,具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技术,所以我们可以在全球设立这些IP的镜像站点,你访问到的这个IP并不是唯一的那台主机。
前提:
现在我要请求查询www.163.com这个域名:
先查询本地DNS缓存(自己电脑上),有则返回,没有进入下一步
查看本地hosts文件有没有相应的映射记录,有则返回,没有进入下一步
向本地的DNS服务器发送请求进行查询
根域名服务器收到请求后,看到这是个 .com 的域名,就会返回com域中的NS记录,一般来说是13台主机名和IP。
本地 DNS 服务器接收到回信后,照着老大哥给的联系方式(ip1),马上给 .com 这个顶级域名服务器的其中一台发起请求:请问 .com 大大,www.163.com 的ip 是啥?
.com 顶级域名服务器接收到请求后,看到这是 163.com 的域名,就回信说:这个域名是 .163.com 老弟管理的,你就去问他就行了,这是他的联系方式(ip2)
本地 DNS 服务器接收到回信后,按照前辈的指引(ip2),又向 .163.com 这个权威域名服务器发起请求:请问 163.com 大大,请问 www.163.com 的ip是啥?
163.com 权威域名服务器接收到请求后,确认了是自己管理的域名,马上查了下自己的小本本,把 www.163.com 的ip告诉了 本地DNS服务器。
本地DNS服务器接收到回信后,非常地开心,这下总算拿到了www.163.com的ip了,马上把这个消息告诉了要求查询的客户(就是你的电脑)。由于这个过程比较漫长,本地DNS服务器为了节省时间,也为了尽量不去打扰各位老大哥,就把这个查询结果偷偷地记在了自己的小本本上,方便下次有人来查询时,可以快速回应。
DNS查询分为递归查询和迭代查询
上面的几个步骤里,可以看到有两个地方会缓存 DNS 的查询记录,有了缓存,在一定程度上会提高查询效率,但同时在准确率上会有所损失。
因此我们在配置 DNS 解析的时候,会有一个 TTL 参数(Time To Live),意思就是这个缓存可以存活多长时间,过了这个时间,本地 DNS 就会删除这条记录,删除了缓存后,你再访问,就要重新走一遍上面的流程,获取最新的地址。
A(
Address
):
又叫做A记录,就是域名的对应的IP地址IPV4
AAAA:
将域名解析到一个指定的IPV6的IP上
CNAME:
别名解析,返回另一个域名,即当前查询的域名是另一个域名的跳转
NS(
Name Server
)
该域名由哪个DNS服务器来进行解析
ns1.domain.com、ns2.domain.com
等MX(
Mail eXchange
)
返回接收电子邮件的服务器地址。当存在多个MX记录时,按照优先级使用,越小越高
PTR(
Pointer Record
)
逆向查询记录,只用于从IP地址查询域名
站在客户端的角度,这是一次DNS递归查询过程。因为本地DNS全程为它效劳,它只要坐等结果即可。在这个过程中,DNS除了可以通过名称映射为IP地址,它还可以做另外一件事,就是负载均衡。
DNS首先可以做内部负载均衡:
DNS还可以做全局负载均衡:
相关的工具和命令: dig,nslookup,host等.其中以dig命令的功能最为强大和灵活.
$ nslookup WWW.baidu.com # 下面是DNS服务器的地址
Server: 192.168.0.1 # DNS服务器的主机名
Address: 192.168.0.1#53 # DNS服务器的IP地址
Non-authoritative answer: # 下面是查询到的结构
WWW.baidu.com canonical name = www.a.shifen.com. # 看dig的具体解析
Name: www.a.shifen.com # 解析的URL
Address: 180.101.49.12 # 解析出来的IP
Name: www.a.shifen.com
Address: 180.101.49.11
$ nslookup www.baidu.com 114.114.114.114
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 180.101.49.12
Name: www.a.shifen.com
Address: 180.101.49.11
- Dig工具会在本地计算机做迭代,然后记录查询的过程。
- linux系统自带有
dig常用参数
$ dig +trace WWW.baidu.com
;; Warning: Message parser reports malformed message packet.
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> +trace WWW.baidu.com
;; global options: +cmd
第一步是向我这台机器的DNS服务器192.168.0.1
(网络接入服务器商提供的DSN服务器)获取到根域服务区的13个IP和主机名[b-j].root-servers.net.。
- 从下面可以看出本地 DNS 服务器 ip 为 192.168.1.1,端口为53,你可以在 /etc/resolv.conf 里看到这个配置
- 根赋予服务器的IP一个十三个,从a.root-servers.net. 到m.root-servers.net. ,它们对应的ip地址,已经内置在DNS服务器中。
. 68951 IN NS c.root-servers.net.
. 68951 IN NS d.root-servers.net.
. 68951 IN NS e.root-servers.net.
. 68951 IN NS f.root-servers.net.
. 68951 IN NS g.root-servers.net.
. 68951 IN NS h.root-servers.net.
. 68951 IN NS i.root-servers.net.
. 68951 IN NS j.root-servers.net.
. 68951 IN NS k.root-servers.net.
. 68951 IN NS l.root-servers.net.
. 68951 IN NS m.root-servers.net.
. 68951 IN NS a.root-servers.net.
. 68951 IN NS b.root-servers.net.
;; Received 512 bytes from 192.168.0.1#53(192.168.0.1) in 6 ms
第二步是向其中的一台根域服务器192.36.148.17
发送www.baidu.com的查询请求,他返回了com.顶级域的服务器IP(未显示)和名称
com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766 com. 86400 IN RRSIG DS 8 1 86400 20201105050000 20201023040000 26116 . El41gNlSItGQmeUPR1JrBL/WsinowCVAY2m6WhyTl9ehb0t0QIWQLQOa VGQtJxHxpCPw/W1Qzlwd1GyIZXpA0wEgwK54i7QFSUxknlTHIuT4bRE9 H5E+TfTmD1rcrdQNJxcZNGFbAe/rsg1jm1iBzE4f6e0Z5XHrK3vqqSZi xA5nX6W95S6MwJNiY//3wVVUANef4AuUJ5E+Vrhd8oxFhGwcLxEJjUTw HbReMHDzTQ4JgupOLMKpjb3uxAxes71fJjugdb5X8hzO6sBFGWKnpHWT b0nMzTaUUghL4PG4OenW4lKcPgHohyf9DeHBxgaoeDVQ0TJyPBURlg+t WioLZA== ;; Received 1176 bytes from 192.36.148.17#53(i.root-servers.net) in 53 ms
第三步,便向com.域的一台服务器192.26.92.30
请求,www.baidu.com,他返回了baidu.com域的服务器IP(未显示)和名称,百度有5台顶级域的服务器
baidu.com. 172800 IN NS ns2.baidu.com.
baidu.com. 172800 IN NS ns3.baidu.com.
baidu.com. 172800 IN NS ns4.baidu.com.
baidu.com. 172800 IN NS ns1.baidu.com.
baidu.com. 172800 IN NS ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20201028044154 20201021033154 31510 com. QlJy9nZ6StpWIZMgZf9+xQt2vmdmTRNgHvOcQhFO9y8oxRpLwZn8wfX5 IX5iuTfGNC+BmOrjUbeue/onMkjY1P8otE9a7bc52mwLa8rFl574muLI bbLssIynZ+p4gelNSr+7bsHrGcWiuJCRmakSMI4PR/r896xzd/t9AIb8 LOauiINuIhFag9nBwguS9qDcq4cVIQK2s+X+HtvdSTOcQg==
HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN NSEC3 1 1 0 - HPVVN3Q5E5GOQP2QFE2LEM4SVB9C0SJ6 NS DS RRSIG
HPVUSBDNI26UDNIV6R0SV14GC3KGR4JP.com. 86400 IN RRSIG NSEC3 8 2 86400 20201028063404 20201021052404 31510 com. Jz5t4ki9CHs2toHA5ngBnoIc3xCT9SJsy3F52Gx55S47j73pecdqK0Ga 7k/Q2zsc+1D8yeV8YvDprhywauNw+JjDZFu4AX5LUr1xxx80yyYVFiMJ uVaQ9qkuSBWlUa7jFMy/DCJMfRv5uoLuvVu1SkAc1WD+xAdcxRAB3e7G 7bZNYEdswprcevF+nOs6hFa9GSgissYzIx+wG90LY44pFg==
;; Received 761 bytes from 192.26.92.30#53(c.gtld-servers.net) in 236 ms
此处可以用dig @192.26.92.30 www.baidu.com查看返回的百度顶级域名服务器IP地址
第四步呢,向百度的顶级域服务器(202.108.22.220)请求www.baidu.com,他发现这个www有个别名,而不是一台主机,别名是www.a.shifen.com。
这是整个请求中的最后一步,当dig查到了别名,整个请求就终止了。
WWW.baidu.com. 1200 IN CNAME www.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
;; Received 239 bytes from 202.108.22.220#53(ns1.baidu.com) in 35 ms
但是我们要的是IP而不是别名啊,为什么会终止呢?
待实践
总结:
$ dig www.baidu.com @8.8.8.8 # (谷歌服务器) ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> www.baidu.com @8.8.8.8 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57501 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.baidu.com. IN A ;; ANSWER SECTION: www.baidu.com. 1031 IN CNAME www.a.shifen.com. www.a.shifen.com. 198 IN CNAME www.wshifen.com. www.wshifen.com. 198 IN A 104.193.88.123 www.wshifen.com. 198 IN A 104.193.88.77 ;; Query time: 39 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: 五 10月 23 14:47:58 CST 2020 ;; MSG SIZE rcvd: 127
ps:我的机器上下面这个请求没有反应
dig www.baidu.com
$ dig +noall +answer www.baidu.com @8.8.8.8
www.baidu.com. 863 IN CNAME www.a.shifen.com.
www.a.shifen.com. 272 IN CNAME www.wshifen.com.
www.wshifen.com. 290 IN A 103.235.46.39
$ dig www.baidu.com @8.8.8.8 +short
www.a.shifen.com.
www.wshifen.com.
103.235.46.39
利用管理员配置不当,查询该域名下的所有服务器
dig @ns4.sina.com(该域名下的ns服务器)sina.com axfr
可以看出连接失败了,因为新浪不存在该漏洞
$ dig cname www.baidu.com @8.8.8.8 +short
www.a.shifen.com.
host 命令 可以看作dig命令的简化版本,返回当前请求域名的各种记录。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。