本发明涉及一种获取域名所有资源记录的系统,属于网络测量
技术领域:
。
背景技术:
域名系统(domainnamesystem,dns)是逐级授权的分布式数据库,提供ip地址和域名之间的翻译服务,是互联网最为重要的基础设施之一,其安全性和可用性直接影响着互联网的服务质量。dns协议规范中要求域配置多个备份的权威服务器来增加域名解析的性能和可靠性,而且推荐将多个备份服务器分散在不同的地域来增加域名解析的容错及容灾能力,在实现中,dns域管理员可能将一些拥有其他域的域名的服务器作为本域的服务器,虽然达到了增加备份服务器的目的,但是也使此域名的解析不仅需要此域名及其父域的权威服务器,也需要其他服务器和域,dns中所有数据以资源记录的形式存储在服务器中,因此获取域名解析所有可能用到的资源记录,对管理者评价自己域名的安全性以并合理部署域名服务器有重要意义。技术实现要素:本发明的目的是提供一种获取域名所有资源记录的系统,以向域名管理者提供评价自己域名的安全性以及合理部署域名服务器参考。本发明为解决上述技术问题采取的技术方案是:一种获取域名所有资源记录的系统,所述系统输入为待查询域名,输出为包含该域名解析过程中所有资源记录的文件;所述系统包:域名解析模块:域名解析模块是所述系统的核心,用于对待查询域名进行解析,进行解析时读取待查询域名,将待查询域名中解析为对应的ip地址,在解析过程中对查询发送和应答接收模块返回的应答报文进行分析产生新的问题和新的服务器ip地址,再将该新的问题和新的服务器ip地址发送给查询发送和应答接收模块,域名解析模块还用于,在域名解析过程中产生错误时向错误日志管理模块发送错误日志;查询发送和应答接收模块:用于接收域名解析模块发送的问题和服务器ip地址,向该服务器ip地址发送对应的问题,并将接收到的应答返回给域名解析模块,同时将该应答作为系统的输出储存在所有资源记录的文件,查询发送和应答接收模块还用于,在查询发送和应答接收过程中产生错误时向错误日志管理模块发送错误日志;错误日志管理模块:用于将收到的所有错误日志存储到错误日志文件中。进一步地,将待查询域名中解析为对应的ip地址,其过程为:1.输入目标域名(待查询域名),设当前查询域名为目标域名,2.将根域名服务器ip地址放入查询服务器ip地址列表server_list;3.对于server_list中的ip地址,如果其与当前查询域名组成的二元组不在queried_list中,则向查询发送和应答接收模块发送该ip地址和当前查询域名,将此ip地址和当前查询域名放入已查询列表queried_list;否则,进行下一步;4.清空server_list,转步骤7;5.如果查询发送和应答接收模块返回的所有应答报文均处理完成,转至第7步,否则,进行下一步;6.取出任意一个未处理的报文作如下处理:6.1.如果答案段不为空,且为a记录,作如下处理,即执行6.1.1;否则转至第6.2步:6.1.1将当前查询域名和a记录中ip地址放入resolved_list,再执行6.1.2步;6.1.2查找query_list,若存在服务器名字与当前查询域名相同的,则将服务器地址放入query_list中对应位置;再转至第6步对下一个未处理的报文进行处理;6.2.如果答案段不为空,且为cname记录,则将cname记录中别名和根服务器ip地址放入query_list,再转至第6步对下一个未处理的报文进行处理;6.3对于授权记录中的服务器域名,在附加段中有a记录的,则进行以下处理;执行6.3.1,否则转6.4步;6.3.1将此ip地址保存至服务器地址列表server_list中,进行6.4步;6.4对于授权记录中的服务器域名,若附加段中没有a记录,则查找resolved_list,如果在执行6.4.1步,不在则执行6.4.2步;6.4.1直接取出对应ip地址,将此ip地址保存至服务器地址列表server_list中,转第6步;6.4.2如果不在,则将服务器域名和根服务器ip地址放入query_list,转第6步;7.判断server_list:7.1如果server_list不空,则转第4步;7.2如果server_list空,则判断query_list中是否存在ip地址别表不为空的元素;7.2.1如果存在将ip地址列表填入server_list,将当前查询域名变更为此域名,转第4步;7.2.2如果不存在,则解析结束;其中:待查询列表query_list:等待向某服务器发送某域名的查询的列表[(name,server_name,[]),…]已查询列表queried_list:已经向某服务器发送过某域名查询的列表[(name,ip),…]解析结果列表resolved_list:已解析的域名和解析得到的ip地址[(name,[]),…]server_list:服务器ip地址列表。进一步地,所述查询发送和应答接收模块能并列地发出查询和接收应答,支持edns0协议。本发明具有以下有益效果:本发明所述的一种获取域名所有资源记录的系统,包括客户端以根域名服务器为初始,向各域名服务器同时发送dns查询请求,当有各域名服务器均相应查询返回应答报文时,向授权记录中的所有域名服务器发送查询,直到此域名解析所有相关域名服务器上的所有资源记录均被获取。本申请可以向域名管理者提供其域名解析所有可能用到的服务器和所有有关的域,便于域名管理者评价自己域名的安全性以并合理部署域名服务器。从本发明的实例可看出,本发明所述系统能够获取所有资源记录数据。经实验验证,本发明所述系统可以较快地完成所有资源记录数据的获取。附图说明图1是本发明所述系统的结构框图,图2是域名解析模块的流程框图。具体实施方式具体实施方式一:如图1和2所示,本实施方式所述的获取域名所有资源记录的系统(爬虫系统)输入为待查询域名,输出为包含该域名解析过程中所有资源记录的文件;这些应答报文就包括了当前时间和网络状况下,待查域名解析过程中所有涉及到的资源记录。所述系统包:域名解析模块:域名解析模块是所述系统的核心,用于对待查询域名进行解析,进行解析时读取待查询域名,将待查询域名中解析为对应的ip地址,在解析过程中对查询发送和应答接收模块返回的应答报文进行分析产生新的问题和新的服务器ip地址,再将该新的问题和新的服务器ip地址发送给查询发送和应答接收模块,域名解析模块还用于,在域名解析过程中产生错误时向错误日志管理模块发送错误日志;查询发送和应答接收模块:用于接收域名解析模块发送的问题和服务器ip地址,向该服务器ip地址发送对应的问题,并将接收到的应答返回给域名解析模块,同时将该应答作为系统的输出储存在所有资源记录的文件,查询发送和应答接收模块还用于,在查询发送和应答接收过程中产生错误时向错误日志管理模块发送错误日志;错误日志管理模块:用于将收到的所有错误日志存储到错误日志文件中。域名解析模块输入:目标域名输出:无为了爬取域名解析所有可能用到的资源记录,就要完成以下三个功能:1.在初始知识仅为需要解析的域名和根域名服务器ip地址的情况下,需要对应答报文进行解析,找到接下来需要发送查询的域名服务器ip地址和查询的问题。为此,设计域名解析模块对域名进行解析,生成发送查询的服务器ip地址和问题。2.判断是否已经获取到了全部的资源记录,既,如果通过已经获取的应答报文,不能分析得到新的需要查询的服务器ip地址和问题,无法构造新的查询也就无法获得新的应答报文,则域名解析时可能用到的全部资源记录都已获得完成。3.保证任何情况下程序需在有限时间内结束。为实现这一目的,在爬取一个域名解析所有可能的资源记录过程中,不会发送重复的查询。主要数据结构:待查询列表query_list:等待向某服务器发送某域名的查询的列表[(name,server_name,[]),…]已查询列表queried_list:已经向某服务器发送过某域名查询的列表[(name,ip),…]解析结果列表resolved_list:已解析的域名和解析得到的ip地址[(name,[]),…]服务器ip地址列表server_list:设计解析过程步骤如下:1.输入目标域名(待查询域名),设当前查询域名为目标域名,2.将根域名服务器ip地址放入查询服务器ip地址列表server_list;3.对于server_list中的ip地址,如果其与当前查询域名组成的二元组不在queried_list中,则向查询发送和应答接收模块发送该ip地址和当前查询域名,将此ip地址和当前查询域名放入已查询列表queried_list;否则,进行下一步;4.清空server_list,转步骤7;5.如果查询发送和应答接收模块返回的所有应答报文均处理完成,转至第7步,否则,进行下一步;6.取出任意一个未处理的报文作如下处理:6.1.如果答案段不为空,且为a记录,作如下处理,即执行6.1.1;否则转至第6.2步:6.1.1将当前查询域名和a记录中ip地址放入resolved_list,再执行6.1.2步;6.1.2查找query_list,若存在服务器名字与当前查询域名相同的,则将服务器地址放入query_list中对应位置;再转至第6步对下一个未处理的报文进行处理;6.2.如果答案段不为空,且为cname记录,则将cname记录中别名和根服务器ip地址放入query_list,再转至第6步对下一个未处理的报文进行处理;6.3对于授权记录中的服务器域名,在附加段中有a记录的,则进行以下处理;执行6.3.1,否则转6.4步;6.3.1将此ip地址保存至服务器地址列表server_list中,进行6.4步;6.4对于授权记录中的服务器域名,若附加段中没有a记录,则查找resolved_list,如果在执行6.4.1步,不在则执行6.4.2步;6.4.1直接取出对应ip地址,将此ip地址保存至服务器地址列表server_list中,转第6步;6.4.2如果不在,则将服务器域名和根服务器ip地址放入query_list,转第6步;7.判断server_list:7.1如果server_list不空,则转第4步;7.2如果server_list空,则判断query_list中是否存在ip地址别表不为空的元素;7.2.1如果存在将ip地址列表填入server_list,将当前查询域名变更为此域名,转第4步;7.2.2如果不存在,则解析结束;查询发送和应答接收模块输入:服务器ip地址列表、查询问题输出:应答报文、结果文件该模块接收域名解析模块传来的服务器ip地址列表、查询名字,为每个ip地址创建一个子线程,利用python下的dns处理工具dns-python,由接口dns.message.make_query(qname,rdtype)将查询名字、查询类型“a”构造成dns问题,使用udp协议接口dns.query.udp(query,where,timeout),向指定ip地址发送构造的问题并接收应答,等待时间不超过3秒。由于当前网络状态可能不稳定,如果等待超时,再进行两次重传,若依然超时,则放弃此次查询。向错误日志管理模块发送查询名字、服务器ip地址和重传次数。由于在dns设计之初,规定使用的udp包长度不超过512字节,因此如果应答的资源记录数并不是服务器上存储的全部资源记录,需要使用edns0进行查询,获取全部资源记录,考虑到部分域名服务器不支持edns0,因此先默认使用常规dns,对应答报文做以下判断后再决定是否使用edns0进行重复查询。如果授权记录对应的名字属于本域,或本域的子孙域,例如授权记录”example.com.nsns1.example.com.”和”example.com.nsns1.child.example.com.”,则在附加段中应当有相应的a记录,根据前边的例子,即为”ns1.example.coma1.1.1.1”和”ns1.child.example.coma2.2.2.2”;另外,对于根域名服务器上的授权记录,默认都应当存在相应的a记录。因此对于一个应答报文,如果其中授权段中的授权记录,在附加段中应当有相应a记录却没有的,则考虑是由于被报文长度限制而省略了,因此构造问题dns.message.make_query(qname,rdtype,use_edns=true),利用edns0进行查询。同样的最多进行两次重传,如果两次重传后依然超时,则向错误日志管理模块发送查询名字、服务器ip地址和重传次数+3。将应答报文中有效的数据和服务器ip地址按如下格式组织为字典。字段名称数据类型备注questionvarchar(256)问题段server_ipvarchar(32)应答服务器ip地址answervarchar(256)答案段authority_domainvarchar(256)授权段中域authorityvarchar(256)授权段additionalvarchar(256)附加段胶水记录将报文返回给域名解析模块进行解析,同时存储到文件中作为爬虫的结果。错误日志管理模块输入:待查域名、查询的服务器ip地址、错误代码输出:日志文件该模块接收解析模块和查询发送和应答接收模块发来的出错信息,并存入文件,日志格式如下表。字段名称数据类型备注namevarchar(256)待查域名server_ipvarchar(32)查询的服务器ip地址error_numberinteger错误代码其中错误代码:1~3:超时1~3次4~6:edns0查询超时1~3次7:解析失败,程序未能成功解析得到待查域名的a记录。实施例例如有如下资源记录:根域名服务器192.0.1.1上:com.nsns1.com.ns1.com.a192.0.2.8net.nsns1.net.ns1.neta192.0.2.3在net.的权威服务器192.0.2.3上:net.nsns1.net.ns1.neta192.0.2.3foo.net.nsns1.foo.netfoo.net.nsn31.bar.com.ns1.foo.neta192.0.2.1在com.的权威服务器192.0.2.8上:在bar.com的权威服务器192.0.2.5上:bar.com.nsns1.bar.comns1.bar.com.a192.0.2.5ns3.bar.com.a192.0.2.7在foo.net的权威服务器192.0.2.1和192.0.2.7上foo.net.nsns1.foo.netfoo.net.nsns3.bar.com.ns1.foo.neta192.0.2.1ns3.bar.com.a192.0.2.7www.foo.net.a192.0.0.0需要获取www.foo.net解析时的全部资源记录,需要经过以下过程:1.设当前查询域名为www.foo.net,将192.0.1.1放入server_list。2.调用查询发送和应答接收模块,向根域名服务器192.0.1.1查询www.foo.net,获得如下应答并保存。questionwww.foo.netaserver_ip192.0.1.1answerauthority_domainnetauthoritynetnsns1.netadditionalns1.neta192.0.2.3将应答保存,因为授权记录对应的a记录都存在,所以不需要edns0查询。3.解析函数接收到应答,将附加段中服务器ip地址192.0.2.3存入server_list列表。4.server_list列表不为空,将192.0.2.3加入queried_list中,并从server_list列表中删除,调用查询发送和应答接收模块,向服务器192.0.2.3查询www.foo.net,获得如下应答并保存。6.解析函数接收到应答,将附加段中服务器ip地址192.0.2.1存入局部变量server_list列表。由于服务器ns3.bar.com.没有a记录,需要解析,因此,将ns3.bar.com.和根服务器ip地址192.0.1.1存入全局变量query_list,将www.foo.net和ns3.bar.com.存入query_list。7.调用查询发送和应答接收模块,向服务器192.0.2.1查询www.foo.net,获得如下应答并保存。8.已经得到目标域名www.foo.netip地址。从query_list中取出一个服务器ip地址不为空的元素,既,(”ns3.bar.com”,””,[”192.0.1.1”]),将192.0.1.1放入server_list,将当前查询域名设为ns3.bar.com。9.调用查询发送和应答接收模块,向根域名服务器192.0.1.1查询ns3.bar.com.,获得如下应答并保存。10.解析函数接收到应答,将附加段中服务器ip地址192.0.2.8存入server_list列表。11.server_list列表不为空,将192.0.2.8加入queried_list中,并从server_list列表中删除,调用查询发送和应答接收模块,向服务器192.0.2.8查询ns3.bar.com,获得如下应答并保存。questionns3.bar.com.aserver_ip192.0.2.8answerauthority_domainbar.com.authoritybar.comnsns1.bar.comadditionalns1.bar.coma192.0.2.512.解析函数接收到应答,将附加段中服务器ip地址192.0.2.5存入server_list列表。13.server_list列表不为空,将192.0.2.5加入queried_list中,从server_list列表中删除,调用查询发送和应答接收模块,向服务器192.0.2.5查询ns3.bar.com,获得如下应答并保存。questionns3.bar.com.aserver_ip192.0.2.5answerns3.bar.coma192.0.2.7authority_domainbar.com.authoritybar.comnsns1.bar.comadditionalns1.bar.coma192.0.2.514.答案段不为空,此时已经获得了ns3.bar.com的ip地址192.0.2.7,放入query_list中的(”www.foo.net”,”ns3.bar.com”,[])的ip地址列表中,得到(”www.foo.net”,”ns3.bar.com”,[“192.0.2.7”])15.server_list为空,从query_list中取出一个元素既(”www.foo.net”,”ns3.bar.com”,[“192.0.2.7”]),将192.0.2.7存入server_list,设当前查询域名为www.foo.net。16.向服务器192.0.2.7查询www.foo.net,获得如下应答并保存。17.答案段不为空,此时已经获得了www.foo.net的a记录192.0.0.0,server_list为空,query_list也为空。解析过程完成,爬虫系统已经爬取到了结果解析过程中的全部有关资源记录。从上述实例可看出,本发明所述系统能够获取所有资源记录数据。当前第1页12