一种基于linux操作系统的DNS服务系统和方法

文档序号:7704689阅读:106来源:国知局
专利名称:一种基于linux操作系统的DNS服务系统和方法
技术领域
本发明涉及计算机技术,特别涉及一种基于Iinux操作系统的DNS服务系统和方法。
背景技术
从静态角度,DNS (Domain Name System,域名系统)可以理解为一个分布式数据库。数据库的管理员负责授权给他的那部分数据的维护。该数据是对某些主机相关信息的记录,如主机名、别名、IP地址、email路由等。从动态角度,DNS可以理解为对主机信息的查询和应答服务。该查询应答采用典型的CS模型。客户端发起DNS请求,查询某主机的信息。服务器收到该请求后产生携带主机IP地址等信息的应答,返回给客户端。客户端进一步使用查询到的信息从主机获得相应服务,从而能够使人们不用去记住服务器的IP地址, 就可以方便地访问互联网,这个过程通常称为域名解析。
现有的DNS服务均运行在操作系统的应用层,在OSI (Open System Interconnection,开放系统网络互连)七层网络模型中,划归在第7层,即应用层。
现有的DNS服务处理模块的工作流程包括如下步骤 1、在需要提供DNS服务时向操作系统申请打开一个UDP (User Datagram Protocol,用户数据包协议)类型套接字(socket); 2、绑定socket的目的IP为本机的所有IP地址,本机可以有一个或多个IP地址; 3、绑定socket的目的端口为53,端口 53为现有标准规定的DNS服务端口 ; 4、监听该socket,接收客户端发送的数据; 5、接收到客户端发送的DNS请求报文时提供DNS服务; 6、向客户端返回DNS应答报文,其中携带客户端需要查询的主机IP地址; 7、返回步骤4,继续监听该socket。
如图1所示,为DNS服务处理模块进行业务处理时的数据处理流程示意图,其中, OSI七层网络模型中的传输层、网络层、数据链路层和物理层属于系统内核,其他会话层表示层和应用层属于系统应用层面。
网卡设置在物理层,用于监听53端口,接收用户客户端发送的数据,如果网卡设置“混杂模式”,网卡收到DNS请求报文后会将该报文放入内存并以硬件中断形式通知数据链路层的数据帧处理模块。如果网卡未设置“混杂模式”,将检查报文的目标MAC地址,只有目标MAC地址符合本网卡的MAC地址,网卡才会将该报文放入内存并以硬件中断形式通知数据链路层的数据帧处理模块,否则就丢弃该报文。
处于数据链路层的数据帧处理模块构造内核所有模块处理报文所需的结构体,并添加该报文相应的逻辑网络设备信息,然后交给网络层。
网络层包含了很多处理模块,主要包括路由模块、Netfilter框架及插件和IP报文处理模块。路由模块根据报文的源IP和目标IP做路由选择,或是传送到上层,或是将报文往下发送到其他机器,或是丢弃该报文。Netfilter框架及插件是一个网络层的框架,提供了对IP报文的操作接口。基于Netfilter框架及插件可以较为方便地开发插件,直接处理IP报文。如果Netfilter框架及插件配置了很多插件,这里将消耗大量的时间。IP报文处理模块将IP报文解成传输层能理解的TCP包、UDP包等。处理完后,报文将递送给传输层。
传输层的处理相对简单。端口注册进程匹配模块根据报文端口信息查找注册的服务程序,经UDP报文处理模块将报文交给运行在应用层的服务程序,该报文在表示层和会话层被透传。由于报文要从内核层转移到应用层,所以这里最大的性能消耗就是将整个报文做一次内存拷贝。
DNS请求报文送到应用层对应的DNS服务处理模块后,DNS服务处理模块进行业务处理,然后生成一个DNS应答报文,将DNS应答报文逐级往下递送。
同样地,报文交给传输层的时候,又将做一次整个报文的内存拷贝,从应用层拷贝到内核层。传输层封装上UDP包头后交给网络层。网络层封装IP包头,netfilter框架及插件再一次做IP报文处理,路由模块根据IP包头里所示的目标IP地址进行路由选择和网卡选择,然后交给物理层。物理层调用网卡驱动模块,将DNS应答报文从内存写入网卡,发送指令让网卡发送该DNS应答报文到网络上,通过网络传输最终被发送DNS请求报文的客户端接收。
从上述过程可见,客户端的DNS请求报文需要经过网卡驱动模块、数据帧处理模块、Netfilter框架及插件、路由模块、端口注册进程匹配等多个Linux内核模块才到应用层的DNS服务处理模块。反过来,DNS服务处理模块产生的DNS应答报文,需要经过端口注册进程匹配、路由模块、Netfilter框架及插件、网卡驱动模块等,才能发送出去。而且数据在从内核到应用层和从应用层到内核的两个过程中,不可避免地进行两次内存拷贝。所有这些降低了服务效率。

发明内容
本发明实施例提供一种基于Iinux操作系统的DNS服务系统和方法,用以提高DNS 服务的处理效率。
一种基于Iinux操作系统的DNS服务系统,包括 网卡驱动模块,用于在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层;以及从发送队列中读取DNS响应报文并发送给客户端; 数据帧处理模块,用于在数据链路层接收所述网卡驱动模块转发的DNS请求报文,将DNS请求报文保存到第一内存中,并输出第一内存地址信息;以及根据获得的第二内存的地址信息,将保存在第二内存中的DNS响应报文放入网卡驱动模块的发送队列中; DNS服务处理模块,用于根据数据帧处理模块转发的第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块。
较佳的,所述网卡驱动模块,具体用于通过调用数据帧处理模块中的第一数据处理函数将所述DNS请求报文转发给数据链路层的数据帧处理模块; 所述数据帧处理模块,具体用于生成包含所述DNS请求报文的第一数据结构体, 将第一数据结构存放保存到第一内存中,并通过调用钩子内核函数,将第一内存地址信息转发给DNS服务处理模块。
较佳的,所述DNS服务处理模块,具体用于生成包含DNS响应报文的第二数据结构体,将第二数据结构存放保存到第二内存中,并通过调用数据帧处理模块中的第二数据处理函数,将第二内存地址信息转发给数据帧处理模块。
其中,所述第一数据处理函数为netif_reCeiVe_Slib内核函数,所述钩子内核函数为netif_receive_skb内核函数中的packet_frame_handle钩子内核函数,该packet_ frame_handle钩子内核函数被调用后,将第一内存的地址信息传输给内核中的DNS服务处理模块; 所述第二数据处理函数为dev_queue_xmit内核函数,所述dev_queue_xmit内核函数函数被调用后,完成如下操作根据第二内存的地址信息,从第二内存中获得DNS响应报文;为DNS响应报文选择发送队列;将DNS响应报文加在选择的发送队列中。
一种用于上述系统中的DNS服务方法,包括 步骤一、网卡驱动模块在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层; 步骤二、数据帧处理模块在数据链路层接收所述网卡驱动模块转发的DNS请求报文,将DNS请求报文和保存到第一内存中,并将第一内存地址信息发送给DNS服务处理模块; 步骤三、DNS服务处理模块根据第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块; 步骤四、数据帧处理模块根据获得的第二内存的地址信息,将保存在第二内存中的DNS响应报文放入网卡驱动模块的发送队列中; 步骤五、网卡驱动模块从发送队列中读取DNS响应报文并发送给客户端。
本发明实施例提供的技术方案中,将DNS服务处理模块放在内核的数据链路层, 数据帧处理模块在收到网卡驱动模块转发的DNS请求报文时,将DNS请求报文存入内存, 并调用内核的DNS服务处理模块处理内存中保存的DNS请求报文,DNS服务处理模块根据 DNS请求报文请求的内容,获得查询结果,生成DNS响应报文,并将DNS响应报文保存到另一个内存中,然后调用数据帧处理模块,数据帧处理模块从另一个内存中读取DNS响应报文放入网卡驱动模块的发送队列中,由网卡驱动模块将DNS响应报文发送给客户端。在上述处理过程中,由于数据帧处理模块和DNS服务处理模块都位于内核的数据链路层中,省去了其他内核模块的处理,同时避免了数据从内核到应用层和从应用层到内核的两次内存拷贝,从而提高了 DNS服务的处理效率。


图1为背景技术中DNS服务处理模块进行DNS服务处理时的数据处理流程示意图; 图2为本发明实施例提供的基于Iinux操作系统的DNS服务系统结构框图; 图3为本发明实施例提供的DNS服务方法流程示意图。
6
具体实施例方式现有基于Linux内核态的DNS服务处理模块运行在应用层,导致DNS服务的效率很低,本发明实施例提供的技术方案中,将DNS服务处理模块放在内核的数据链路层,数据帧处理模块在收到网卡驱动模块转发的DNS请求报文时,将DNS请求报文存入内存,并调用内核的DNS服务处理模块处理内存中保存的DNS请求报文,DNS服务处理模块根据DNS请求报文请求的内容,获得查询结果,生成DNS响应报文,并将DNS响应报文保存到另一个内存中,然后调用数据帧处理模块,数据帧处理模块从另一个内存中读取DNS响应报文放入网卡驱动模块的发送队列中,由网卡驱动模块将DNS响应报文发送给客户端。在上述处理过程中,由于数据帧处理模块和DNS服务处理模块都位于内核的数据链路层中,省去了其他内核模块的处理,同时避免了数据从内核到应用层和从应用层到内核的两次内存拷贝, 从而提高了 DNS服务的处理效率。
现有技术中,网卡驱动模块通过调用数据帧处理模块中的数据处理函数对数据进行处理,数据处理函数例如netif_receive_skb内核函数,netif_receive_skb内核函数被调用后,执行如下功能 1.将DNS请求报文写入slib数据结构体里; 2.申请第一内存保存Ab数据结构体; 3.调用 handle_bridge 处理桥报文,进一步调用 handle_macvlan 处理 vlan ; 4.最后将保存Slcb数据结构体的第一内存地址信息送给上一层的网络层处理。
而在本发明实施例中,应该执行如下功能 1.将DNS请求报文写入slib数据结构体里; 2.申请第一内存保存Slcb数据结构体; 3.将第一内存的地址信息传输给内核中的DNS服务处理模块,触发DNS服务处理模块进行DNS业务处理。
上述第三个功能可以通过在netif_reCeiVe_Slib内核函数中新增一个钩子内核函数来实现,例如packet_frame_handle钩子内核函数,在netif_receive_skb内核函数被调用并生成数据结构体,申请第一内存保存slA数据结构体后,调用paCket_frame_ handle钩子内核函数,并将第一内存地址信息输入给packetframejiandle钩子内核函数,packet_frame_handle钩子内核函数被调用后,将第一内存地址信息作为变量发送给 DNS服务处理模块,触发DNS服务处理模块根据第一内存的地址信息进行业务处理。
本发明实施例中,DNS服务处理模块根据第一内存的地址信息,读取保存在第一内存中的DNS请求报文,进行DNS业务处理后,生成包含DNS响应报文,并将DNS响应报文存放在申请的第二内存中,触发数据处理模块发送DNS响应报文。一种具体的是实现方式可以是DNS服务处理模块生成包含DNS响应报文的Slcb数据结构体,申请第二内存保存生成的slA数据结构体,进一步触发数据帧处理模块发送该DNS响应报文,该过程也可以在数据帧处理模块中新增一个具有数据处理功能的函数来完成,例如新增dev_qUeUe_xmit内核函数,DNS服务处理模块将第二内存的地址信息作为变量输入给dev_qUeUe_xmit内核函数,以触发数据帧处理模块发送DNS响应报文,dev_qUeUe_xmit内核函数被调用后,完成如下操作 1.根据第二内存的地址信息,从第二内存中获得DNS响应报文,如果DNS响应报文超过长度限制,还要进行分包处理; 2.计算DNS响应报文并填写到包中,如果需要分包,则分别计算每一个数据分包的校验值并填写到分包中; 3.为DNS响应报文或者每一个数据分包选择发送队列; 4.将DNS响应报文或者每一个数据分包加在选择的发送队列之后。
而网卡驱动模块从各个发送队列中获取数据并发送,这个过程和现有技术的处理完全一样,这里不再详细描述。
基于上述原理,如图2所示,本发明实施例首先提供一种基于Iinux操作系统的 DNS服务系统,包括 网卡驱动模块201,用于在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层;以及从发送队列中读取DNS响应报文并发送给客户端; 数据帧处理模块202,用于在数据链路层接收网卡驱动模块201转发的DNS请求报文,将DNS请求报文保存到第一内存中,并输出第一内存地址信息;以及根据获得的第二内存的地址信息,将保存在第二内存中的DNS响应报文放入网卡驱动模块201的发送队列中; DNS服务处理模块203,用于根据数据帧处理模块转发的第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块201。
一种在图2所示系统中实现的DNS服务方法如图3所示,主要包括如下步骤 步骤301、网卡驱动模块在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层; 步骤302、数据帧处理模块在数据链路层接收网卡驱动模块转发的DNS请求报文, 将DNS请求报文保存到第一内存中,并将第一内存地址信息发送给DNS服务处理模块; 步骤303、DNS服务处理模块根据第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文和保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块; 步骤304、数据帧处理模块根据获得的第二内存的地址信息,将保存在第二内存中的DNS响应报文放入网卡驱动模块的发送队列中; 步骤305、网卡驱动模块从发送队列中读取DNS响应报文,并发送客户端。
其中,网卡驱动模块201,通过调用数据帧处理模块中的第一数据处理函数将DNS 请求报文转发给数据链路层的数据帧处理模块; 数据帧处理模块,生成包含DNS请求报文的第一数据结构体,将第一数据结构存放保存到第一内存中,并通过调用钩子内核函数,将第一内存地址信息转发给DNS服务处理模块。
其中,DNS服务处理模块,生成包含DNS响应报文的第二数据结构体,将第二数据结构存放保存到第二内存中,并通过调用数据帧处理模块中的第二数据处理函数,将第二内存地址信息转发给数据帧处理模块。
本发明实施例中,第一数据处理函数为netif_reCeiVe_Slib内核函数,钩子内核函数为netif_receive_skb内核函数中的packet_frame_handle钩子内核函数,该packet_
8frame_handle钩子内核函数被调用后,将第一内存的地址信息传输给内核中的DNS服务处理模块; 第二数据处理函数为dev_queue_xmit内核函数,dev_queue_xmit内核函数函数被调用后,完成如下操作根据第二内存的地址信息,从第二内存中获得DNS响应报文;为 DNS响应报文选择发送队列;将DNS响应报文加在选择的发送队列之后。
本发明实施例中,第一数据结构体和/或第二数据结构体为Slcb数据结构体。
本发明实施例中,DNS服务处理模块是专门针对DNS开发的内核模块,运行在 Linux内核态。在OSI七层网络模型中,该模块运行在第二层,即数据链路层。DNS服务处理模块根据客户端的请求,产生相应的DNS应答报文,并调用deV_qUeUe_Xmit内核函数将 DNS应答报文发送出去。
为实现本发明,在Linux内核中修改代码,将业务代码内核化。通过修改Linux内核代码,在数据帧处理函数中增加钩子内核函数,使得数据可以在数据链路层送给内核的 DNS服务处理模块,从而将DNS服务处理逻辑移到内核态。
本发明实施例中,需要修改Linux内核,增加数据链路层的钩子,并新增Linux内核模块,即DNS业务处理模块,配合该钩子内核函数,在数据链路层对DNS请求报文进行处理。相对于现有的DNS服务软件,本发明实施例提供的技术效率高,安全性强,受Linux内核制约小,功能扩展性好。同等业务模型下,相同的硬件环境,本架构的性能是比现有架构的20-40倍。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种基于Iinux操作系统的DNS服务系统,其特征在于,包括网卡驱动模块,用于在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层;以及从发送队列中读取DNS响应报文并发送给客户端;数据帧处理模块,用于在数据链路层接收所述网卡驱动模块转发的DNS请求报文,将 DNS请求报文保存到第一内存中,并输出第一内存地址信息;以及根据获得的第二内存的地址信息,将保存在第二内存中的DNS响应报文放入网卡驱动模块的发送队列中;DNS服务处理模块,用于根据数据帧处理模块转发的第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块。
2.如权利要求1所述的系统,其特征在于所述网卡驱动模块,具体用于通过调用数据帧处理模块中的第一数据处理函数将所述 DNS请求报文转发给数据链路层的数据帧处理模块;所述数据帧处理模块,具体用于生成包含所述DNS请求报文的第一数据结构体,将第一数据结构存放保存到第一内存中,并通过调用钩子内核函数,将第一内存地址信息转发给DNS服务处理模块。
3.如权利要求2所述的系统,其特征在于所述DNS服务处理模块,具体用于生成包含DNS响应报文的第二数据结构体,将第二数据结构存放保存到第二内存中,并通过调用数据帧处理模块中的第二数据处理函数,将第二内存地址信息转发给数据帧处理模块。
4.如权利要求3所述的系统,其特征在于,所述第一数据处理函数为netif_reCeive_ skb内核函数,所述钩子内核函数为netif_receive_skb内核函数中的packet_frame_ handle钩子内核函数,该packetframejiandle钩子内核函数被调用后,将第一内存的地址信息传输给内核中的DNS服务处理模块;所述第二数据处理函数为dev_queue_xmit内核函数,所述dev_queue_xmit内核函数函数被调用后,完成如下操作根据第二内存的地址信息,从第二内存中获得DNS响应报文;为DNS响应报文选择发送队列;将DNS响应报文加在选择的发送队列中。
5.一种权利要求所述系统中的DNS服务方法,其特征在于,包括步骤一、网卡驱动模块在物理层中将网卡从客户端接收的DNS请求报文转发给数据链路层;步骤二、数据帧处理模块在数据链路层接收所述网卡驱动模块转发的DNS请求报文, 将DNS请求报文和保存到第一内存中,并将第一内存地址信息发送给DNS服务处理模块;步骤三、DNS服务处理模块根据第一内存地址信息,对第一内存中保存的DNS请求报文进行DNS业务处理,生成DNS响应报文,并将DNS响应报文保存至第二内存中,以及将第二内存对应的第二内存地址信息发送给数据帧处理模块;步骤四、数据帧处理模块根据获得的第二内存的地址信息,将保存在第二内存中的DNS 响应报文放入网卡驱动模块的发送队列中;步骤五、网卡驱动模块从发送队列中读取DNS响应报文并发送给客户端。
6.如权利要求5所述的方法,其特征在于所述步骤一中,所述网卡驱动模块在物理层中将网卡从客户端接收的DNS请求报文,通过调用数据帧处理模块中的第一数据处理函数,将接收的DNS请求报文转发给数据链路层;所述步骤二中,所述数据帧处理模块生成包含所述DNS请求报文的第一数据结构体, 将第一数据结构存放保存到第一内存中,并通过调用DNS服务处理模块中的第一钩子内核函数,将第一内存地址信息转发给DNS服务处理模块。
7.如权利要求6所述的方法,其特征在于所述步骤三中,所述DNS服务处理生成DNS响应报文后,进一步生成包含DNS响应报文的第二数据结构体,将第二数据结构存放保存到第二内存中,并通过调用数据帧处理模块中的第二数据处理函数,将第二内存地址信息转发给数据帧处理模块。
8.如权利要求6所述的方法,其特征在于,所述第一钩子内核函数为netif_reCeive_ skb内核函数中的packetframejiandle钩子内核函数,该函数被调用后,将第一内存的地址信息传输给内核中的DNS服务处理模块;所述第二数据处理函数为dev_queue_xmit内核函数,所述dev_queue_xmit内核函数函数被调用后,完成如下操作根据第二内存的地址信息,从第二内存中获得DNS响应报文;为DNS响应报文选择发送队列;将DNS响应报文加在选择的发送队列中。
9.如权利要求7或8中所述的方法,其特征在于,所述第一数据结构体和/或第二数据结构体为Ab数据结构体。
全文摘要
本发明涉及计算机技术,特别涉及一种基于linux操作系统的DNS服务系统和方法。本发明实施例中,将DNS服务处理模块放在内核的数据链路层,数据帧处理模块在收到网卡驱动模块转发的DNS请求报文时存入内存,并调用内核的DNS服务处理模块处理,DNS服务处理模块生成DNS响应报文并将保存到另一个内存中,然后调用数据帧处理模块从另一个内存中读取DNS响应报文放入网卡驱动模块的发送队列中发送给客户端。由于数据帧处理模块和DNS服务处理模块都位于内核的数据链路层中,省去了其他内核模块的处理,同时避免了数据从内核到应用层和从应用层到内核的两次内存拷贝,从而提高了DNS服务的处理效率。
文档编号H04L29/08GK102185936SQ201110172449
公开日2011年9月14日 申请日期2011年6月23日 优先权日2011年6月23日
发明者张大顺 申请人:上海牙木通讯技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1