## 十一、 時間和性能
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。