有时,故事是理解决策的最佳方法,例如我们如何决定在解决方案中使用哪些命令行。有一天,Gordon在家待的无聊了,他开始在网络上到处闲逛,无意中发现了一个网站Playboy(^^)。他们的主要站点包含大量图像,但是大多数都被锁定在付费订阅身份验证系统的后面。Gordon很好奇我是否可以在他们的网络上找到其他免费提供图像的系统。Gordon猜测该网站可能会有一些临时的或者是正在开发阶段的服务器,而这些服务器的身份认证方式可能存在漏洞。尽管理论上此类服务器可以侦听任何端口号,但最有可能的端口是TCP端口80。因此,他决定尽快扫描其整个网络以查找该开放端口。
首先,Gordon要确定的是需要扫描哪个IP地址。他对名为Playboy的组织进行了美国互联网号码注册(ARIN)的whois搜索。
例1: 查询Playboy的IP地址空间

如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
Gordon发现Playboy公司注册了4096个IP地址(216.163.128.0/20)。用4096个IP作为本例的样本已经足够了,虽然Playboy公司可能还注册了其它的IP地址段,但作为一次测试,4096个IP已经足够了。
接下来,Gordon想估计这些机器的延迟,以便Nmap知道会发生什么。这不是必须的步骤,但给Nmap设置合适的时间选项能提高扫描效率。对于单端口的扫描使用-Pn选项尤其有效。Nmap没有从每个主机接收足够的响应来准确估计延迟和数据包丢失率,因此Gordon想使用其它的工具,他首先想到的是ping网站的主Web服务器,如例2所示:
例2: Ping Playboy的web服务器以评估延迟
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
最大往返时间为58毫秒。不幸的是,该IP地址是209.247.228.201,它不在我们想要扫描的网络范围内(216.163.128.0/20)。虽然Gordon可以将该IP加入到扫描目标列表中,但是既然之前已经决定扫描范围限制在4096个IP地址范围内就不再改变了。当然,Gordon找到的延迟也能用,但要是能找到目标IP的实际延迟就更好了。Gordon使用dig获取了Playboy的公共DNS记录。如例3所示:
例3: 使用dig获取Playboy的DNS记录
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
从DNS查询结果来看,Gordon发现了两个MX(mail)服务器在216.163.128.0/20网络范围内。从这两个服务器的名字来看,它们可能分属于不同的地区,mx.chi可能在芝加哥,mx.la可能在洛杉矶。Gordon决定测试它们两者的延迟。如例4所示:
例4: ping MX服务器
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
看起来Gordon的测试失败了。ICMP ping包似乎被阻断了。因为它们是邮件服务器,所以必须打开TCP 25端口,Gordon又尝试使用hping2来ping25端口。如例5所示:
例5: pingMX服务器的25端口
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
这次测试有了结果,在洛杉矶的主机响应时间是16毫秒,而在芝加哥的主机则需要62毫米。这个结果毫不新奇,因为Gordon是从加州发起的探测。谨慎是值得的,在重度扫描期间延迟会增加,因此Gordon决定让Nmap等待长达200毫秒的响应时间,探测将从150毫秒的超时开始。Gordon使用了如下选项:- -max-rtt-timeout 200ms - -initial-rtt-timeout 150ms。然后再使用一个更加积极的时间模版-T4。
由于Gordon重视最小化整个扫描的完成时间,而不是最小化返回第一批主机结果之前的时间,因此,他指定了较大的扫描组大小,选项- -min-hostgroup 512设定每次并行扫描512台主机。使用精确的子地址块能够避免出现低效的扫描子块,就像本例中的4096台主机如果用- -min-hostgroup 500,最后就会出现96台主机的扫描子块。
由于一次ping需要花费的时间与单端口扫描本身消耗的时间相同,因此无需在先前的ping阶段浪费时间。 因此,指定了-Pn以禁用该阶段。通过使用-n参数跳过反向DNS解析,可以节省大量时间。否则,在禁用ping扫描的情况下,Nmap会尝试查找所有4096个IP。由于Gordon是要寻找web服务器,所以他将端口设定为80。当然,这样的设置会错过在非标准端口(例如81或8080)上运行的所有HTTP服务器。也不会找到使用443端口的SSL服务器。你也可以把这些端口加到选项-p之后,但是即使是多加一个端口也会让扫描时间翻倍,这大致与扫描的端口数成正比。
最后一个选项是-oG,后跟要存储grepable结果的文件名。Gordon将目标网络添加到命令的最后,然后按下enter键开始扫描。如例6所示:
例6: 开始扫描
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例
Nmap会在大约三分钟内扫描所有4096个IP。 正常输出显示一堆处于过滤状态的端口。这些IP中的大多数可能不是活动主机(端口仅显示为已过滤),因为Nmap没有收到对其SYN探针的响应。Gordon使用egrep命令,从输出文件中获得web服务器的列表。如例7所示:
例7: egrep命令查询开放80端口的主机
如何使用Nmap进行端口扫描(十二)Nmap端口扫描示例

在经过所有努力之后,只发现了在4096个IP中只有两台主机的80端口是开放的,现实世界有时就是这样的。第一台,216.163.140.20让Gordon进入到一台Microsoft Outlook Web Access(webmail)服务器。如果Gordon现在是在进行***测试,那么这个发现将会令他很兴奋,但现在不是。另外一台服务器(域名为mirrors.playboy.com)更好,它上面存储了大量Gordon想要的图片!
上述例子尽管不是端口扫描的常见原因,但单端口扫描对于之前提到的许多其他目的是很常见的。 此处描述的技术可以轻松地应用于任何单端口TCP扫描。