Опции управления временем и производительностью

Наиболее приоритетной стороной развития Nmap для меня всегда была производительность. Сканирование по умолчанию (nmap <имя_хоста>) какого-либо хоста в моей локальной сети занимает пятую долю секунды. Этого едва хватает, чтобы моргнуть, но становится существенным, когда вы сканируете сотни или тысячи хостов. Более того, некоторые типы сканирования, как например, UDP или сканирование с целью определения версии могут в значительной степени увеличить время сканирования. Этому также могут поспособствовать настройки некоторых брандмауэров, где есть ограничения на количество ответов. Хотя в Nmap используются параллелизм и различные продвинутые алгоритмы для уменьшения времени сканирования, у пользователя есть возможность полностью контролировать работу программы. Опытные пользователи Nmap задают команды таким образом, чтобы получать только необходимую им информацию и в удовлетворяющие им сроки.

Способами увеличения скорости сканирования могут быть пропуск не критичных тестов, или обновление Nmap до последней версии (улучшения производительности выходят довольно часто). Оптимизация параметров опций управления временем также может значительно повлиять на скрость сканирования. Эти опции описаны ниже.

Некоторые опции могут принимать параметр время. По умолчанию он задается в миллисекундах, но вы можете добавить ‘s’, ‘m’ или ‘h’ к значению, чтобы задать его в секундах, минутах или часах. Поэтому для опции --host-timeout аргументы 900000, 900s и 15m означают одно и то же.

--min-hostgroup <количество_хостов>; --max-hostgroup <количество_хостов> (Регулирует размер групп для параллельного сканирования)

В Nmap есть возможность осуществлять сканирование портов или сканирование с целью определения версии нескольких хостов параллельно. Это происходит путем разделения целевого IP пространства на группы, а затем сканирования одной группы за раз. В общем случае целесообразно использовать большие группы. Недостатком является то, что вы не можете узнать информацию о каком-либо хосте, пока не закончится сканирование всей группы. Таким образом, если Nmap начнет сканирование группы из 50-ти хостов, то пользователь не будет получать никакой информации (кроме обновлений информации предлагаемых в вербальном режиме), пока не будет завершено сканирование всех 50-ти хостов.

По умолчанию Nmap использует компромиссный подход к решению этой проблемы. Сначала производится сканирование небольших групп из 5-ти хостов, поэтому первые результаты приходят быстро, затем размер группы постепенно увеличивается до максимального - 1024. Точные значения по умолчанию зависят от заданных опций. Для большей эффективности Nmap использует группы больших размеров для UDP сканирования и для некоторых типов TCP сканирования портов.

Когда максимальный размер группы задан опцией --max-hostgroup, Nmap не будет его превышать. Минимальный размер группы задается опцией --min-hostgroup, и Nmap будет пытаться поддерживать размер групп больше этого уровня. Возможно Nmap придется использовать группы меньше заданных размеров, когда для выполнения условия минимальности будет не хватать целевых хостов. Эти опции могут быть использованы для удержания размера группы внутри некоторого диапазона, хотя это редко необходимо.

Эти опции не имеют эффекта на фазе обнаружения хостов. Там используются обычное ping сканирование (-sP). При сканировании с целью обнаружения хостов всегда используются большие группы для увеличения скорости и точности.

Основной целью использования этих опций является задание большого минимума размера группы, с тем чтобы сканирование проходило быстрее. При сканировании сети класса C обычным выбором является 256. При сканировании большого количества портов, превышение этого числа вряд ли поможет. При сканировании лишь нескольких портов, наилучшим размером группы будет 2048 или больше.

--min-parallelism <количество_запросов>; --max-parallelism <количество_запросов> (Регулирует распараллеливание запросов)

Эти опции регулируют общее количество запросов для группы хостов. Опции испльзуются при сканировании портов и при обнаружени хостов. По умолчанию Nmap высчитывает степень параллельности основываясь на производительности сети. Если пакеты отбрасываются, то Nmap использует меньшее количество запросов. Количество запросов медленно увеличивается по мере того, как сеть продолжает нормально работать. Эти опции устанавливают минимальную и максимальную границы для этой переменной. По умолчанию параллелизм устанавливается в 1, если сеть работает плохо, и может достигать нескольких сотен при идеальных условиях.

Наиболее частым вариантом применения является установка опции --min-parallelism в значение большее единицы, чтобы увеличить скорость сканирования плохо работающих хостов и сетей. Это очень рискованная опция, т.к. установка большого значения может повлиять на правильность результатов сканирования. Установка этого значения также сокращает возможности Nmap по динамическому контролю параллелизма в зависимости от условий в сети. Значение равное 10-ти является приемлимым, хотя я прибегаю к этой опции в последнюю очередь.

Опция --max-parallelism иногда устанавливается для предотвращения отправки хостам более одного запроса за раз. Это может быть полезно в комбинации с опцией --scan-delay (описывается далее), хотя она и сама справляется со своими обязанностями.

--min-rtt-timeout <время>, --max-rtt-timeout <время>, --initial-rtt-timeout <время> (Регулирует время ожидания ответа на запрос)

В Nmap есть значение промежутка времени, в течении которого будет ожидаться ответ на запрос, перед тем как прекратить попытки или совершить еще одну. Этот промежуток вычисляется на основе времени, в течении которого были получены ответы на предыдущие запросы. Если в сети есть значительная и непостоянная задержка, то этот промежуток может возрасти до нескольких секунда. Он также устанавливается на безопасном (высоком) уровне и может таким и оставаться некоторое время, если Nmap производит сканирование не отвечающих на запросы хостов .

Задание значений --max-rtt-timeout и --initial-rtt-timeout ниже значений по умолчанию может существенно сократить время сканирования. Это особенно заметно при различных вариантах сканирования с заданной опцией -PN, а также при сканировании сильно фильтруемых сетей. Однако не торопитесь делать этого сразу. Сканирование займет много времени, если вы укажете такое низкое значение, при котором у большинства запросов закончиться время ожидания ответа, и они будут ретранслированы, в то время как ответы на них будут в пути.

Если хосты находятся в локальной сети, то 100 миллисекунда будет приемлимым значением опции --max-rtt-timeout. Если при этом производится отслеживание маршурта, то для начала пропингуйте хост в сети с помощью утилиты ICMP ping или hping2, у которой больше шансов обойти брандмауэр. Выясните среднее максимальное значение для, примерно, 10-ти пакетов. Удвойте это значение для передачи опции --initial-rtt-timeout и умножьте на три или четыре для опции --max-rtt-timeout. Обычно я не устанавливаю maximum RTT ниже 100 мс, не зависимо от результатов пингования. А также не превышаю 1000 мс.

Опция --min-rtt-timeout редко используется; она может быть полезна, в случае если сеть настолько ненадежна, что даже значения Nmap по умолчанию слишком агрессивны. Так как Nmap просто сокращает время ожидания до минимума, в случае если сеть кажется надежной, то нужды в этой опции нет, о ней дожно быть сообщено как о баге на nmap-dev рассылку.

--max-retries <количество_попыток> (Задает максимальное количество повторных передач запроса)

Когда Nmap не получает ответа на запрос сканирования порта, это может означать, что порт фильтруется. А возможно, запрос или ответ просто затерялись в сети. Также возможно, что у цели есть ограничение на количество ответов, что стало причиной временной блокировки запроса. В этом случае Nmap повторную передачу исходного запроса. Если для Nmap сеть кажется ненадежной, то она может совершить очень много попыток, перед тем как бросить это дело. Хотя это и придает достоверность результатам сканирования, это в то же время увеличивает время сканирования. Когда производительность критична, время сканирования может быть сокращено путем введения ограничения на максимальное количество повторных передач запроса. Вы даже можете задать --max-retries 0, чтобы предотвратить все повторные попытки, хотя это не рекомендуется.

Значением по умолчанию (без -T шаблона) является 10 ретрансляций. Если сеть кажется надежной, и целевые хосты не имеют ограничений на количество ответов, то Nmap обычно делают одну повторную попытку. Поэтому установка --max-retries в низкое значение (например, 3) никак не вличет на большинство типов сканирования. Такие значения могут значительно увеличить скорость сканирования медленных (с ограничениями на количество ответов) хостов. Обычно вы теряете некоторую информацию, когда Nmap рано прекращает сканировать порты, поэтому лучше дать истечь времени --host-timeout, и потерять всю информацию о цели.

--host-timeout <время> (Прекращает сканирование медленных целей)

Некоторые хосты просто требуют длительного времени сканирования. Это может быть в силу низкой производительности или ненадежности сетевого оборудования или программного обеспечения, ограничений на количество пакетов или ограничивающих брандмауэров. Несколько процентов наиболее медленных хостов могут занять большую часть времени сканирования. Иногда лучшим выходом является просто пропуск таких хостов. Передайте в качестве аргумента опции --host-timeout максимальное значение промежутка времени, в течении которого вы готовы ждать. Я часто задаю 30 мин, чтобы удостовериться в том, что Nmap не потратит более получаса на единичный хост. Имейте ввиду, что в течении этого получаса Nmap может сканировать другие хосты, так что это не просто потеря времени. Хост, чье время истекло, пропускается. Для этого хоста не выводится ни таблица портов, ни информации об ОС.

--scan-delay <время>; --max-scan-delay <время> (Регулирует задержку между запросами)

Эта опция вынуждает Nmap подождать по крайней мере заданное время между каждым запросом. Это особенно полезно в случае наличия ограничения на количество ответов у целевых хостов. Машины Solaris (как и многие другие) обычно отвечают на запросы при UDP сканировании только одним ICMP сообщением в секунду. Посылка большего количества запросов со стороны Nmap будет впустую. Установка значения опции --scan-delay в 1 сек будет поддерживать в Nmap такую медленную интенсивность. Nmap пытается определить ограничения на количество ответов у целевых хостов и подстроить задержку между запросами соответственно, но ничто не мешает указать вам это значение явно, если вы точно знаете, что так будет лучше.

Когда Nmap подстраивает задержку между запросами к обнаруженному ограничению, то скорость сканироания значительно уменьшается. Опция --max-scan-delay позволяет задать наибольшую возможную задержку. Установка здесь маленького значения может привести к бесполезной ретрансляции пакетов или возможному пропуску портов, если у цели есть строгий лимит на количество ответов.

Еще одним вариантом использования опции --scan-delay является обход пороговых систем обнаружения и предотвращения вторжений (IDS/IPS).

--min-rate <число> (Задает минимальную интенсивность сканирования)

Функции динамического управления различными опциями времени в Nmap хорошо справляются с задачей подборки подходящей скорости сканирования. Тем не менее, иногда вы можете заранее узнать подходящую интенсивность сканирования сети, или можете гарантировать, что сканирование закончится к определенному времени. Когда задается опция --min-rate, Nmap будет пытаться отсылать пакеты с той же или большей, чем задано, интенсивностью. Аргументом этой опции является положительное число, отражающее интенсивность сканирования в пакетах в секунду. Например, задание опции --min-rate 300 означает, что Nmap будет пыпыться отсылать пакеты с интенсивностью 300 пакетов в секунду или больше. Задание низкого значения не отнимает у Nmap права работать с большей интенсивностью, если позволяют условия.

Существуют два варианта, при которых реальная интенсивность работы будет меньше заданного минимума. Первый, когда заданный минимум быстрее, чем наиболее быстрый возможный уровень работы Nmap, который зависит от аппаратного обеспечения. В этом случае Nmap будет посылать пакеты так быстро, как может; но будьте осторожны, т.к. при быстрой скорости возможны потери точности. Второй случай, когда у Nmap больше нечего отсылать, например, в конце сканирования, когда последние запросы уже посланы, и Nmap ожидает ответы на них. Это нормально, когда интенсивность падает в конце сканирования или при смене групп сканирования.

Задание минимального уровня интенсивности должно производится с осторожностью. Сканирование быстрее, чем возможно в данной сети, может привести к потери точности. В некоторых случаях, задание выского уровня интенсивности может привести к тому, что сканирование займет больше времени, чем с более низким уровнем. Это может произойти в случае, если адаптивные ретрансляционные алгоритмы Nmap обнаружат перегрузку сети, вызванную высоким уровнем интенсивности сканирования, и увеличат количество ретрансляций для повышения точности сканирования. Поэтому, даже хотя пакеты отсылаются с большой интенсивностью, еще больше пакетов отсылается впустую. Установите максимальное количество ретрансляций с помощью опции --max-retries, если вы хотите ограничить общее время сканирования.

Опция --min-rate глобальна, она оказывает влияние на все сканирование, а не на отдельные хосты. Учитывается только при сканировании с целью обнаружения хостов и сканировании портов. Другие функции, как например определение ОС, имеют собственные особенности управления временем.

--max-rate <число> (Задает максимальную интенсивность сканирования)

Дополнительно к опции --min-rate есть опция --max-rate, которая ограничивает максимальную интенсивность сканирования заданным значением. Используйте --max-rate 100, например, чтобы ограничиться 100 пакетами в секунду в быстрой сети. Используйте --max-rate 0.1 для медленного сканирования - один пакет в десять секунд.

--max-rate также как и --min-rate глобальная опция, оказывающая влияние на все сканирование. Учитывается только при сканировании с целью обнаружения хостов и сканировании портов.

Иногда уровень интенсивности может превышать максимальное заданное значение для больры с непредвиденными задержками, но в среднем он будет находится на максимальном уровне или ниже. Nmap будет работать с меньшей интенсивностью, если того требуют условия. Чтобы удерживать интенсивность сканирования внутри определенного промежутка, используйте опции --min-rate и --max-rate вместе.

--defeat-rst-ratelimit

Многие хосты имеют давно использующие ограничения на количество ICMP сообщений об ошибке (как ошибки о недостижимости порта). Многие системы сейчас используют похожие ограничения на количество пакетов RST (сброс), генерируемых ими. Это может сильно замедлить сканирование, т.к. Nmap подстраивается под эти ограничения. Вы можете указать Nmap игнорировать такие ограничения (для сканирования портов типа SYN, при котором не отвечающие порты не считаются открытыми) путем задания опции --defeat-rst-ratelimit.

Использование этой опции может привести к потери точности сканирования, т.к. Nmap могла не подождать неоходимое время ответа RST (на которые у целевой машины есть ограничения). При сканировании типа SYN не отвечающие порты помечаются как фильтруемые, а не закрытые, как в случае принятия ответа RST. Это опция полезна, только когда вам важны открытые порты, а различать закрытые и фильтруемые порты нет необходимости.

-T paranoid(паранойдный)|sneaky(хитрый)|polite(вежливый)|normal(обычный)|aggressive(агрессивный)|insane(безумный) (Устанавливает шаблон настроек управления временем)

Хотя описанные выше опции управления временем мощны и эффективны, многих людей они сбивают с толку. Более того, выбор подходящих значений может иногда занимать больше времени, чем само сканирование. Поэтому Nmap предлагает более легкий подход, заключайющийся в применении шести шаблонов настроек. Вы можете задавать их с помощью опции -T и номера шаблона (0–5) или его имени. Имена шаблонов следующие: paranoid(паранойдный) (0), sneaky(хитрый) (1), polite(вежливый) (2), normal(обычный) (3), aggressive(агрессивный) (4) и insane(безумный) (5). Первые два предназначены для обхода IDS. Вежливый (polite) режим снижает интенсивность сканирования с целью меньшего потребления пропускной способности и машинных ресурсов. Обычнй (normal) режим устанавливается по умолчанию, поэтому опция -T3 ничего не делает. Агрессивный (aggressive) режим повышает интенсивность сканирования, предполагая, что вы используете довольно быструю и надежную сеть. Наконец, безумный (insane) режим предполагает, что вы используете чрезвычайно быструю сеть и готовы пожертвовать точностью ради скорости.

Эти опции позволяет определять пользователям, насколько агрессивными они хотят быть, оставляя за Nmap право выбирать подходящие значения опций управления временем. Также шаблоны позволяют производить некоторые незначительные корректировки скорости, для которых пока нет отдельных опций. Например, -T4 запрещает установку динамической задержки во время сканирования выше 10 мс для TCP порт, а -T5 - выше 5 мс. Шаблоны могут использоваться в комбинации с описанными выше опциями; в этом случает будут использоваться в качестве значений аргументы этих опций, а не значения по умолчанию, заданные в шаблонах. Я рекомендую задавать -T4 при сканировании довольно современных и надежных сетей. Задавайте эту опцию, даже если вы используете описанные выше опции управления временем, и вы сможете получить выгоду от этих незначительных оптимизаций, которые включаются этой опцией.

Если у вас приличная широкополосная связь или ethernet соединение, то я бы порекомендовал вам всегда использовать -T4. Некоторым людям нравится -T5, хотя она чересчур агрессивна на мой взгляд. Иногда люди используют -T2, потому что думают, что так у них мешьнше шансов пропустить какие-либо хосты или потому, что считают себя вежливыми по жизни. Они часто не осознают, насколько опция -T polite медленна. Время их сканирования может занять в десять раз больше обычного. Проблемы с хостами и пропускной способностью редки при использовании опции (-T3), поэтому я рекомендую ее для осторожного сканирования. Отключение функции определения версии намного более эффективно для сокращения таких проблем, чем попытка настройки всех опций управления временем.

Хотя опции -T0 и -T1 могут быть полезны для обхода IDS, они отнимут очень много времени при сканировании тысяч хостов или портов. Для такого сканирования, предпочтительнее будет задать свои точные значения, чем полагаться на опции -T0 и -T1.

При использовании опции T0 в любой момент времени производится сканирование только одного порта, и перед отправкой каждого запроса проходит пять минут. T1 и T2 практически одинаковы, только между запросами проходит 15 секунд и 0.4 секунды соответственно. Опция T3 является опцией Nmap по умолчанию, она включает распараллеливание. -T4 эквивалента опциям --max-rtt-timeout 1250 --initial-rtt-timeout 500 --max-retries 6 и устанавливает максимальную задержку при TCP сканировании 10 миллисекунд. T5 эквивалента опциям --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --max-retries 2 --host-timeout 15m и устанавливает максимальную задержку при TCP сканировании 5 миллисекунд.