Posts etiquetados ‘fortinet’

Si tenéis que hacer troubleshooting de un tráfico rechazado en un Fortigate, podéis sufrir una pequeña pesadilla para saber que está ocurriendo. Resulta que el logado de tráfico en este firewall es un tanto peculiar y puede dar más de un quebradero de cabeza. Funciona así:

Si la regla es de tráfico permitido, sólo quedarán registrado en los ficheros de logs aquellos paquetes permitidos en la regla y que atraviesen correctamente el firewall. Si el paquete es rechazado por cualquier motivo (porque no esté permitido en la regla o se rechace por otro motivo que no se encuentre entre las funcionalidades UTM con log propio) no queda registrado este Reject en ninguna parte y no podemos saber si la regla está mal, si el paquete original no está llegando o si el firewall se lo esta comiendo porque tiene hambre.

Para saber que porras pasa con nuestro paquete, Fortigate dispone de dos comandos que nos facilitarán la vida enormemente: Diagnose Sniffer Packet y Diagnose Debug Flow.

Diagnose Sniffer Packet

Es el equivalente al tcpdump en el universo Fortinet y nos permite visualizar los paquetes registrados a nivel de kernel por cualquiera de las interfaces del firewall o por todas a un tiempo. Se ejecuta desde el CLI con el siguiente formato:

diagnose sniffer packet {interface | all}  ‘net z.z.z.z/p and/or host x.x.x.x and/or port yyy’  [options]

Para realizar una búsqueda más precisa y no ver un montón de lineas a lo Matrix tenemos las opciones:

  • net/prefix : Muestra todo lo existente para una red
  • host : Muestra sólo lo relativo a un host.
  • port: Muestra sólo lo relativo a un puerto concreto
  • and/or: Permite combinar varios de los filtros anteriores.

Las opciones son:

  • 1: Imprime la cabecera de los paquetes
  • 2: Imprime la cabecera y la informacion de capa IP de los paquetes
  • 3: Imprime la cabecera y la informacion desde capa TCP/Ethernet de los paquetes (si está disponible)
  • 4: Imprime la cabecera de los paquetes con el nombre de la interfaz
  • 5: Imprime la cabecera y la informacion de capa IP de los paquetes con el nombre de la interfaz
  • 6: Imprime la cabecera y la informacion desde capa TCP/Ethernet de los paquetes (si está disponible)con el nombre de la interfaz

Ejemplos:

diagnose sniffer packet any ‘net 10.0.0.0/8 and host 172.16.16.14 and port 3389′

diagnose sniffer packet any ‘host 10.4.131.97 and host 172.16.16.14 and port 3389′ 4

Diagnose Debug Flow

Es una herramienta que nos permite ver el camino que sigue un paquete dentro de el Fortigate, las reglas que aplica al mismo, las rutas …

Se ejecuta a través de CLI y os adjunto algunos ejemplos que os permitirá su uso según queráis filtrar las reglas aplicadas a una IP.

# diagnose debug enable
# diagnose debug flow show console enable
show trace messages on console
# diagnose debug flow filter add 10.10.20.30
# diagnose debug flow trace start 100

El resultado es:

id=36871 trace_id=1132 msg=”vd-root received a packet(proto=17, 10.10.20.30:1029->192.168.110.11:161) from internal.”
id=36871 trace_id=1132 msg=”allocate a new session-00012042″
id=36871 trace_id=1132 msg=”find a route: gw-172.20.120.2 via wan1″
id=36871 trace_id=1132 msg=”find SNAT: IP-172.20.120.230, port-54409″
id=36871 trace_id=1132 msg=”Allowed by Policy-5: SNAT”
id=36871 trace_id=1132 msg=”SNAT 10.10.20.30->172.20.120.230:54409″

Creo que la salida es lo suficientemente intuitiva para que la comprendáis fácilmente.

EDIT: Para ver aún más detalle de lo que ocurre en el paquete:

#diag deb flow show function enable 
#diagnose debug flow show iprope enable 
#diagnose debug flow filter daddr 1.1.1.0 1.1.1.255 
#diag deb flow trace start 100 
#diag deb enable

El resultado:

id=20085 trace_id=16 func=print_pkt_detail line=4751 msg=”vd-root received a packet(proto=1, 2.2.2.1:1->1.1.1.4:2048) from port1. type=8, code=0, id=1, seq=1969.”
id=20085 trace_id=16 func=init_ip_session_common line=4902 msg=”allocate a new session-001088ad”
id=20085 trace_id=16 func=iprope_dnat_check line=4645 msg=”in-[port1], out-[]”
id=20085 trace_id=16 func=iprope_dnat_tree_check line=835 msg=”len=0″
id=20085 trace_id=16 func=iprope_dnat_check line=4658 msg=”result: skb_flags-00800000, vid-0, ret-no-match, act-accept, flag-00000000″
id=20085 trace_id=16 func=vf_ip4_route_input line=1587 msg=”Match policy routing: to 1.1.1.4 via ifindex-33″
id=20085 trace_id=16 func=vf_ip4_route_input line=1597 msg=”find a route: flags=00000000 gw-1.1.1.4 via VPNIfaz”
id=20085 trace_id=16 func=iprope_fwd_check line=701 msg=”in-[Interna], out-[VPNIfaz], skb_flags-00800000, vid-0″
id=20085 trace_id=16 func=__iprope_tree_check line=543 msg=”gnum-100004, use addr/intf hash, len=2″
id=20085 trace_id=16 func=__iprope_check_one_policy line=1697 msg=”checked gnum-100004 policy-593, ret-matched, act-accept”
id=20085 trace_id=16 func=__iprope_user_identity_check line=1523 msg=”ret-matched”
id=20085 trace_id=16 func=__iprope_check_one_policy line=1893 msg=”policy-593 is matched, act-accept”
id=20085 trace_id=16 func=iprope_fwd_auth_check line=753 msg=”after iprope_captive_check(): is_captive-0, ret-matched, act-accept, idx-593″
id=20085 trace_id=16 func=fw_forward_handler line=697 msg=”Allowed by Policy-593:”
id=20085 trace_id=16 func=ipsecdev_hard_start_xmit line=122 msg=”enter IPsec interface-VPNIfaz”
id=20085 trace_id=16 func=esp_output4 line=1149 msg=”IPsec encrypt/auth”
id=20085 trace_id=16 func=ipsec_output_finish line=519 msg=”send to 2.2.2.20 via intf-VPNIfaz”

 

Espero que os sirva!

Saludillos.

Anuncios