十一、 时间和性能
Nmap 开发的最高优先级是性能。在本地网络对一个主机的默认扫描(nmap hostname)需要 1/5 秒。而仅仅眨眼的时间,就需要扫描上万甚至几十万的主机。此外,一些特定的扫描选项会明 显增加扫描时间,如 UDP 扫描和版本检测。同样,防火墙配置以及特殊的响应速度限制也会增 加时间。Nmap 使用了并行算法和许多先进的算法来加速扫描,用户对 Nmap 如何工作有最终的控 制权。高级用户可以仔细地调整 Nmap 命令,在满足时间要求的同时获得他们所关心的信息。
改善扫描时间的技术有:忽略非关键的检测、升级最新版本的 Nmap(性能增强不断改善)。 优化 时间参数也会带来实质性的变化,这些参数如下。
--min-hostgroup <milliseconds>; --max-hostgroup <milliseconds>
(调整并行扫描组的大 小)
Nmap 具有并行扫描多主机端口或版本的能力,Nmap 将多个目标 IP 地址空间分成组,然 后在同一时间对一个组进行扫描。通常,大的组更有效。缺点是只有当整个组扫描结束 后才会提供主机的扫描结果。如果组的大小定义为 50,则只有当前 50 个主机扫描结束后 才能得到报告(详细模式中的补充信息除外)。
默认方式下,Nmap 采取折衷的方法。开始扫描时的组较小,最小为 5,这样便于尽快产 生结果;随后增长组的大小,最大为 1024。确切的大小依赖于所给定的选项。为保证效 率,针对 UDP 或少量端口的 TCP 扫描,Nmap 使用大的组。
--max-hostgroup 选项用于说明使用最大的组 Nmap 不会超出这个大小 --min-hostgroup 选项说明最小的组,Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主 机来满足所指定的最小值,Nmap 可能会采用比所指定的值小的组。这两个参数虽然很少 使用,但都用于保持组的大小在一个指定的范围之内。
这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常选择 256 来扫描 C 类网段。对于端口数较多的扫描,超出该值没有意义。对于端口数较少的扫描 2048 或更大的组大小是有帮助的。
--min-parallelism <milliseconds>; --max-parallelism <milliseconds>
(调整探测报文的 并行度)
这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下, Nmap 基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap 降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值可 能为 1,在好的条件下,可能会增长至几百。
最常见的应用是--min-parallelism 值大于 1,以加快性能不佳的主机或网络的扫描。这 个选项具有风险,如果过高则影响准确度,同时也会降低 Nmap 基于网络条件动态控制并 行度的能力。这个值设为 10 较为合适,这个值的调整往往作为最后的手段。
--max-parallelism 选项通常设为 1,以防止 Nmap 在同一时间向主机发送多个探测报文 和选择--scan-delay 同时使用非常有用,虽然这个选项本身的用途已经很好。
--min_rtt_timeout <milliseconds>, --max-rtt-timeout <milliseconds>
,
--initial-rtt-timeout <milliseconds>
(调整探测报文超时)
Nmap 使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新发送探测 报文。Nmap 基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著和不 定,这个超时值会增加几秒。初始值的比较保守(高),而当 Nmap 扫描无响应的主机时, 这个保守值会保持一段时间。
这些选项以毫秒为单位,采用小的--max-rtt-timeout 值,使 --initial-rtt-timeout 值大于默认值可以明显减少扫描时间,特别是对不能 ping 通的扫描(-P0)以及具有严格 过滤的网络。如果使用太小的值,使得很多探测报文超时从而重新发送,而此时可能响 应消息正在发送,这使得整个扫描的时间会增加。
如果所有的主机都在本地网络,对于--max-rtt-timeout 值来说,100 毫秒比较合适。如 果存在路由,首先使用 ICMP ping 工具 ping 主机,或使用其它报文工具如 hpings,可以 更好地穿透防火墙。查看大约 10 个包的最大往返时间,然后将 --initial-rtt-timeout 设成这个时间的 2 倍,--max-rtt-timeout 可设成这个时间值的 3 倍或 4 倍。通常,不 管 ping 的时间是多少,最大的 rtt 值不得小于 100ms,不能超过 1000ms。
--min_rtt_timeout 这个选项很少使用,当网络不可靠时, Nmap 的默认值也显得过于强 烈,这时这个选项可起作用。当网络看起来不可靠时,Nmap 仅将超时时间降至最小值, 这个情况是不正常的,需要向 namp-dev 邮件列表报告 bug。
--host-timeout <milliseconds>
(放弃低速目标主机)
由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因,一些主机需要很长的时间扫描。这些极少数的主机扫描往往占据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机 使用 --host-timeout 选项来说明等待的时 间(毫秒)。通常使用 1800000 来保证 Nmap 不会在单个主机上使用超过半小时的时间。需 要注意的是,Nmap 在这半小时中可以同时扫描其它主机,因此并不是完全放弃扫描。超 时的主机被忽略,因此也没有针对该主机的端口表、操作系统检测或版本检测结果的输 出。
--scan-delay <milliseconds>; --max_scan-delay <milliseconds>
(调整探测报文的时间间 隔)
这个选项用于 Nmap 控制针对一个主机发送探测报文的等待时间(毫秒),在带宽控制的情 况下这个选项非常有效。Solaris 主机在响应 UDP 扫描探测报文报文时,每秒只发送一个 ICMP 消息 因此 Nmap 发送的很多数探测报文是浪费的 --scan-delay 设为 1000 使 Nmap 低速运行。Nmap 尝试检测带宽控制并相应地调整扫描的延迟,但并不影响明确说明何种 速度工作最佳。
--scan-delay 的另一个用途是躲闭基于阈值的入侵检测和预防系统(IDS/IPS)。
-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane>
(设置时间模板)
上述优化时间控制选项的功能很强大也很有效,但有些用户会被迷惑。此外,往往选择合适参数的时间超过了所需优化的扫描时间。因此,Nmap 提供了一些简单的方法,使用 6 个时间模板,使用时采用-T 选项及数字(0 - 5) 或名称。模板名称有 paranoid (0)、 sneaky (1)、polite (2)、normal(3)、 aggressive (4)和 insane (5)。前两种模式用 于 IDS 躲避,Polite 模式降低了扫描速度以使用更少的带宽和目标主机资源。默认模式 为 Normal,因此-T3 实际上是未做任何优化。Aggressive 模式假设用户具有合适及可靠 的网络从而加速扫描。Insane 模式假设用户具有特别快的网络或者愿意为获得速度而牺 牲准确性。
用户可以根据自己的需要选择不同的模板,由 Nmap 负责选择实际的时间值。模板也会针 对其它的优化控制选项进行速度微调。例如,-T4 针对 TCP 端口禁止动态扫描延迟超过 10ms,-T5 对应的值为 5ms。模板可以和优化调整控制选项组合使用,但模板必须首先指 定,否则模板的标准值会覆盖用户指定的值。建议在扫描可靠的网络时使用 -T4,即使 在自己要增加优化控制选项时也使用(在命令行的开始),从而从这些额外的较小的优化 中获益。
如果用于有足够的带宽或以太网连接,仍然建议使用-T4 选项。有些用户喜欢-T5 选项, 但这个过于强烈。有时用户考虑到避免使主机崩溃或者希望更礼貌一些会采用-T2 选项 他们并没意识到-T Polite 选项是如何的慢,这种模式的扫描比默认方式实际上要多花 10 倍的时间。默认时间选项(-T3)很少有主机崩溃和带宽问题,比较适合于谨慎的用户 不进行版本检测比进行时间调整能更有效地解决这些问题。
虽然-T0 和-T1 选项可能有助于避免 IDS 告警,但在进行上千个主机或端口扫描时,会显 著增加时间。对于这种长时间的扫描,宁可设定确切的时间值,而不要去依赖封装的-T0 和-T1 选项。
T0 选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口,每个探测报文的发 送间隔为 5 分钟 T1 和 T2 选项比较类似 探测报文间隔分别为 15 秒和 0.4 秒 T3 是 Nmap 的默认选项,包含了并行扫描。 T4 选项与 --max-rtt-timeout 1250 --initial-rtt-timeout 500
等价,最大 TCP 扫描延迟为 10ms。T5 等价于 --max-rtt-timeout 300 --min_rtt_timeout 50 --initial-rtt-timeout 250 --host-timeout 900000
,最大 TCP 扫描延迟为 5ms。