Zależności czasowe i wydajność

Zawsze najważniejszym priorytetem przy tworzeniu Nmapa była wysoka wydajność. Domyślne skanowanie (nmap <nazwahosta>) hosta w sieci lokalnej zajmuje tylko jedną piątą sekundy. Jest to zadowalający czas, jednak przy skanowaniu setek tysięcy adresów sumaryczny czas staje się bardzo duży. Dodatkowo niektóre typy skanowania, takie jak skanowanie UDP i detekcja wersji także wpływają negatywnie na czas wykonania, podobnie jak konfiguracja systemów zaporowych, na przykład limitująca ilość pakietów. Nmap posiada możliwości równoległego skanowania i odpowiednie zaawansowane algorytmy przyspieszające skanowanie, a użytkownik posiada ogromne możliwości wpływania na to jak są one wykorzystywane. Zaawansowani użytkownicy uważnie przeglądający komendy Nmapa, nakazują mu dostarczanie tylko istotnych informacji zgodnie z przyjętymi wymaganiami i założeniami czasowymi.

Techniki przyspieszające skanowanie dotyczą ograniczenia wykonywania mało istotnych testów i częstej zmiany wersji Nmapa na najnowszą (zmiany dotyczące przyszpieszenia pracy są wprowadzane dosyć często). Optymalizacja parametrów dotyczących szybkości skanowania również ma duży wpływ i została opisana poniżej.

--min-hostgroup <ilość_hostów>; --max-hostgroup <numhosts> (Zmiana ilości hostów w grupie)

Nmap posiada możliwość skanowania portów i wersji na wielu hostach równocześnie. Jest to realizowane poprzez dzielenie listy adresów docelowych na grupy, które są następnie kolejno skanowane. Ogólnie skanowanie większych grup jest bardziej efektywne. Wadą tego rozwiązania jest opóźnienie w podawaniu wyników testów do czasu przeskanowania całej grupy. Przykładowo, jeśli Nmap rozpoczął skanowanie w grupach po 50 adresów, żadne wyniki nie zostaną wyświetlone (poza informacjami podawanymi przez -v) do czasu zakończenia skanowania pierwszych 50 adresów.

Domyślnie Nmap stosuje rozwiązanie kompromisowe. Rozpoczyna z grupą o rozmiarze 5, co pozwala szybko wyświetlić pierwsze wyniki, a następnie stopniowo powiększa rozmiar grupy aż do maksymalnie 1024. Dokładne wykorzystywane rozmiary grup są uzależnione od podania dodatkowych opcji. Dla uzyskania większej efektywności Nmap używa większych grup dla skanowań UDP oraz przy skanowaniach TCP dotyczących zaledwie kilku portów.

Jeśli maksymalny rozmiar grupy został określony za pomocą opcji --max-hostgroup, Nmap nigdy nie przekroczy tego limitu. Analogicznie podanie minimalnego rozmiaru za pomocą --min-hostgroup wymusi stosowanie grup o przynajmniej takim rozmiarze. Nmap może użyć mniejszej grupy tylko w przypadku, kiedy ilość adresów do przeskanowania jest mniejsza niż założone minimum. Obie wymienione opcje pozwalają na utrzymywanie rozmiaru grupy w podanym przedziale, jednak jest to rzadko potrzebne.

Podstawowym zastosowaniem tych opcji jest podawanie dużego minimalnego rozmiaru grupy tak, żeby pełne skanowanie odbywało się szybciej. Często stosowaną wartością jest 256, co pozwala na skanowanie w kawałkach o rozmiarze klasy C. Przy skanowaniu wielu portów, stosowanie większych wartości minimalnych przeważnie nie poprawi wydajności. W przypadku skanowania małych ilości portów pomocne może być stosowanie grup o rozmiarze 2048 lub nawet większym.

--min-parallelism <ilość_prób>; --max-parallelism <ilość_prób> (Kontrola współbierzności testów)

Opcja ta kontroluje ilość jednoczesnych dla danej grupy adresów testów i jest wykorzystywana podczas wykrywania hostów i skanowania portów. Domyślnie Nmap dobiera idealną ilość testów w zależności od parametrów sieci. Jeśli jakiś pakiet zostanie zagubiony, zwalnia i zaczyna wykonywać mniejszą ilość testów równolegle. Nmap próbuje powoli przyspieszać, jeśli nie są gubione pakiety. Podane opcje pozwalają na określenie minimalnego i maksymalnego limitu ilości jednocześnie wykonywanych testów. Normalnie ilość ta może spaść do 1 przy złych warunkach sieciowych lub wzrosnąć do kilkuset w idealnych warunkach.

Najczęściej wykorzystywana jest opcja --min-parallelism do ustawiania wyższej niż 1 wartości przy skanowaniu sieci przy złych warunkach. Zmiana tej opcji może być ryzykowna, ponieważ ustawienie zbyt wysokiej wartości może sie odbić na poprawności testów. Wykorzystanie jej także pociąga za sobą zmniejszenie możliwości Nmapa w zakresie dynamicznego dostosowywania się do warunków panujących w sieci. Ustalenie minimalnej ilości na 10 może być sensowne, jednak powinno być stosowane w ostateczności.

Opcja --max-parallelism jest czasami wykorzystywana do zmuszenia Nmapa do nie przeprowadzania więcej niż jednego testu równolegle, co może być użyteczne w połączeniu z opcją--scan-delay (opisaną dalej).

--min-rtt-timeout <czas>, --max-rtt-timeout <czas>, --initial-rtt-timeout <czas> (Kontrola czasu oczekiwania na wykonanie testu)

Nmap posiada mechanizm kontrolujący czas oczekiwania na wynik testu, zanim nie zostanie on ponowiony. Czas oczekiwania jest zależny od czasu wykonania poprzednich testów. Jeśli opóźnienia w sieci okażą sie duże i zmienne, czas oczekiwania może zwiększyć sie do kilku sekund. Początkowa wartość jest dosyć konserwatywna (wysoka) i może taka pozostać w przypadku skanowania nie odpowiadających hostów.

Opcje przyjmują wartości w milisekundach, ale można dodać litery s, m lub h odnoszące się odpowiednio do sekund, minut i godzin. Podanie niższych wartości --max-rtt-timeout i --initial-rtt-timeout niż domyślne, może znacząco skrócić czas skanowania. Jest to głównie widoczne w przypadku skanowania bez wykorzystywania pinga (-P0) oraz przy skanowaniu dobrze filtrowanych sieci. Nie można również przesadzać w drugą stronę, ustawienie zbyt małego czasu może przekładać sie na dłuższy czas skanowania przez niepotrzebne retransmisje spowodowane upływem czasu oczekiwania na odpowiedź.

Jeśli wszystkie skanowane hosty są w sieci lokalnej, sensownym agresywnym ustawieniem opcje --max-rtt-timeout jest 100 milisekund. Jeśli skanowany ma być inny segment, warto sprawdzić czasy odpowiedzi dla protokołu ICMP - za pomocą narzędzia ping lub innego pozwalającego na definiowanie pakietów mogących omijać system zaporowy, takiego jak hping2. Interesującą nas wielkością jest maksymalny czas odpowiedzi dla 10 lub więcej pakietów. Uzyskany czas może zostać po podwojeniu wykorzystany jako wartość dla --initial-rtt-timeout, a po pomnożeniu przez trzy lub cztery dla --max-rtt-timeout. Nie jest zalecane ustawianie maksymalnego rtt poniżej 100ms, niezależnie od czasów pingowania, podobnie większego niż 1000ms.

--min-rtt-timeout jest rzadko wykorzystywaną funkcją, która może być przydatna jeśli komunikacja sieciowa jest tak niepewna, że nawet domyślne ustawienia Nmapa są zbyt agresywne. Jako że Nmap redukuje czas oczekiwania tylko do momentu w którym sieć zacznie działać poprawnie, potrzeba dodatkowego wydłużania czasu oczekiwania nie jest normalna i powinna zostać zaraportowana jako błąd na liście dyskusyjnej nmap-dev.

--max-retries <ilość> (Maksymalna ilość prób ponawiania skanowania portów)

Kiedy Nmap nie otrzyma odpowiedzi na skanowanie portu, może to oznaczać, że port ten jest filtrowany. Możliwe jest jednak także, że pakiet testu lub odpowiedzi po prostu zaginął w sieci, albo że host limituje ilość możliwych odpowiedzi w jednostce czasu i właśnie tymczasowo je zablokował. Większą pewność uzyskuje się dzieki powtarzaniu testu w przedstawionych przypadkach. Jeśli Nmap wykryje problemy z komunikacją sieciową, może ponawiać próbę badania portu wiele razy, zanim sie podda. Z jednej strony zwiększa to dokładność testów, z drugiej wydłuża czas ich wykonania. Jeśli wydajność jest krytycznym aspektem, skanowania mogą zostać przyspieszone poprzez limitowanie dozwolonej ilości retransmisji. Ustawienie opcji --max-retries 0 , całkowicie wyłączającej powtarzanie testów jest wykorzystywane sporadycznie.

Domyślnie (bez stosowania opcji -T) dozwolone jest maksymalnie 10 powtórzeń. Jeśli sieć działa prawidłowo i skanowane hosty nie limitują ilości pakietów, Nmap zwykle wykorzystuje jedną retransmisję. Dlatego też większość skanowań nie zostanie dotkniętych zmianą wartości --max-retries na trzy. Stosowanie tak niskich wartości pozwala na znaczne przyspieszenie skanowania hostów limitujących ilość odpowiedzi. Jeśli Nmap będzie zbyt szybko poddawał się przy skanowaniu portów, część informacji nie zostanie zebrana, dlatego być może warto skorzystać z opcji przerywającej test --host-timeout, która dotyczy całego hosta, a nie tylko pojedynczych testów.

--host-timeout <czas> (Pomijaj powolne hosty)

Skanowanie niektórych hostów trwa bardzo długo. Może to być spowodowane niezbyt wydajnym sprzętem sieciowym lub oprogramowaniem, limitowaniem ilości pakietów czy restrykcjami systemu zaporowego. Niewielki procent hostów może zabrać większość czasu przeznaczonego na skanowanie. Czasami najlepszym rozwiązaniem jest ich pominięcie z wykorzystaniem opcji --host-timeout z parametrem oznaczającym ilość milisekund, jakie jesteśmy w stanie poświęcić na czekanie per host. Parametr można również podawać w sekundach, minutach lub godzinach dodając odpowiednio litery s, m lub h. Często dodaję 30m żeby mieć pewność, że Nmap nie będzie skanował jednego hosta dłużej niż pół godziny. Trzeba pamiętać, że Nmap może równolegle w tym czasie skanować inne hosty, więc nie bedzie to czas kompletnie stracony. Host który przekroczy czas jest pomijany i nie są dla niego wyświetlane wyniki takie jak lista portów, system operacyjny czy wersje usług.

--scan-delay <czas>; --max-scan-delay <czas> (Ustaw opóźnienie pomiędzy testami)

Opcja pozwala na narzucenie czasu w milisekundach jaki musi minąć pomiędzy kolejnymi testami dla badanego hosta. Podobnie jak przy innych opcjach pozwalających na określanie czasu, można dodać s, m lub h do parametru do określenia go odpowiednio w sekundach, minutach lub godzinach. Opcja ta jest szczególnie użyteczna w przypadku systemów limitujących ilość pakietów. Solaris zwykle odpowiada na skanowanie UDP poprzez wysyłanie tylko jednego pakietu ICMP na sekundę, więc wysyłanie zapytań szybciej jest zupełnie nie potrzebne. Wykorzystanie opcji --scan-delay 1s pozwala na wymuszenie odpowiedniej prędkości skanowania. Normalnie Nmap stara się wykryć jaka powinna być optymalna prędkość skanowania dla każdego hosta, jednak ręczne dodanie takiej opcji nie zaszkodzi, o ile znana jest optymalna prędkość.

Kiedy Nmap zwiększa czas opóźnienia, dostosowując go do limitu ilości otrzymywanych odpowiedzi, czas skanowania dramatycznie rośnie. Opcja --max-scan-delay pozwala na ustawienie maksymalnego limitu do którego może być automatycznie zwiększane opóźnienie. Ustawienie tej wartości zbyt nisko może spowodować niepotrzebne retransmisje i pominięcie niektórych portów w przypadku hostów ściśle limitujących ilość pakietów.

Inną możliwością wykorzystanie opcji --scan-delay jest omijanie systemów detekcji intruzów (IDS/IPS).

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (Ustawnienie szablonu zależności czasowych skanowania)

Opisane wcześniej opcje do zmiany zależności czasowych pozwalają na efektywne i precyzyjne sterowanie skanowaniem, jednak wiele osób uzna je za niepotrzebnie skomplikowane. Dodatkowo w wielu przypadkach dobranie odpowiedniej kombinacji parametrów może zająć więcej czasu, niż samo skanowanie. Z tego powodu Nmap oferuje prostrze rozwiązanie w postaci sześciu szablonów. Ich wybór jest możliwy poprzez wykorzystanie opcji -T z parametrem oznaczającym numer lub nazwę szablonu. Dostępne szablony to paranoid (0, paranoidalny), sneaky (1, podstępny), polite (2, grzeczny), normal (3, normalny), aggressive (4, agresywny) i insane (5, szalony). Pierwsze dwa wykorzystywane są do omijania systemów IDS. Szablon polite spowalnia skanowanie powodując mniejsze obciążenie łącza i zmniejszające wykorzystanie zasobów w badanym systemie. Domyślnie używany jest normal, więc podawanie -T3 nic nie zmieni. Szablon agresywny przyspiesza skanowanie przy założeniu że korzystamy z szybkiej i nie przeciążonej sieci. Insane zakłada wykorzystanie ponad przeciętnie szybkiej sieci lub jeśli chcemy uzyskać dużą szybkość kosztem możliwej utraty dokładności.

Szablony pozwalają poinformować Nmapa jak dużej agresywności od niego oczekujemy przy jednoczesnym pozwoleniu mu na automatyczne dobieranie pozostałych parametrów czasowych. Wprowadzane też są inne drobne modyfikacje, do których nie istnieją odzielne opcje. Na przykład, -T4 zabrania wzrostu dynamicznego opóźnienia skanowania powyżej 10ms dla portów TCP, a w przypadku -T5 powyżej 5ms. Szablony mogą być używane w połączeniu z innymi opcjami do ustawiania zależności czasowych o ile zostaną umieszczone przed pozostałymi opcjami w linii poleceń (inaczej domyślne ustawienia z szablonu zastąpią ustawione innymi opcjami). Większość dzisiejszych sieci może być z powodzeniem skanowana z wykorzystaniem opcji -T4.

Jeśli używasz łącza szerokopasmowego lub sieci ethernet, rekomendowane jest stałe używanie szablonu -T4. Wiele osób lubi -T5, lecz jest ono jak dla mnie trochę za agresywne. Ludzie czasami używają -T2 ponieważ myślą, że zminiejszają szanse na zawieszenie serwera lub uważają się za bardziej kulturalnych z założenia, często nie zdając sobie sprawy z tego, jak wolne jest -T Polite - ich skanowania może trwać dziesięć razy dłużej. Zawieszanie hostów i problemy z pasmem są rzadko spotykane przy domyślym -T3, i ta opcja jest polecana dla ostrożnych skanujących. Nie włączanie detekcji wersji jest daleko bardziej efektywnym sposobem na unikanie problemów.

Podczas gdy opcje -T0 i -T1 mogą być użyteczne przy unikaniu wykrycia przez systemy IDS, są niesamowicie powolne przy skanowaniu setek adresów lub portów. Przy tak długich skanowaniach możesz raczej chcieć ustawić ręcznie poszczególne zależności czasowe, niż polegać na predefiniowanych wartościach z -T0 i -T1.

Głównym efektem działania T0 jest ograniczenie ilości równolegle przeprowadzanych testów do jednego i wprowadzenie odstępu pomiędzy kolejnymi testami o długości 5 minut. Opcje T1 i T2 są podobne, ale czakają już tylko odpowiednio 15 i 0.4 sekundy pomiędzy testami. T3 jest domyślnym ustawieniem Nmapa włączając w to zrównoleglanie testów. T4 jest odpowiednikiem podania opcji --max-rtt-timeout 1250 --initial-rtt-timeout 500 --max-retries 6 i ustawienia maksymalnego opóźnienia przy skanowaniu TCP na 10 milisekund. Opcja T5 jest alternatywą dla --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --max-retries 2 --host-timeout 900000 oraz ustawienia maksymalnego czasu opóźnienia dla skanowania TCP na 5ms.