Quando um pacote não está chegando aonde deveria num FortiGate, o primeiro lugar para olhar é o sniffer embutido. Ele é um único comando de (command-line interface, a interface de linha de comando) com cinco argumentos posicionais e, depois que você aprende a ler essa linha, a saída fica fácil de entender. A seguir, o comando que a ferramenta associada a este artigo monta e decodifica.

A anatomia do comando

A forma completa tem cinco argumentos, sempre nesta ordem:

diagnose sniffer packet <interface> <'filtro'> <verbose> <count> <tsformat>

Só a interface é obrigatória de verdade; os outros argumentos têm valores padrão no equipamento. Na prática, você quase sempre informa também um filtro e uma verbosidade, porque uma captura sem filtro e com verbosidade baixa num equipamento com muito tráfego é difícil de ler. A forma abreviada diag sniff packet também é aceita e quer dizer a mesma coisa.

Interface. O nome de uma interface física ou lógica, como port1 ou wan1, ou a palavra-chave any, para capturar em todas as interfaces ao mesmo tempo. O any tem uma pegadinha: ele usa o modo de captura "cooked" do Linux (SLL), que não inclui o header (cabeçalho) real, e remove a tag de . Se você precisa do header Ethernet ou da tag de VLAN, capture na interface física específica, e não em any.

Filtro. Uma expressão Berkeley Packet Filter entre aspas simples, por exemplo 'host 10.1.1.1 and tcp port 443'. Dá para filtrar por host, src host, dst host, net, port e por protocolos como arp, ip, ip6, icmp, tcp, udp, gre e esp, combinando tudo com and, or e not. Um host ou um port sozinho (sem src ou dst) pega as duas direções, que normalmente é o que você quer quando está verificando se uma resposta voltou. Para não usar filtro nenhum, escreva literalmente a palavra none.

O que os seis níveis de verbosidade imprimem

A verbosidade é um número de 1 a 6 e controla duas coisas independentes: quanto de cada pacote é impresso e se o nome da interface aparece.

A profundidade vai aumentando assim: o nível 1 imprime só os headers do pacote; o nível 2 acrescenta o payload (a carga útil) da camada IP; o nível 3 acrescenta os dados do frame (quadro) Ethernet completo, quando eles estão disponíveis. Os níveis 4, 5 e 6 repetem essa mesma sequência (headers, depois payload IP, depois dados Ethernet), mas também imprimem o nome da interface por onde cada pacote passou. Esse detalhe do nome da interface é o motivo prático para preferir o 4 ao 1, e ele é essencial quando você captura em any, porque sem ele não dá para saber por qual interface o pacote passou.

Um jeito fácil de lembrar: de 1 a 3, mais bytes; de 4 a 6, os mesmos bytes mais os nomes das interfaces. Se você vai abrir a captura no Wireshark, use os níveis mais profundos (3 ou 6), porque só eles trazem o frame completo.

Contagem e timestamp

Contagem é o número de pacotes que o sniffer captura antes de parar sozinho. Zero, ou deixar o argumento de fora, significa capturar até você apertar Ctrl+C. Vale limitar a contagem quando você está trabalhando por , porque uma captura sem limite pode inundar a sua própria sessão com o próprio tráfego que a sua conexão SSH está gerando; excluir a port 22 no filtro ajuda pelo mesmo motivo.

Formato do timestamp (a marca de data e hora de cada pacote) é o último argumento: a imprime um timestamp absoluto em (yyyy-mm-dd hh:mm:ss.ms), l imprime um timestamp absoluto no horário local do FortiGate e, sem o argumento, o tempo impresso é relativo ao início da captura. A forma relativa basta para uma captura só; mas, se você roda capturas em paralelo em duas interfaces ou em duas sessões SSH e quer alinhar os pacotes, use a ou l para que os timestamps possam ser comparados.

Por que às vezes a captura não mostra nada

Duas situações costumam pegar as pessoas de surpresa, e vale verificar as duas antes de concluir que o pacote nunca chegou.

A primeira é a remoção da tag de VLAN, que já apareceu acima: em any e nas interfaces VLAN, a tag não aparece nos níveis de verbosidade mais altos. Se o que você está investigando é justamente um problema de VLAN, capture na interface física pai e filtre a tag pela posição dos bytes (offset), por exemplo 'ether[14:2]=0x00db' para a VLAN 219.

A segunda, e a surpresa mais comum, é o offload em hardware. Nos modelos de FortiGate com processadores de rede (NP) ou com system-on-chip, as sessões já estabelecidas são entregues ao (offload) e não passam mais pela CPU, então o sniffer do kernel simplesmente não as enxerga. Se uma sessão deveria estar passando tráfego e o sniffer está em silêncio, desabilite temporariamente o offload na política de firewall correspondente com set auto-asic-offload disable, reproduza o problema e reabilite o offload depois. Isso é um passo de diagnóstico, não uma configuração permanente.

Como transformar a captura num pcap

Ler hexadecimal no terminal tem limite. Capture na verbosidade 3 ou 6 (para que o frame Ethernet completo esteja presente), copie a saída e passe-a pelo script Perl fgt2eth.pl da Fortinet, que converte o texto do sniffer num arquivo .pcap que você abre no Wireshark. Daí em diante você tem a decodificação completa dos protocolos, o follow-stream e os filtros, coisas que um terminal não oferece.

De onde vem o conteúdo

Tudo aqui foi tirado do próprio material da Fortinet: a seção do FortiGate Administration Guide sobre como fazer um sniffer trace ou uma captura de pacotes, a entrada do CLI reference do FortiOS para diagnose sniffer packet e as orientações de troubleshooting da comunidade Fortinet sobre o sniffer embutido. A ferramenta associada monta e decodifica esses comandos offline; ela nunca roda um sniffer nem acessa um equipamento.