DNS消息-解构查询和响应机制 (DNS消息类型)
引言
域名系统(DNS)是互联网的基础设施,它将域名(如 "google.com")翻译成计算机可以理解的 IP 地址(如 "142.250.18.101")。当您在浏览器中输入一个域名时,DNS 会在后台执行以下操作: 1. 浏览器向 DNS 服务器发送一个查询消息。 2. DNS 服务器查找域名对应的 IP 地址。 3. DNS 服务器将 IP 地址发送回浏览器。查询消息
查询消息包含有关要查找的域名以及所请求的信息类型的信息。以下是一个针对 "image.google.com" 的示例查询消息:
0000 05 image 00 01 00 00 00 00 00 00 00 00 ...image.........
0010 00 01 00 00 01 00 00 00 00 00 00 00 00 00 ................
0020 00 00 00 0000 00 00 00 00 00 00 00 00 00 ................
以下是查询消息的内容:
问题数:1
答案 RR:0
查询:image.google.com
域名编码
在查询消息中,域名使用点(.)作为分隔符编码。例如,"image.google.com" 编码为:
05 image 00 01 00 00 00 00 00 00 00 00 ...image.........
其中:
05 表示接下来的 5 个字节是域名的第一部分。
image 是域名的第一部分。
00 表示该部分的结束。
响应消息
当 DNS 服务器找到域名对应的 IP 地址时,它会向浏览器发送一个响应消息。响应消息包含查询消息以及 IP 地址:
0000 05 image 00 01 00 00 00 00 00 00 00 00 ...image.........
0010 00 01 00 00 01 00 00 00 00 00 00 00 00 00 ................
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00 01 00 00 03 00 00 00 00 00 00 00 00 00 ...............
0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01a0 00 00 00 00 0000 00 00 00 00
5分钟教你搞懂 DNS
DNS也叫网域名称系统,是互联网的一项服务。它实质上是一个域名和IP相互映射的分布式数据库,有了它,我们就可以通过域名更方便的访问互联网。
DNS特点有分布式的,协议支持TCP和UDP,常用端口是53,每一级域名的长度限制是63,域名总长度限制是253。
最早的时候,DNS的UDP报文上限大小是512字节,所以当某个response大小超过512(返回信息太多),DNS服务就会使用TCP协议来传输。后来DNS协议扩展了自己的UDP协议,DNS client发出查询请求时,可以指定自己能接收超过512字节的UDP包,这种情况下,DNS还是会使用UDP协议。
分层的数据库结构:
DNS的结构跟Linux文件系统很相似,像一棵倒立的树。下面用站长之家的域名举例:最上面的.是根域名,接着是顶级域名,再下来是站长之家域名chinaz依次类推。使用域名时,从下而上。就是一个完整的域名,也是。
之所以设计这样复杂的树形结构,是为了防止名称冲突。这样一棵树结构,当然可以存储在一台机器上,但现实世界中完整的域名非常多,并且每天都在新增、删除大量的域名,存在一台机器上,对单机器的存储性能就是不小的挑战。
另外,集中管理还有一个缺点就是管理不够灵活。可以想象一下,每次新增、删除域名都需要向中央数据库申请是多么麻烦。所以现实中的DNS都是分布式存储的。
根域名服务器只管理顶级域,同时把每个顶级域的管理委派给各个顶级域,所以当你想要申请下的二级域名时,找域名注册中心就好了。二级域名,再向下的域名就归你管理了。
当你管理http://chinaz的子域名时,你可以搭建自己的nameserver,在注册中心把//chinaz的管理权委派给自己搭建的nameserver。自建nameserver和不自建的结构图如下:
一般情况下,能不自建就不要自建,因为维护一个高可用的DNS也并非容易。据我所知,有两种情况需要搭建自己的nameserver:
搭建对内的DNS。公司内部机器众多,通过ip相互访问太过凌乱,这时可以搭建对内的nameserver,允许内部服务器通过域名互通。公司对域名厂商提供的nameserver性能不满意。
![DNS消息类型](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
虽然顶级域名注册商都有自己的nameserver,但注册商提供的nameserver并不专业,在性能和稳定性上无法满足企业需求,这时就需要企业搭建自己的高性能nameserver,比如增加智能解析功能,让不同地域的用户访问最近的IP,以此来提高服务质量。
概括一下DNS的分布式管理,当把一个域委派给一个nameserver后,这个域下的管理权都交由此nameserver处理。这种设计一方面解决了存储压力,另一方面提高了域名管理的灵活性。
顶级域名像这样的顶级域名,由ICANN严格控制,是不允许随便创建的。顶级域名分两类:通用顶级域名,国家顶级域名。
通用顶级域名常见的如、、等,国家顶级域名如我国的,美国的。一般公司申请公网域名时,如果是跨国产品,应该选择通用顶级域名。
如果没有跨国业务,看自己喜好(可以对比各家顶级域的服务、稳定性等再做选择)。这里说一下几个比较热的顶级域,完整的顶级域参见维基百科。
meme顶级域其实是国家域名,是黑山共和国的国家域名,只不过它对个人开发申请,所以很多个人博主就用它作为自己的博客域名。
io很多开源项目常用io做顶级域名,它也是国家域名。因为io与计算机中的input/output缩写相同,和计算机的二机制10也很像,给人一种geek的感觉。相较于.域名,下的资源很多,更多选择。
DNS解析流程:
聊完了DNS的基本概念,我们再来聊一聊DNS的解析流程。当我们通过浏览器或者应用程序访问互联网时,都会先执行一遍DNS解析流程。
标准glibc提供了.2动态库,我们的应用程序就是用它进行域名解析(也叫resolving)的,它还提供了一个配置文件/etc/来控制resolving行为,配置文件中最关键的是这行:
hosts:files dns myhostname。
它决定了resolving的顺序,默认是先查找hosts文件,如果没有匹配到,再进行DNS解析。默认的解析流程如下图:
上图主要描述了client端的解析流程,我们可以看到最主要的是第四步请求本地DNS服务器去执行resolving,它会根据本地DNS服务器配置,发送解析请求到递归解析服务器(稍后介绍什么是递归解析服务器),本地DNS服务器在/etc/中配置。下面我们再来看看服务端的resolving流程:
我们分析一下解析流程:
客户端向本地DNS服务器(递归解析服务器)发出解析//域名的请求,本地dns服务器查看缓存,是否有缓存过//域名,如果有直接返回给客户端;如果没有执行下一步。
本地dns服务器向根域名服务器发送请求,查询顶级域的nameserver地址,拿到域名的IP后,再向 nameserver发送请求,获取chinaz域名的nameserver地址。
继续请求chinaz的nameserver,获取tool域名的地址,最终得到了//的IP,本地dns服务器把这个结果缓存起来,以供下次查询快速返回。
本地dns服务器把把结果返回给客户端,递归解析服务器vs权威域名服务器,我们在解析流程中发现两类DNS服务器,客户端直接访问的是递归解析服务器,它在整个解析过程中也最忙。它的查询步骤是递归的,从根域名服务器开始,一直询问到目标域名。
递归解析服务器通过请求一级一级的权威域名服务器,获得下一目标的地址,直到找到目标域名的权威域名服务器,简单来说:递归解析服务器是负责解析域名的,权威域名服务器,是负责存储域名记录的。
递归解析服务器一般由ISP提供,除此之外也有一些比较出名的公共递归解析服务器,如谷歌的8.8.8.8,联通的114,BAT也都有推出公共递归解析服务器,但性能最好的应该还是你的ISP提供的,只是可能会有DNS劫持的问题。
缓存,由于整个解析过程非常复杂,所以DNS通过缓存技术来实现服务的鲁棒性。当递归nameserver解析过//域名后,再次收到//查询时,它不会再走一遍递归解析流程,而是把上一次解析结果的缓存直接返回。
并且它是分级缓存的,也就是说,当下次收到的是//的查询时,由于这台递归解析服务器已经知道//chinaz的权威nameserver,所以它只需要再向//chinaz nameserver发送一个查询www的请求就可以了。
根域名服务器的地址是固定的,目前全球有13个根域名解析服务器,这13条记录持久化在递归解析服务器中:
为什么只有13个根域名服务器呢,不是应该越多越好来做负载均衡吗?之前说过DNS协议使用了UDP查询,由于UDP查询中能保证性能的最大长度是512字节,要让所有根域名服务器数据能包含在512字节的UDP包中,根服务器只能限制在13个,而且每个服务器要使用字母表中单字母名。
智能解析,就是当一个域名对应多个IP时,当你查询这个域名的IP,会返回离你最近的IP。由于国内不同运营商之间的带宽很低,所以电信用户访问联通的IP就是一个灾难,而智能DNS解析就能解决这个问题。
智能解析依赖EDNS协议,这是google起草的DNS扩展协议,修改比较简单,就是在DNS包里面添加origin client IP,这样nameserver就能根据client IP返回距离client比较近的server IP了。
国内最新支持EDNS的就是DNSPod了,DNSPod是国内比较流行的域名解析厂商,很多公司会把域名利用DNSPod加速。
一般我们要注册域名,都要需要找域名注册商,比如说我想注册//hello,那么我需要找域名注册商注册hello域名。的域名注册商不止一家,这些域名注册商也是从ICANN拿到的注册权,参见如何申请成为.域名注册商。
域名注册商都会自建权威域名解析服务器,比如你在狗爹上申请一个.下的二级域名,你并不需要搭建nameserver,直接在godaddy控制中心里管理你的域名指向就可以了,原因就是你新域名的权威域名服务器默认由域名注册商提供。
当然你也可以更换,比如从godaddy申请的境外域名,把权威域名服务器改成DNSPod,一方面加快国内解析速度,另一方面还能享受DNSPod提供的智能解析功能。
用bind搭建域名解析服务器,由于网上介绍bind搭建的文章实在太多了,我就不再赘述了,喜欢动手的朋友可以网上搜一搜搭建教程,一步步搭建一个本地的nameserver玩一玩。这里主要介绍一下bind的配置文件吧。
bind的配置文件分两部分,bind配置文件和zone配置文件,bind配置文件位于/etc/,它主要负责bind功能配置,如zone路径、日志、安全、主从等配置其中最主要的是添加zone的配置以及指定zone配置文件。
开启递归解析功能,这个如果是no,那么此bind服务只能做权威解析服务,当你的bind服务对外时,打开它会有安全风险,如何防御不当,会让你的nameserver被hacker用来做肉鸡zone的配置文件在bind配置文件中指定,下图是一份简单的zone配置:
zone的配置是nameserver的核心配置,它指定了DNS资源记录,如SOA、A、CNAME、AAAA等记录,各种记录的概念网上资料太多,我这里就不重复了。其中主要讲一下SOA和CNAME的作用。
SOA记录表示此域名的权威解析服务器地址。上文讲了权威解析服务器和递归解析服务器的差别,当所有递归解析服务器中有没你域名解析的缓存时,它们就会回源来请求此域名的SOA记录,也叫权威解析记录。
CNAME的概念很像别名,它的处理逻辑也如此。一个server执行resloving时,发现name是一个CNAME,它会转而查询这个CNAME的A记录。一般来说,能使用CNAME的地方都可以用A记录代替,它是让多个域名指向同一个IP的一种快捷手段。
这样当最低层的CNAME对应的IP换了之后,上层的CNAME不用做任何改动。就像我们代码中的硬编码,我们总会去掉这些硬编码,用一个变量来表示,这样当这个变量变化时,我们只需要修改一处。
配置完之后可以用named-checkconf和named-checkzone。两个命令来check我们的配置文件有没有问题,之后就可以启动bind服务了:$>service named start,Redirecting to/bin/systemctl restart 。
我们用netstat-ntlp,来检查一下服务是否启动,53端口已启动,那么我们测试一下效果,用dig解析一下域名,使用127.0.0.1作为递归解析服务器。
我们看到dig的结果跟我们配置文件中配置的一样是1.2.3.4,DNS完成了它的使命,根据域名获取到IP。用DNS实现负载均衡,一个域名添加多条A记录,解析时使用轮询的方式返回随机一条,流量将会均匀分类到多个A记录。www IN A1.2.3.4,www IN A1.2.3.5。
其实每次DNS解析请求时,nameserver都会返回全部IP,如上面配置,它会把1.2.3.4和1.2.3.5都返回给client端。那么它是怎么实现RR的呢?nameserver只是每次返回的IP排序不同,客户端会把response里的第一个IP用来发请求。DNS负载均衡vs LVS专业负载均衡。
和LVS这种专业负载均衡工具相比,在DNS层做负载均衡有以下特点:实现非常简单,默认只能通过RR方式调度,DNS对后端服务不具备健康检查。
DNS故障恢复时间比较长(DNS服务之间有缓存),可负载的rs数量有限(受DNS response包大小限制),真实场景中,还需要根据需求选择相应的负载均衡策略子域授权。
我们从.域下申请一个二级域名http://hello.后,发展到某一天我们的公司扩大了,需要拆分两个事业部A和B,并且公司给他们都分配了三级.和.,域名结构如下图:
再发展一段时间,A部门和B部门内部业务太多,需要频繁的为新产品申请域名,这个时候他们就想搭建自己的namserver,并且需要上一级把相应的域名管理权交给自己,他们期望的结构如下:
注意第一阶段和第二阶段的区别:第一阶段,A部门想申请//下的子域名,需要向上级申请,整个//域的管理都在总公司;第二阶段,A部门先自己搭建nameserver,然后总公司把http://域管理权转交给自建的nameserver。
A部门自建nameserver,并且在zone配置文件中指定//的权威解析服务器为自己的nameserver地址,总公司在nameserver上增加一条NS记录,把//域授权给A部门的nameserver。
我们在用bind搭建域名解析服务器里讲过,只要在zone配置文件里指定SOA记录就好:@IN SOA . ..(……)。
在http://hello.域的nameserver上添加一条NS记录. IN NS . IN A (自建nameserver的IP)。
这样当解析http://.域名时,//hello. nameserver发现配置中有NS记录,就会继续递归向下解析,DNS调试工具,OPS常用的DNS调试工具有:host,nslookup,dig。
这三个命令都属于bind-utils包,也就是bind工具集,它们的使用复杂度、功能依次递增。关于它们的使用,man手册和网上有太多教程。DNS放大攻击属于DoS攻击的一种,是通过大量流量占满目标机带宽,使得目标机对正常用户的请求拒绝连接从而挂掉。
思路正常的流量攻击,hack机向目标机建立大量request-response,但这样存在的问题是需要大量的hack机器。因为服务器一般的带宽远大于家用网络,如果我们自己的家用机用来做hack机器,还没等目标机的带宽占满,我们的带宽早超载了。
原理DNS递归解析的流程比较特殊,我们可以通过几个字节的query请求,换来几百甚至几千字节的resolving应答(流量放大),并且大部分服务器不会对DNS服务器做防御。
那么hacker们只要可以伪装DNS query包的source IP,从而让DNS服务器发送大量的response到目标机,就可以实现DoS攻击。
但一般常用的DNS服务器都会对攻击请求做过滤,所以找DNS服务器漏洞也是一个问题。详细的放大攻击方法自行google。
dns码怎么查询如何查dns码
什么是DNS代码?
域名解析服务器,可以找到你要访问的网站,并将信息发送到你的电脑上。DNS是域名系统的缩写,由一个解析器和一个域名服务器组成。域名服务器是指存储网络中所有主机的域名和对应的IP地址,并具有将域名转换为IP地址功能的服务器。域名必须对应一个IP地址,IP地址不一定有域名。
域名系统采用类似目录树的层次结构。域名是客户机/服务器模式中的服务器端,它有两种主要形式:主服务器和转发服务器。将域名映射到IP地址的过程称为“域名解析”。
在互联网上,域名和IP地址是一对一(或者多对一)的。虽然域名很容易让人记住,但是机器只能知道彼此的IP地址。它们之间的转换称为域名解析。域名解析需要由专门的域名解析服务器来完成,DNS就是域名解析的服务器。
DNS在TCP/IP网络(如Internet)中使用,通过用户友好的名称来查找计算机和服务。当用户在应用程序中输入DNS名称时,DNS服务可以将该名称解析为与之相关的其他信息,如IP地址。因为,当你上网的时候,你输入的网址是由域名解析系统解析找到对应的IP地址,这样你就可以上网了。其实域名的终极点就是IP。
dns的两种查询方式?
第一种方法:
1,首先,我们要把电脑开机,接着要在待机屏幕上把左下角的开始按钮打开,点击运行窗口,在输入框内输入cmd,系统就会自动进入命令指示符状态。
2,在命令输入框内输入ipconfig/all。
3,在呈现出的页面当中找到DNS地址,一般情况下我们的DNS服务器的地址都是中国的。
我们能够看到在显示的消息框内有一个“本地连接”按钮,我们平时都是可以在这个地方看DNS地址的,其中标有红色的部分就属于您的专属DNS服务器地址了。
4,所以在下次遇到故障的时候,我们只要能把DNS服务器的地址查询到,就能根据TCP/IP协议轻松解决了。
注:这种方法简单易行,比较适合解决由于设置问题而导致的域名不稳定问题。但只要我们进行简单的设置,就能很好的找到服务器的地址,并且快速有效地解决问题。
第二种方法:
1,把电脑打开之后点击左下角的开始菜单,选择里面的控制面板功能。
2,当控制面板功能打开之后,要双击“网络连接”菜单,这样就能进入网络连接的设置页面。
3,用鼠标右击本地连接的按钮,这时候就会弹出一个快捷菜单,在这个快捷菜单上找到“属性”选项卡。
4,接着我们就要进入“常规”选项卡当中,然后在这个选项卡里面找到协议的列表框,双击选择“Internet协议(TCP/IP)”。
5,接着把Internet协议(TCP/IP)的“属性”窗口打开,只要我们打开“常规”界面就能看到关于DNS服务器地址的设置了。
如何打开DNS?
打开并查看DNS方法:
1.首先在屏幕的左下角点【开始】;
2.选择,在空白处输入cmd;
3.输入cmd后点,然后输入ipconfig/all;
4.敲回车,会显示出本地连接的IP地址、网关、DNS;
如何查询当地的dns?
查询当地dns的方法有如下几种:1、咨询网络服务商:当地使用什么DNS,网络服务商应该最清楚,对于客户也完全有义务进行解释和回复,而且在上门安装宽带时也会为客户配置好包括DNS在内的所有上网参数。
2、从电脑端查看:对于已经配置好网络参数能够正常上网的电脑,可以直接查看其参数配置。如可利用CMD命令查看,其操作步骤如下:(1)打开“开始”菜单,从所有程序中找到“附件”,再从附件中打开“命令提示符”,输入命令“ipconfig/all”并回车。(2)执行命令显示所有网络配置后,找到IPv4地址这一项,后面的值即为可用IP地址,当然还有网关,DNS服务器的主,备用地址,将这些都记下。windows上dns记录怎么查看命令?
具体方法用以下的步骤就可以:
1、首先按住win+R键打开命令窗口,在命令窗口中输入control。
2、点击确定后打开控制面板,在控制面板界面中找到网路和共享中心。
3、点击网路和共享中心后在弹出界面中点击以太网。
4、在以太网状态界面点击详细信息选项。
5、点击详细信息后,可以看到当前网卡的信息包括了DNS信息。
怎么查自己电脑DNS服务器?
你好!我是大白()我相信科技可以改变生活!欢迎与我交流。
怎么查自己电脑DNS服务器?
方法一:用命令查看
【Win+R键】打开【运行】,输入CMD
在输入ipconfig/all,查看DNS服务器,如下图:
或输入nslookup查看,如下图:
方法二:在本地连接中查看
依次点击【开始】-【控制面板】-【网络和共享中心】-点【本地连接】后面的【查看详细信息】。
方法三:使用电脑管家中的【DNS优选】工具查看
如图:
我是热心的大白,希望我的能帮助到您!感谢【点赞】【关注】!
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。