Temporização (Timing) e Desempenho

Uma das minhas mais altas prioridades no desenvolvimento do Nmap tem sido o desempenho. Um rastreio(scan) default (nmap <hostname>) de um anfitrião(host) em minha rede local leva apenas um quinto de segundo. Isso mal dá tempo de piscar o olho, mas esse tempo conforme está rastreando dezenas ou centenas de milhares de anfitriões(hosts). Além disso, certos tipos de rastreio(scan) como o rastreio(scan) UDP ou a detecção de versão, aumentam o tempo de rastreio(scan) substancialmente. Da mesma forma algumas configurações de firewall fazem o mesmo, particularmente quando limitam a taxa de resposta. Embora o Nmap se utilize de paralelismo e muitos outros algoritmos avançados para acelerar esses rastreios(scans) o usuário tem o controle final sobre como o Nmap executa. Usuários avançados elaboram comandos do Nmap cuidadosamente para obter apenas as informações que importam, sempre se preocupando com as restrições de tempo.

Técnicas para melhorar os tempos de rastreio(scan) incluem omitir testes não-críticos e atualizar até a versão mais recente do Nmap (melhorias de desempenho são feitas freqüentemente). Otimizar os parâmetros de tempo também podem fazer uma grande diferença. Essas opções estão listadas abaixo.

--min-hostgroup <tamanho>; --max-hostgroup <tamanho> (Ajuste dos tamanhos dos grupos de rastreio(scan) paralelos)

O Nmap tem a habilidade de fazer um rastreio(scan) de portas ou de versões em múltiplos anfitriões(hosts) em paralelo. O Nmap faz isso dividindo a faixa de endereços IP-alvo em grupos e então rastreando um grupo de cada vez. No geral grupos maiores são mais eficientes. A contrapartida é que os resultados dos anfitriões(hosts) não pode ser fornecido até que o grupo inteiro tenha terminado. Portanto se o Nmap começou com um tamanho de grupo igual a 50, o usuário não receberia nenhum relatório (exceto pelas atualizações mostradas no modo verbose) até que os primeiros 50 anfitriões(hosts) tivessem completado.

Por default, o Nmap assume um compromisso para resolver esse conflito. Ele começa com um tamanho de grupo pequeno, igual a cinco, para que os primeiros resultados venham rápido e então aumenta o tamanho até que chegue em 1024. O número default exacto depende das opções fornecidas. Por questões de eficiência o Nmap usa tamanhos de grupo maiores para o UDP ou para rastreios(scans) TCP com poucas portas.

Quando o tamanho de grupo máximo é especificado com --max-hostgroup, o Nmap nunca irá exceder esse tamanho. Especifique um tamanho mínimo com --min-hostgroup e o Nmap irá tentar manter o tamanho dos grupos acima desse nível. O Nmap pode ter que usar tamanhos menores do que especificou, se não houverem anfitriões(hosts)-alvo suficientes restando em uma dada interface para completar o mínimo especificado. Ambos podem ser configurados para manter o tamanho do grupo dentro de uma faixa específica, embora isso raramente seja desejado.

O uso primário destas opções é especificar um tamanho de grupo mínimo grande de forma que o rastreio(scan) completo seja executado mais rapidamente. Uma escolha comum é 256 para rastrear(scan) uma rede em blocos de tamanho Classe C. Para um rastreio(scan) com muitas portas exceder esse número não irá ajudar muito. Para rastreios(scans) com poucos números de portas um tamanho de grupo de anfitriões(hosts) de 2048 ou mais pode ser útil.

--min-parallelism <numprobes>; --max-parallelism <numprobes> (Ajuste da paralelização das sondagens)

Estas opções controlam o número total de sondagens que podem estar pendentes para um grupo de anfitriões(hosts). Elas são usadas para o rastreio(scan) de portas e para a descoberta de anfitriões(hosts). Por default o Nmap calcula um paralelismo ideal e constantemente actualizado baseado no desempenho da rede. Se os pacotes estiverem sendo descartados o Nmap reduz o ritmo e liberta menos sondagens pendentes. O número de sondagens ideal aumenta vagarosamente conforme a rede se mostre mais confiável. Estas opções estabelecem limites mínimo e máximo nessa variável. Por default o paralelismo ideal pode cair até 1 se a rede se mostrar não-confiável e subir até diversas centenas em condições perfeitas.

O uso mais comum é estabelecer --min-parallelism em um número maior que um para melhorar a velocidade dos rastreios(scans) de anfitriões(hosts) ou redes com desempenho ruim. Esta é uma opção arriscada para se ficar brincando pois configurar um valor alto demais pode afetar a precisão. Configurar isso também reduz a habilidade do Nmap de controlar o paralelismo dinamicamente baseado nas condições da rede. Um valor igual a dez pode ser razoável, embora eu só ajuste esse valor como última alternativa.

A opção --max-parallelism às vêzes é configurada para evitar que o Nmap envie aos anfitriões(hosts) mais do que uma sondagem de cada vez. Isso pode ser útil em conjunto com --scan-delay (discutido mais tarde), embora esta última normalmente sirva bem ao propósito por si só.

--min-rtt-timeout <milissegundos>, --max-rtt-timeout <milissegundos>, --initial-rtt-timeout <milissegundos> (Ajuste de tempo de expiração (timeouts) das sondagens)

O Nmap mantém um valor de tempo de expiração (timeout) de execução para determinar quanto tempo ele deve esperar por uma resposta de uma sondagem antes de desistir ou retransmitir essa sondagem. Isso é calculado com base nos tempos de resposta de sondagens anteriores. Se a lentidão da rede se mostra significativa e variável esse tempo de expiração pode subir para vários segundos. Ele também começa com um nível conservador (alto) e pode ficar desse jeito por um tempo enquanto o Nmap rastreia(scan) anfitriões(hosts) não-responsivos.

Estas opções recebem um valor em milissegundos. Especificar um --max-rtt-timeout e --initial-rtt-timeout mais baixos que o default pode reduzir o tempo de rastreio(scan) significativamente. Isso é particularmente verdade para rastreios(scans) sem ping (-P0) e para aqueles contra redes bastante filtradas. Mas não se torne muito agressivo. O rastreio(scan) pode acabar levando mais tempo se especificar um valor tão baixo que muitas sondagens irão expirar o tempo e serem retransmitidas enquanto a resposta ainda está em trânsito.

Se todos os anfitriões(hosts) estão em uma rede local, 100 milissegundos é um valor de --max-rtt-timeout razoavelmente agressivo. Se houver roteamento envolvido faça um ping de um anfitrião(host) da rede primeiro com o utilitário ICMP ping ou com um formatador de pacotes customizados como o hping2, que pode passar por um firewall mais facilmente. Descubra o tempo máximo de round trip em dez pacotes mais ou menos. Coloque o dobro desse valor em --initial-rtt-timeout e o triplo ou quádruplo para o --max-rtt-timeout. Normalmente eu não configuro o rtt máximo abaixo de 100ms, não importa quais os tempos de ping. Eu também não excedo o valor 1000ms.

--min-rtt-timeout é uma opção raramente utilizada que poderia ser útil quando uma rede é tão não-confiável que mesmo o default do Nmap é muito agressivo. Considerando que o Nmap apenas reduz o tempo de expiração para um valor mínimo quando a rede parece ser confiável, esta necessidade não é comum e deveria ser reportada à lista de discussão nmap-dev como um bug.

--host-timeout <milissegundos> (Desiste em anfitriões(hosts)-alvo lentos)

Alguns anfitriões(hosts) simplesmente levam tempo demais para serem rastreados. Isso pode ser causado por um hardware ou software de rede com fraco desempenho ou pouco confiável, limitação na taxa dos pacotes ou por um firewall restritivo. Os poucos anfitriões(hosts) mais lentos de todos os anfitriões(hosts) escaneados podem acabar sendo responsáveis pela maior parte do tempo total gasto com o rastreio(scan). Às vêzes é melhor cortar fora o prejuízo e saltar esses anfitriões(hosts) logo no início. Isso pode ser feito especificando --host-timeout com o número de milissegundos que tolera esperar. Eu normalmente especifico 1800000 para ter certeza de que o Nmap não irá gastar mais do que meia hora em um único anfitrião(host). Note que o Nmap pode estar escaneando outros anfitriões(hosts) ao mesmo tempo em que essa meia hora desse único anfitrião(host) está correndo, então não é uma perda de tempo total. Um anfitriões(hosts) que expira o tempo é saltado. Nenhum resultado de tabela de portas, detecção de SO ou detecção de versão é mostrado para esse anfitrião(host).

--scan-delay <milissegundos>; --max-scan-delay <milissegundos> (Ajusta o atraso entre sondagens)

Esta opção faz com que o Nmap aguarde um determinado número de milissegundos entre cada sondagem enviada a um dado anfitrião(host). Isto é particularmente útil no caso de limitação de taxas de transferência. Máquinas Solaris (entre muitas outras) irão normalmente responder a pacotes de sondagens de rastreios(scans) UDP com apenas uma mensagem ICMP por segundo. Qualquer número maior que isso, enviado pelo Nmap, será um desperdício. Um --scan-delay de 1000 irá manter uma taxa de transferência baixa. O Nmap tenta detectar a limitação de taxa e ajusta o atraso no rastreio(scan) de acordo, mas não dói especificar explicitamente se já sabe qual a taxa que funciona melhor.

Outro uso do --scan-delay é para evitar os sistemas de prevenção e deteção de intrusão (IDS/IPS) baseados em limites.

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (Estabelece um padrão de temporização)

Embora os controles de temporização de ajuste fino discutidos nas seções anteriores sejam poderosos e efectivos, algumas pessoas consideram-nos confusos. Escolher os valores apropriados pode às vêzes levar mais tempo do que o próprio rastreio(scan) que está tentando optimizar. Por isso o Nmap oferece uma aproximação mais simples com seis padrões de temporização. Você pode especificá-los com a opção -T e os números (0 - 5) ou os nomes. Os nomes de padrões são paranóico (paranoid, 0), furtivo (sneaky, 1), educado (polite, 2), normal (3), agressivo (agressive, 4) e insano (insane, 5). Os dois primeiros são para evitar um IDS. O modo educado (ou polido), diminui o ritmo de rastreio(scan) para usar menos banda e recursos da máquina alvo. O modo normal é o default e, portanto, -T3 não faz nada. O modo agressivo acelera os rastreios(scans) assumindo que está em uma rede razoavelmente rápida e confiável. Finalmente, o modo insano assume que está em uma rede extraordinariamente rápida ou está disposto a sacrificar alguma precisão pela velocidade.

Estes padrões permitem que o usuário especifique o quão agressivo desejam ser, ao mesmo tempo que deixam o Nmap escolher os valores de temporização exactos. Os padrões também fazem ajustes pequenos na velocidade onde ainda não existem opções para controle de ajuste fino. Por exemplo, -T4 proibe que o atraso dinâmico de rastreio(scan) exceda 10ms para portas TCP e -T5 corta esse valor para 5 milissegundos. Padrões podem ser utilizados em conjunto com controles de ajuste fino desde que o padrão seja especificado primeiramente. Do contrário os valores default para os padrões irão se sobrepor aos valores que especificar. Eu recomendo usar -T4 quando rastrear(scan) redes razoavelmente modernas e confiáveis. Mantenha essa opção (no começo da linha de comando) mesmo que adicione controles de ajuste fino, de forma que possa se beneficiar com as pequenas otimizações extras que ela habilita.

Se tiver uma conexão ethernet ou de banda-larga decente, eu recomendaria sempre utilizar -T4. Algumas pessoas adoram o -T5 embora seja agressivo demais para o meu gosto. As pessoas às vêzes especificam -T2 porque acham que diminui a probabilidade de travar os anfitriões(hosts) ou porque elas consideram-se educadas em geral. Normalmente elas não percebem o quão lento o -T Polite realmente é. Esses rastreios(scans) podem levar dez vêzes mais tempo que um rastreio(scan) default. Travamento de máquinas e problemas com a banda são raros com as opções de temporização default (-T3) e portanto, eu normalmente as recomendo para escaneadores precavidos. Omitir a detecção de versão é bem mais eficaz do que ficar brincando com os valores de temporização para reduzir esses problemas.

Embora o -T0 e o -T1 possam ser usados para evitar alertas no IDS, eles irão leva muito mais tempo para rastrear(scan) milhares de máquinas ou portas. Para um rastreio(scan) tão amplo prefira estabelecer os valores exatos de temporização que precisa ao invés de depender dos valores "engessados" de -T0 e -T1.

Os principais efeitos de T0 é serializar o rastreio(scan) de forma que apenas uma porta é rastreada de cada vez e então aguardar cinco minutos entre o envio de cada sondagem. T1 e T2 são similares mas aguardam apenas 15 segundos e 0,4 segundos, respectivamente, entre as sondagens. T3 é o comportamento default do Nmap, que inclui o paralelismo. T4 faz o mesmo que --max-rtt-timeout 1250 --initial-rtt-timeout 500 e estabelece o atraso máximo de rastreio(scan) TCP em 10 milissegundos. T5 faz o mesmo que --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000 e estabelece o atraso máximo de rastreio(scan) TCP em 5ms.