这些选项并非必需的,但有些会非常实用。
-P0 在扫描前不尝试或者PING主机,这是用来扫描那些不允许ICMP echo 请求(或应答)的主机。microsoft.com就是这其中的一个例子,我们就必须使用-P0或者-PT80来察看microsoft.com的端口。
-PT 用TCP的ping来确定主机是否打开。作为替代发送ICMP echo请求包并等待回应的方式,我们可以大量发送TCP ACK包往目标网络(或者单机)并一点点地等待它的回应,打开的主机会返回一个RST。这一参数可以让你在ping信息包阻塞时仍能高效率地扫描一个网络/主机。对非root的用户,我们用connect(),以如下格式设置目标探针-PT
-PS 这一选项是root用户使用的,能用SYN(连接请求)包替代ACK包,打开的主机会有一个RST(或者SYN|ACK——但比较少见)应答。
-PI 这一选项是使用一个真正的ping(ICMP echo request)包。它找到开放的主机并且将该子网中的广播地址全数搜寻——该广播地址是能够到达并能正确解析IP包的。如果其会被大量的DoS(denial of service)攻击时,我们就能找到它。
-PB 默认的ping形式,它用于ACK(-PT)与ICMP(-PI)并行攻击,以这一形式可以通过防火墙或包过滤。
-O 经由TCP/IP获取‘指纹’来判别主机的OS类型,用另一说法,就是用一连串的信息包探测出你所扫描的主机位于操作系统有关堆栈信息并区分其精细差别,以此判别操作系统。它用搜集到的信息建立一个“指纹”用来同已知的操作系统的指印相比较(the nmap-os-fingerprints file)——这样判定操作系统就有了依据。如果你发现一台机器开了至少一个端口并得到错误的诊断信息,那么你可以写信告诉我相关细节比如操作系统版本或侦测到的操作系统版本图,如果他有端口开放但nmap返回'不可识别的操作系统',这可能也是有用的,你可以将它的IP告诉我或者另一个办法是用nmap的-d参数并告诉我它返回的“指印”——操作系统和版本号,这样做,也算是对nmap在判定操作系统的进一步开发中做了些事情,以便后续版本中它能更精确地判别系统类型。
-I 这是用ident扫描方式的参数,如Dave Goldsmith于1996年在Bugtraq中所说的,这个ident协议(rfc 1413)允许通过TCP连接得到拥有进程的用户名——即使这个连接不是由该进程发起的。所以呢,举个例吧,你可以通过ident连接到一个http端口并找出该进程是否由root运行,但这只能在“全开”的对目标端口的TCP连接中使用(象-sT扫描参数)。当你用-I参数时,远程主机的identd在开放的端口接受连接质询——很明显的,如果主机不运行identd的话,那它就无法正常工作。
-f 这个参数配置以细小的IP碎片包实现SYN,FIN,XMAS或NULL扫描请求。这个想法是把TCP包头分别放在几个不同的信息包中,使包过滤器难于运作,而后你就可以闯入系统做你想做的事了。但要注意,部份程序可能会对这些小信息包处理错误。比方说我最喜欢的sniffer segmentation在接收第一个36字节的信息碎片时就出现麻烦,之后又来了个24字节的!当包过滤器和能将IP碎片排列的防火墙没有获得此顺序时(就象linux内核中的CON-FIG_IP_ALWAYS_DEFRAG选项),一些网络系统就不能反映出找到目标,并且放弃。
记住这个参数不一定能很好地工作在任何系统上,它在我的Linux,FreeBSD以及OpenBSD下是正常的,当然也有一些人说它能在部份不同的*NIX环境下工作。
-v 详细模式。这是被强烈推荐的选项,因为它能带来你想要的更多信息。你可以重复使用它以获得更大效果。如果你需要大量翻动屏幕请使用 -d 命令两次
-h 这是一个快捷的帮助选项,可以在屏幕上显示nmap的参数使用方法——象你注意到的那样,这个man page实在不是一个“快速入门参考”:)
-o
-m 这也是存放扫描结果的参数,但它是存放机器可解析(machine parseable)结果的,你可以用-m 带'-'(引号不用)将其输出到标准输出里(用shell的管道符……)。在这种形式下,正常的输出被禁止了,你需要察看一些错误信息来了解情况。
-i
-p
-F 快速扫描模式。指定只希望扫描nmap里提供的services file中列出的端口列表里的端口。这明显会比扫描所有65535个端口来得快。
-D
-S
-e
-g
-M