Fortigate: diagnose debug vs sniffer

Los firewall FortiGate cuentan con una serie de herramientas de diagnostico a través de su línea de comandos (CLI) que superan con creces las funcionalidades que ofrece la interfaz web, eso sí, hay que tener algo de práctica y conocimiento de las mismas para poder movernos con soltura.

Este artículo es más bien una chuleta personal para recordar que hay métodos mejores para hacer troubleshooting de tráfico de red que el propio sniffer integrado diagnose sniffer: activar el debug global a nivel de Fortigate
diagnose debug
y especificar determinados filtros (para evitar inundar la sesión con información no relevante). Como decía antes, esto es una chuleta personal, os recomiendo echar un vistazo al Fortigate cookbook para profundizar más en la CLI del FW.

Un ejemplo típico de sniffer podría ser el siguiente, en el que analizamos el tráfico de la VPN FOO cuyo origen viene de la IP 10.14.11.254:

diag sniffer packet FOO 'src host 10.14.11.254 or dst host 10.14.11.254'

También podemos especificar origen y destino, múltiples origenes, etc, los filtros típicos, vaya:

diag sniffer packet FOO 'src host 10.14.11.254 or dst host 10.14.11.222'

Pero de este modo perdemos información valiosa que Fortigate puede mostrar, el propio debug global del Firewall mostrará con detalle tanto el flujo de tráfico de red como las rutas que está utilizando, mostrando específicamente si es una ruta estática definida en el firewall, así como el identificador de la phase 2 y más información muy relevante para técnicas de diagnóstico. La sintaxis completa es, por ejemplo, la siguiente. Primero se especifica el filtro y opciones para finalmente activar el debug:

diagnose debug flow filter addr 10.14.11.254
diagnose debug flow show console enable
diagnose debug flow show function-name enable
diagnose debug console timestamp enable
diagnose debug flow trace start 999
diagnose debug enable

La información saldrá por STDOUT en la propia consola de Fortigate a partir de ese momento, no es necesario acceder a ningún log. Una vez que hemos terminado, simplemente hay que desactivar el debug:

diagnose debug disable

Ejemplo de traza de debug:

id=1005 trace_id=1 msg="vd-root received a packet (proto=1, 10.14.11.254:1->10.71.55.10:8) from internal."
id=1005 trace_id=1 msg="allocate a new session-00005ax5"
id=1005 trace_id=1 msg="find a route: gw-10.14.11.1 via wan2"
id=1005 trace_id=1 msg="Allowed by Policy-2: encrypt"
id=1005 trace_id=1 msg="enter IPsec tunnel-RemotePhase1"
id=1005 trace_id=1 msg="encrypted, and send to 10.14.11.251 with source 10.14.11.254"
id=1005 trace_id=1 msg="send to 192.168.56.230 via wan2"
id=1005 trace_id=2 msg="vd-root received a packet (proto=1, 10.14.11.254:1-10.71.55.10:8) from internal."
id=1005 trace_id=2 msg="Find an existing session, id-00005ax5, original direction"
id=1005 trace_id=2 msg="enter IPsec ="encrypted, and send to 192.168.225.22 with source 192.168.56.226" tunnel-RemotePhase1"
id=1005 trace_id=2 msgid=20085 trace_id=2 msg="send to 10.14.11.2540 via wan2"