查看: 2572|回复: 25

基于多核的网络扫描技术研究

[复制链接]
发表于 2012-11-6 03:34:04 | 显示全部楼层 |阅读模式
1 引言  本文在深入分析网络扫描软件NMAP源码了解其扫描原理和运行流程的基础上,结合Tile64多核开发板强大的并行处理能力,研究提出基于多核的并行多功能扫描实现方案。方案基本思路是将扫描流程模块化划分,每个任务模块由Tile64的一个内核执行,从而实现扫描过程的流水化;在此基础上,通过建立负载均衡模块控制调度多条流水线,实现多条流水线并行扫描。
  2 NMAP
  NMAP是一个网络探测和安全扫描程序,使用NMAP可以扫描大型网络,获取任意主机正在运行以及提供服务的信息。NMAP支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志扫描、ICMP扫描、FIN扫描、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。它还提供了一些高级的功能,例如通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,通过ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描、碎片扫描以及灵活的目标和端口设置功能。NMAP主要扫描功能可以分为四类。
  第一,主机发现扫描。主机发现扫描也称为ping扫描,NMAP的功能远远超过ping命令的功能,它可以将TPC SYN/ACK、UDP和ICMP等数据包任意组合起来发送,以探测目标主机是否是活动的。 第二,端口扫描。NMAP提供了多种端口扫描技术,探测端口的状态。例如上面提到的:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描等。防火墙等网络隔离设备使得对网络的探测变得更加困难,简单的搜索不再有效,NMAP提供了很多功能用于探测复杂的网络,并且检验过滤设备是否正常工作。此外,NMAP还提供了绕过某些较弱的防范机制的手段。
  第三,服务和版本探测。探测目标主机端口运行的服务,NMAP自建包括大约2,200个著名服务组成的NMAP-services数据库,通过对远程机器端口的探测,报告使用者哪些端口对应于邮件服务器 (SMTP),哪些端口对应Web服务器(HTTP)或域名服务器(DNS)。
  第四,操作系统探测。NMAP最著名的功能之一,使用TCP/IP协议栈fingerprinting进行远程操作系统探测。NMAP向目标主机发送一系列TCP和UDP报文,并检查响应中的每一比特。在进行多项测试如TCP ISN采样、TCP选项支持和排序、IPID采样和初始窗口大小检查之后,NMAP把结果和数据库NMAP-os-fingerprints中超过1500个已知的操作系统的fingerprints进行比较,查找匹配操作系统。如果匹配上,就打印出该操作系统的信息。每个fingerprint包括一个关于OS的描述文本和一个分类信息,包括供应商名称(如Sun),旗下的操作系统(如Solaris)、OS版本(如10)和设备类型(如通用设备、路由器、Switch、游戏平台等)。
  NMAP的功能及指令如表1所示。
  3 Tile64多核开发板
  2004年,麻省理工学院(MIT)的阿南特·阿加瓦尔(Anant Agarwal)教授创办了Tilera公司。2007年,该公司推出了一款带有64个可编程内核、90nm工艺的RISC处理器——Tile64。与英特尔和AMD采用的前端总线架构不同,Tile64处理器内核之间采用的是一种“网状”架构(MESH)进行数据交换,有些类似于AMD HyperTransport总线的点对点架构,并集成了4个DDR2内存控制器,分布在核心阵列的周围。Tile64的64个核心排成8×8的阵列,每个核心由有一个计算单元、一个缓存单元和一个交换单元组成,这些交换单元构成了一个名为iMesh的mesh网络。
  每个处理器核是完整的处理器,包括共5MB的L1和L2高速缓存,连接核和网络的无阻塞开关,使得每个处理器核能运行完整操作系统,或多个处理器核一起运行多处理器操作系统SMP Linux。Tlie64工作频率500MHz - 866MHz,每秒可达4430亿次运算(443BOPS)。这些内核通常称为tile,在处理器外扩展了一些常用外部接口如Gbe交换器,每个tile都可以自由的与外部接口通信。开发板的结构如图2所示。
  4 NMAP代码分析
  4.1 扫描流程分析
  通过对NMAP源码的分析,得出NMAP主要运行流程分为三部分。第一部分初始化,在这个阶段NMAP主要解析用户输入的命令及参数,并判断其是否有误。根据用户输入的命令设置NMAP扫描参数,如扫描延时,日志记录,设置傀儡主机等。第二部分扫描,NMAP所有功能均在此阶段完成,如端口扫描、操作系统扫描等,当完成扫描后,输出扫描结果。第三部分是最后阶段,主要工作是释放系统资源。
  NMAP第二部分扫描,主要在NMAP.cc文件中的NMAP_main中的第1603行至1868行完成。这部分开始时,首先设置一些基本信息为后面的扫描做准备,如DNS解析,路由设置,如果不是主机发现扫描,还需执行ping扫描,判断目标主机是否开机。当准备工作完成后,开始发送探测进行扫描。根据用户输入的命令,NMAP执行相应的扫描。NMAP只允许输入一种类型的探测,只有少数端口扫描允许输入两种端口扫描类型。具体NMAP扫描流程如图3所示,先判断是否为用户所输入的类型,如果不是继续判断下一个类型。直到找到匹配的类型,完成相应的探测功能。
  NMAP中大部分端口扫描功能都是在函数ultra_scan中完成的,它根据扫瞄类型对目的主机的端口发送相应的探测,并通过截取目的主机返回的数据包来分析主机与端口的状态,其函数的原型为void ultra_scan(vector &Targets, struct scan_lists *ports, stype scantype, struct timeout_info *to)参数具体如下:
  Targets: 要扫描的目标主机,可以是一台或多台,Target是一个在Target.h中定义的类。这个类封装了一些NMAP扫描所需要的目标主机的信息。
  ports: 所要扫描的端口列表。
  scantype: 扫描类型。
  to: 超时信息,可以默认。
  Ultra_scan可以完成10类型的扫描,如下就是10种功能,如图4所示。
  在NMAP.cc文件的第1744行至1772行可以看出,这十种扫描也是顺序执行的。
  NMAP进行多目标主机多端口扫描时的顺序如下:先固定一个端口号,然后给所有目标主机的这个端口号发送同一扫描类型的数据包;发送完毕后再固定另一个端口号,给所有目标主机发送数据包,直到遍历到每个端口号。流程如图5所示。

NMAP所有扫描的底层工作模式基本相同,可归纳为四步。  (1)组装数据包。根据用户的输入的扫描类型,目标主机及端口,组装合适的数据包。
  (2)发包。在windows下,调用libdnet函数库中的函数eth_send进行发包。在Linux下,调用sendto发包。(3)收包。调用pcap函数库中的函数pcap_next进行抓包。
  (4)最后对目标主机返回的数据包进行分析,得出结论。
  归结如图6所示。
  4.2 NMAP的局限性
  NMAP的功能全面而强大,设计者也采用多种算法以提高NMAP运行速度,如在idle_scan中采用递归调用的算法,以加速NMAP扫描速度。但是NMAP自身还存在着缺陷,主要有两点。
  第一,NMAP只能运行在一台主机上的,还没分布式的设计。如果一个管理员需要维护一个大型的网络时,需要扫描大量的主机及多个端口时,NMAP需要大量时间来运行。因为每次NMAP只能对一台主机的一个端口发送数据包,当目标主机增多时,NMAP发送一组数据包,然后等待所有目标主机的响应,当有数据包后才能对数据包进行分析,所以每次对一定数量的端口扫描完后,才能进行下一次扫描、组包、发包等工作。时间消耗在等待对方返回数据包到再次组包之间。
  第二,NMAP不允许同时对不同主机进行不同类型的扫描。例如参数:-sS,表示使用SYN 端口扫描方式;-O,表示运行操作系统扫描。输入扫描命令:NMAP ╞sS hostname1 ╞O hostname2是不允许的。
  5 设计思路
  设计一个高效的并行程序并非易事,本文并行设计采用PCAM 算法。PCAM算法的过程分为四步:即任务划分(Partitioning)、通信(Communication)分析、任务组合(Agglomeration)和处理器映射(Mapping)。它反映了并行算法设计的自然过程,其首先尽量开拓算法的并发性和满足计算的可拓放性,然后着重优化算法的通信成本和全局执行时间。同时,通过必要的整个过程的反复回溯,以期最终达到一个满意的设计,具体过程如图7所示。
  PCAM设计方法的四个阶段。
  (1)划分:将整个计算分解为一些小的任务,以便尽可能的挖掘并行计算的机会。
  (2)通信:确定各任务在执行过程中所需要交换的数据并协调各任务的执行,同时可以检验任务划分的合理性。
  (3)组合:根据性能要求和实现的代价来考察前两步的结果,必要时可将一些小的任务组合成略大的任务,以减少通信开销或提高性能。
  (4)映射:将每个任务分配到一个处理器上,其目的是最小化全局执行时间和通信成本以及最大化处理器的利用率。
  PCAM算法提供了一种针对一个任务如何实现并行处理的设计思想,本文的设计思路也遵循此设计思想,有几个步骤。
  第一,流水线设计。将NMAP的扫描过程分成几个功能独立的模块,每个模块完成自己的工作,并将运行结果传递给下一个模块。每个功能模块由Tile64开发板上的一个tile负责运行,不同模块之间通过Tile64提供的tile间通信机制进行通信。根据NMAP扫描流程的模块化划分,配置相应的tile,组成一条完整的扫描流水线。流水线模式不提升任何单个进程或线程的性能,但是可以提高整个系统的性能。
  第二,并行设计。在流水线前增加一个调度模块,实现多条流水线的控制,同时负责解析复杂命令行和均衡负载等工作。NMAP一共有16种扫描功能,由图3和图4知,每种扫描功能可分成独立的模块,通过往Tile64上的移植修改可将不同模块改为并列关系,通过调度模块对包含多种扫描指令的复杂命令行进行解析,将不同扫描指令分配给不同流水线执行,即可实现多种扫描功能的并行执行,即可解决NMAP不能同时进行多种类型扫描的问题。由图5知,通过对用户输入的主机数量和端口数量进行分析,可以将大量的主机端口扫描任务拆分成多个小任务,通过调度模块可将命令行中目标主机的数量和端口的数量进行统计,平均分给每条流水线,即可实现多流水线并行扫描。
  5.1 流水线设计
  由图6知,NMAP一次扫描的主要过程可分为四个步骤:组包、发包、收包、分析,且四个步骤是顺序执行的,固可将NMAP扫描过程的流水设计为6个独立的模块,除了组包、发包、收包、分析之外,在流水线前后分别加入命令行解析模块和结论输出模块,整条流水线如图8所示。
  NMAP流水扫描工作步骤。
  每个模块起一个进程,由一个tile运行。每个进程只负责自己的工作,与其他进程没有冲突。
  第一个tile负责对用户输入命令进行解析。获得用户输入的探测类型、目的主机、目的端口、扫描参数等信息。并将关键信息(探测类型、目的主机、目标端口)传递给第二个tile。
  第二个tile根据所接收到得信息组装正确的数据包,并将数据包传给第三个tile。
  第三个tile负责网卡发包,并通知第四个tile接收返回数据包。
  第四个tile负责抓包,并判断所抓的数据包是否为所需的数据包。如果是则将包送给下一个tile;如果不是则丢弃。
  第五个tile对数据包进行分析,找出关键信息并将信息传递给第六个tile。
  第六个tile负责保存结果,对之前收到一组相关信息进行总结都得出结论并输出。
  5.2 流水线与单核运行比较
  如图6所示,单核运行NAMP在多次收发的过程中,当组包后,必须等到收到返回数据包才能进行下一次组包。当采用多核流水线模式后,由于每个tile独立运行,当组包完成后,进行发包,第二个tile不用等待收包完毕,就可以继续进行下一次组包。同理,当第三个tile发包完后也可以继续发送下个数据包。
  为了更方便地描述多核程序计算的性能,一般采用加速比指标来进行度量。加速比定义为:
  S(n) = 单处理器上最优串行化算法计算时间 / 使用n个处理器并行计算时间加速比通常都小于CPU核数,只有极少数并行算法可以或得超线性加速比,如并行顺序搜索。因此,加速比一般要求向CPU核数靠近;加速比越大,程序性能越好。
  假设每个核运行一次用时相同,设为t,则发送n个数据包,单处理器上运行NMAP的时间为:4nt +2t。在流水线模式下运行时间为:(n-1)t + 4t + 2t。S(n) = 4nt +2t / (n-1)t + 4t + 2t = 4n +2 / n + 5,当n→∞时,S(n) = 4。5.3 并行设计

Tile64开发板的64个tile,6个网口,为多条流水线并行运行提供了必要的硬件条件。多流水线并行设计是在单流水线设计的基础上,对组包、发包、收包、分析等四个主要提高扫描性能的模块实施了并行化,由调度模块负责并行扫描命令的解析和流水线控制。多流水线并行设计如图9所示。  理论上,该设计可以使用62个tile,其中命令行解析和结论各用一个tile,每条流水线用4个tile,最大可以建立15条流水线。调度模块负责接受用户的指令,解析指令,并实现负载均衡。
  由于NMAP指令输入方式存在局限性,需要对指令进行修改,以满足多种扫描指令同时输入的需求。可将用户输入命令中的目标主机、端口和扫描类型,设定为一组参数传递给每条流水线的组包进程,参数为一个成员相同、长度固定的结构体,结构体的元素如表2所示。
  每个元素也为一个结构体,通过该元素确定扫描目标为一台或一组主机的一个或一组端口,以及扫描的类型。通过使用结构体命令行可以解决NMAP不能同时输入多种扫描指令的问题,同时也使调度模块更容易计算扫描任务的工作量,便于进行负载的分配。假设扫描的主机数量为X,端口数量为Y,扫描类型的发包次数为Z(不同扫描类型收发包次数不同),则总的扫描次数为N = X * Y * Z。如果N = 15,则理论上多流水线并行扫描消耗时间将与N = 1时相同。
  5.4 负载平衡
  在单核CPU中运行,不需要考虑负载平衡问题。而在多核CPU中,必须考虑各个线程计算量均衡地分配到各CPU核上的问题,也就是计算负载平衡问题。如果线程间的计算量无法取得好的负载平衡,那么某些CPU和计算量大、耗时多,另外一些CPU计算量小、耗时少;耗时少的CPU和运行完成后,将处于空闲状态,出现CPU饥饿现象。
  如果CPU核间负载不均衡,对加速比指标的影响也很大,举例如下:
  假设一个4核CPU系统中有4个任务,各个任务耗时分别为20ms、5ms、3ms、2ms。
  S(n) = (20+5+3+2) / 20 =1.5
  多核CPU效率=S(n) / CPU核数 = 1.5 / 4 = 37.5%
  如果将各个任务的时间调整为10ms、8ms、6ms、6ms,那么加速比将变成
  S(n) = (10+8+6+6) / 10 = 3
  对应的多核CPU效率将变成75%,效率增加一倍。可见,CPU核间负载不均衡对加速比的影响很大。
  在图9中,发包和收包消耗的时间最长,其不可再分成更小的任务。在操作系统扫描中,分析模块也占有很大工作量,所以将NMAP扫描流程尽量分成任务量接近的单独任务,以提高负载均衡度。
  将图9中一条流水线包括组包、发包、收包、分析当做一个负载,设耗时为T,命令行解析和结论耗时分别设为t。当运行时间为T+2t时,图8所示流水线完成一次扫描,图9所示流程图理论上最多能完成15次扫描。
  S(n) = (2t + 15T) / (T + 2t),当T远大于t时,S(n) = 15。
  5.5 面临问题
  调度模块在整个系统中占有重要地位,其负载均衡功能是保障系统高效运行的关键。本文在考虑平衡负载时没有对每个任务的运行时间进行严格精确地测量,只是凭个人使用经验对任务进行划分。下一步将强化调度模块负载均衡功能的设计,对每种扫描任务进行评估,重新划分任务,使每个内核的负载尽可能达到均衡。
  其次,虽然并行扫描可以实现多类型、多端口、多主机的并行扫描,但是由于扫描类型的不同,所消耗的时间也不同。下一步将对每种扫描的负载进行测量,并深入每种扫描模式的内部,根据扫描内部运行负载重新划分任务,将负载较重的任务再划分为多个并行的进程,进一步提高扫描速度。比如对操作系统扫描过程进行分解,将指纹匹配过程分解为多个进程并行运行。
  6 结论
  本文研究提出了基于多核的NMAP并行扫描设计方案。基于对高速网络扫描的需求,将NMAP整体扫描流程分成多个独立的模块,并设计提出流水线的扫描方式,通过流水设计减少每次等待目标主机返回数据包到再次组包之间所消耗的时间,并在此基础上,提出多流水线并行扫描设计,进一步提高NMAP的扫描速度,改进NMAP的不足。文章最后推导了并行设计方案的理论加速比。本文中NMAP并行扫描的设计思想在863计划“密码算法和安全协议自动化检测工具开发及测评系统”中得到了应用,效果良好。


发表于 2012-11-16 16:40:46 | 显示全部楼层
楼主good  
发表于 2014-9-27 17:54:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-10-26 15:13:14 | 显示全部楼层
看看..  
发表于 2014-11-18 14:35:25 | 显示全部楼层
顶的就是你  
发表于 2014-12-6 09:20:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-12-29 14:37:05 | 显示全部楼层
楼上的话等于没说~~~  
发表于 2015-1-29 10:54:02 | 显示全部楼层
我有家的感觉~~你知道吗  
发表于 2015-3-3 13:29:37 | 显示全部楼层
在线等在线等  
发表于 2015-3-31 08:51:55 | 显示全部楼层
设置阅读收费赚钱快啊  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则