目前主要的端口扫描技术有以下几种:
1.TCP connect Scan(TCP连接扫描)
这种方法也称之为“TCP全连接扫描”。它是最简单的一种扫描技术,所利用的是TCP协议的3次握手过程。它直接连到目标端口并完成一个完整的3次握手过 程(SYN、SYN/ACK和ACK)。操作系统提供的“connect()”函数完成系统调用,用来与目标计算机的端口进行连接。如果端口处于侦听状 态,那么“connect()”函数就能成功。否则,这个端口是不能用的,即没有提供服务。
TCP连接扫描技术的一个最大的优点是不需要任何权限,系统中的任何用户都有权利使用这个调用。另一个好处是速度快。如果对每个目标端口以线性的方式,使 用单独的“connect()”函数调用,那么将会花费相当长的时间,用户可以同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许用户设置一个低的 时间以用尽周期,并同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且很容易被过滤掉。目标计算机的日志文件会显示一连串的连接和连接出错的服务 消息,目标计算机用户发现后就能很快使它关闭。 


2.TCP SYN Scan(TCP同步序列号扫描)
若端口扫描没有完成一个完整的TCP连接,即在扫描主机和目标主机的一指定端口建立连接的时候,只完成前两次握手,在第三步时,扫描主机中断了本次连接, 使连接没有完全建立起来,所以这种端口扫描又称为“半连接扫描”,也称为“间接扫描”或“半开式扫描”(Half Open Scan)。
SYN扫描,通过本机的一个端口向对方指定的端口,发送一个TCP的SYN连接建立请求数据报,然后开始等待对方的应答。如果应答数据报中设置了SYN位 和ACK位,那么这个端口是开放的;如果应答数据报是一个RST连接复位数据报,则对方的端口是关闭的。使用这种方法不需要完成Connect系统调用所 封装的建立连接的整个过程,而只是完成了其中有效的部分就可以达到端口扫描的目的。
此种扫描方式的优点是不容易被发现,扫描速度也比较快。同时通过对MAC地址的判断,可以对一些路由器进行端口扫描,缺点是需要系统管理员的权限,不适合 使用多线程技术。因为在实现过程中需要自己完成对应答数据报的查找、分析,使用多线程容易发生数据报的串位现象,也就是原来应该这个线程接收的数据报被另 一个线程接收,接收后,这个数据报就会被丢弃,而等待线程只好在超时之后再发送一个SYN数据报,等待应答。这样,所用的时间反而会增加。


3.TCP FIN Scan(TCP结束标志扫描)
这种扫描方式不依赖于TCP的3次握手过程,而是TCP连接的“FIN”(结束)位标志。原理在于TCP连接结束时,会向TCP端口发送一个设置了FIN 位的连接终止数据报,关闭的端口会回应一个设置了RST的连接复位数据报;而开放的端口则会对这种可疑的数据报不加理睬,将它丢弃。可以根据是否收到 RST数据报来判断对方的端口是否开放。
此扫描方式的优点比前两种都要隐秘,不容易被发现。该方案有两个缺点:首先,要判断对方端口是否开放必须等待超时,增加了探测时间,而且容易得出错误的结 论;其次,一些系统并没有遵循规定,最典型的就是Microsoft公司所开发的操作系统。这些系统一旦收到这样的数据报,无论端口是否开放都会回应一个 RST连接复位数据报,这样一来,这种扫描方案对于这类操作系统是无效的。


4.IP Scan(IP协议扫描) 
这种方法并不是直接发送TCP协议探测数据包,而是将数据包分成两个较小的IP协议段。这样就将一个TCP协议头分成好几个数据包,从而过滤器就很难探测到。但必须小心,一些程序在处理这些小数据包时会有些麻烦。


5.TCP Xmas Tree Scan
这种方法向目标端口发送一个含有FIN(结束)、URG(紧急)和PUSH(弹出)标志的分组。根据RFC793,对于所有关闭的端口,目标系统应该返回RST标志。根据这一原理就可以判断哪些端口是开放的。


6.TCP Null Scan
这种方法与上一方法原理是一样,只是发送的数据包不一样而已。本扫描方案中,是向目标端口发送一个不包含任何标志的分组。根据RFC793,对于所有关闭的端口,目标系统也应该返回RST标志。


7.UDP Scan(UDP协议扫描)
在UDP扫描中,是往目标端口发送一个UDP分组。如果目标端口是以一个“ICMP port Unreachable”(ICMP端口不可到达)消息来作为响应的,那么该端口是关闭的。相反,如果没有收到这个消息那就可以推断该端口打开着。还有就 是一些特殊的UDP回馈,比如SQL Server服务器,对其1434号端口发送“x02”或者“x03”就能够探测得到其连接端口。由于UDP是无连接的不可靠协议,因此这种技巧的准确性 很大程度上取决于与网络及系统资源的使用率相关的多个因素。另外,当试图扫描一个大量应用分组过滤功能的设备时,UDP扫描将是一个非常缓慢的过程。如果 要在互联网上执行UDP扫描,那么结果就是不可靠的。


8.ICMP echo扫描 
其实这并不能算是真正意义上的扫描。但有时的确可以通过支持Ping命令,判断在一个网络上主机是否开机。Ping是最常用的,也是最简单的探测手段,用 来判断目标是否活动。实际上Ping是向目标发送一个回显(Type=8)的ICMP数据包,当主机得到请求后,再返回一个回显(Type=0)的数据 包。而且Ping程序一般是直接实现在系统内核中的,而不是一个用户进程,更加不易被发现。


9.高级ICMP扫描技术
Ping是利用ICMP协议实现的,高级的ICMP扫描技术主要利用ICMP协议最基本的用途——报错。根据网络协议,如果接收到的数据包协议项出现了错 误,那么接收端将产生一个“Destination Unreachable”(目标主机不可达)ICMP的错误报文。这些错误报文不是主动发送的,而是由于错误,根据协议自动产生的。
当IP数据包出现Checksum(校验和)和版本的错误的时候,目标主机将抛弃这个数据包;如果是Checksum出现错误,那么路由器就直接丢弃这个数据包。有些主机比如AIX、HP/UX等,是不会发送ICMP的Unreachable数据包的。
例如,可以向目标主机发送一个只有IP头的IP数据包,此时目标主机将返回“Destination Unreachable”的ICMP错误报文。如果向目标主机发送一个坏IP数据包,比如不正确的IP头长度,目标主机将返回“Parameter Problem”(参数有问题)的ICMP错误报文。
注意:如果是在目标主机前有一个防火墙或者一个其他的过滤装置,可能过滤掉提出的要求,从而接收不到任何的回应。这时可以使用一个非常大的协议数字作为 IP头部的协议内容,而且这个协议数字至少在今天还没有被使用,主机一定会返回Unreachable;如果没有Unreachable的ICMP数据包 返回错误提示,那么,就说明被防火墙或者其他设备过滤了,也可以用这个方法探测是否有防火墙或者其他过滤设备存在。