SNGREP: Uso avanzado y nuevas funcionalidades

IMG_8258

Hace un tiempo introdujimos una herramienta desarrollada por nuestro compañero Iván Alonso (aka Kaian) que se ha convertido en una utilidad imprescindible en nuestro día a día. Se trata de sngrep, un visor de trazas SIP en ncurses que cubre a grandes rasgos las siguientes necesidades:

  • Analizar en tiempo real el tráfico SIP desde un nodo, sin más que disponer de una shell en dicho equipo.
  • Analizar el tráfico SIP partiendo de una captura en formato pcap capturada con tcpdump, ngrep o cualquier herramienta de captura de red similar.
  • Mostrar de una forma gráfica los nodos implicados, los mensajes intercambiados así como su contenido.

Con el paso del tiempo y dado al uso extensivo que le damos en nuestras guerras diarias, hemos implementado muchísimas funcionalidades que queremos presentaros 🙂

Vamos a ello, ¡que hay mucho que contar!

Instalar sngrep

Hay tanto que contar que no vamos a explicar todo el proceso instalación. El proceso es sencillo, basta con seguir estos pasos:

Arrancar sngrep

Una vez que hemos instalado sngrep, podemos pasar a utilizarlo.

El primer paso sería elegir entre los dos modos principales:

  • Modo online.
  • Modo offline.
Modo offline

Es posible que queramos analizar una captura que hemos obtenido por medio de cualquier herramienta de captura de las muchas disponibles (ngrep, tcpdump, wireshark, etc.).

Para ello, bastará con ejecutar:
sngrep -I myEpicCapture.pcap

En este modo también es posible utilizar bpf filters descritos más adelante.

Modo online

Una de las cosas más bonitas de sngrep es verla dibujar lo que está pasando… ¡en directo! Para ello, basta con ejecutar:
sngrep

Existen multitud de flags que modifican el comportamiento de sngrep (con sngrep -h obtendremos un listado completo), nos parece interesante destacar los siguientes:

    • -O output.pcap: Aparte de visualizar la captura en vivo, si queremos obtener una captura con todo lo que hemos visto, podemos utilizar este flag. Tal y como veremos más adelante, si se nos olvida este flag o queremos hilar más fino, luego os explicamos cómo 😉
    • -c: Muestra solo los diálogos que empiecen con el método INVITE (las llamadas).
    • bpf filters: Al igual que ngrep (proyecto en el que se basa sngrep), sngrep permite la introducción de filtros que limitan lo que se va a filtrar. De esta forma, podemos discriminar el tráfico que no nos interese y evitar que sngrep tenga que parsear todo el tráfico en busca de SIP. Un ejemplo típico sería:
      sngrep port 5060 and udp

Aquí podéis encontrar más información sobre este tipo de filtros.

Ventana de listado de diálogos

Una vez arrancado sngrep en cualquiera de sus dos modos, se nos presenta una pantalla con un listado como el siguiente:

call_list

Cada fila representa un diálogo SIP y las columnas muestran información de cabeceras (From, To), IP origen, IP destino y nombre del primer método. Toda la información de una determinada fila se recoge del primer mensaje del diálogo.

Las columnas que se muestran son configurables y se pueden poner en el orden que se prefiera. Para ello, hay 2 opciones:

  • Pulsando F10: Se muestra una ventana como la siguiente mostrando todos los campos que se puede añadir. También se permite modificar el orden de las columnas pulsando +/-. Los cambios realizados por medio de esta opción solo aplican a la sesión actual.

column_select

  • Modificando los archivos de configuración (/etc/sngreprc o ~/.sngreprc, que se cargan en este orden): Mediante estos archivos se puede modificar las columnas que se muestran, el orden y la anchura de las mismas (entre otras muchas opciones). De esta forma, puedes configurar sngrep para que muestre por defecto las columnas que más útiles te resulten en el orden que más cómodo te parezca. Luego, con la opción anterior, podrás cambiar en ejecución para los casos excepcionales 🙂

Entre las columnas que a nosotros nos resultan muy útiles se encuentran:

  • Date: Fecha del primer mensaje del diálogo.
  • Time: Hora del primer mensaje del diálogo.
  • Trans: Protocolo de transporte del diálogo.Tal y como veremos más adelante, los protocolos soportados son: UDP, TCP… y ¡TLS!
Filtrar listado de diálogos

Una vez que tenemos la pantalla principal a nuestro gusto, es muy probable que queramos filtrar la lista para buscar un diálogo (una llamada, un registro, etc.) concreto. Es más, puede que estemos haciendo una captura en vivo y no queramos que la lista crezca porque ya tenemos la llamada que queremos. Para ello, la tecla ‘p’ detiene y reanuda la captura.

¡Pero vamos con los filtros! Hay dos tipos de filtros:

  • Filtros tipo vim: Pulsando la tecla ‘/’ (la del 7 😉 ), se puede introducir una cadena. A medida que vayas metiendo caracteres el listado se reducirá y solo se mostrarán las filas que contengan dicha cadena. Estos filtros solo matchean la cadena que se muestra, es decir, si no estamos mostrando el Call-ID no podemos filtrar metiendo un Call-ID.

dfilter

  • Filtros por cabeceras y métodos: Pulsando la tecla ‘f’ nos aparece la siguiente ventana:Esta ventana nos permite buscar una cadena dentro del From y además otra en el To, etc. También nos permite filtrar por métodos: solo REGISTERs, solo INVITEs, etc. A diferencia del filtro anterior, no es necesario estar mostrando el From para filtrar en base a él.filter

Analizar uno o varios diálogos

¡Empieza lo bueno! Ya tenemos nuestra lista de diálogos filtrada, hemos encontrado la(s) llamada(s) en cuestión, por ejemplo, y queremos ver qué ha pasado. Para variar, volvemos a tener 2 opciones:

  • Seleccionar con la tecla espacio los diálogos que queremos ver (uno o varios) y pulsar INTRO.
  • Si solo queremos un dialogo, nos movemos con los cursores y pulsamos INTRO sobre él.

¿Y para qué íbamos a querer ver más de un diálogo a la vez? El caso típico nuestro, que trabajamos mucho con Asterisk, que es un B2BUA, es mostrar las famosas dos patas en un mismo dibujo.

 

¡Pero vamos al grano! Esta es la pantalla tipo cuando seleccionamos un diálogo. En este caso, una llamada entre dos terminales por medio de Asterisk (que es el nodo en el que arrancamos sngrep):

flujograma

¿Y qué opciones tenemos en este punto? Muchas más de dos 😀

  • ¿Que nos hemos olvidado de seleccionar 2 diálogos y solo vemos la primera pata? Pulsando la tecla ‘x’ sngrep buscará diálogos relacionados con las cabeceras X-CID o X-Call-ID y las añadirá al dibujo actual.
  • ¿Que hay tantas columnas que no vemos todo el dibujo? Con la tecla ‘t’ ocultamos y mostramos el panel que muestra el mensaje SIP seleccionado. Con las teclas ‘0’ y ‘9’ podemos adaptar la anchura de este panel (pulsando ‘T’ se vuelve a la anchura original).
  • Si hemos seleccionado varios diálogos, si un nodo aparece en varios diálogos, tendrá varias columnas. Para hacer un merge y que cada nodo aparezca una sola vez, podemos pulsar la tecla ‘s’.
  • Los colores del diagrama SIP también se pueden cambiar. Por defecto, las peticiones se muestran en rojo y las respuestas en verde. Pulsando la tecla ‘c’ se puede alternar entre los siguientes modos:
    • Coloreo por CSeq: puede resultar útil para analizar las transacciones por separado.
    • Coloreo por diálogo: puede resultar útil si estamos mostrando varios diálogos en un mismo diagrama.
    • Pulsando ‘Enter’ veremos el mensaje seleccionado, pulsando ‘r’ veremos todo el flow en modo texto, igual que ngrep.

 

Hay muchísimas funcionalidades más, pero tampoco es cuestión de aburrir 😀 La mejor forma de saber qué se puede hacer en cada pantalla es pulsando ‘h’.

Solo un par de funcionalidades más que usamos mucho y nos resultan útiles:

    • Modo SDP Only: Con las teclas ‘d’ y ‘D’ se puede mostrar solo los paquetes con SDP y los puertos de audio negociados. Útil para problemas en la negociación de audio.

sdp_only

  • Comparar 2 mensajes SIP: Si con la tecla espacio seleccionamos 2 mensajes, se muestra una ventana que los compara.comparison

Vamos a dejarlo aquí porque el post está quedando un poco largo… pero hay mucho más, ¡os invito a probarlo!

Salvar los diálogos que deseemos

Una vez que hemos detectado algo interesante, es muy probable que queramos reportarlo a algún lado o enviarlo de alguna forma. Para ello, sngrep permite exportar los diálogos deseados. Hay 2 formas:

  • En la ventana de listado de diálogos, seleccionamos con espacio los diálogos deseados. Si en este punto queremos guardar dichos diálogos a formato pcap, bastará con pulsar s.
  • save_to_pcapSi queremos guardarlo en modo texto, una vez seleccionados los diálogos, pulsamos ‘r’ para pasar al modo raw. Este modo permite ver los mensajes tal y como los muestra ngrep. En este punto, si pulsamos ‘s’ se nos muestra un diálogo para guardar la captura en txt.

Otras funcionalidades

Se nos han quedado muchas funcionalidades en el tintero, algunas de las cuales darán para otro(s) futuro(s) post(s). En concreto, prometemos un post sobre el uso de sngrep para visualizar llamadas que utilicen SIP sobre TLS 😉

Futuro de sngrep

Gracias a nuestro compañero Iván Alonso (aka Kaian), desarrollador de la herramienta, sngrep es un proyecto que está muy vivo 🙂

Hay muchas ideas en mente, como por ejemplo:

  • Filtros del contenido del mensaje SIP por medio de expresiones regulares (posix o pcre).
  • Redimensión dinámica del tamaño de la ventana.
  • Salvar el layout configurado por medio de F10 al archivo de configuración principal, para futuras sesiones.
  • Soporte del uso del ratón en la interfaz ncurses.

Estamos abiertos a nuevas ideas, podéis reportarlas si queréis creando una incidencia en github.

Eso es todo por hoy, esperamos que sngrep os resulte tan útil como a nosotros 🙂



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Carlos Cruz

Coordinador del departamento de VoIP en Irontec. Interesado en el Software Libre en sus diversas vertientes, desde hace unos años centro mi día a día en el mundo de la VoIP (Asterisk, Kamailio, SIP) y todo lo que la rodea: networking, HA, virtualización... Perl, systemd and Arch Linux advocate :)

1 Comentario

¿Por qué no comentas tú también?


  • Buenas tardes,

    Me gustaría saber si hay forma de instalar SNGREP en una RaspberryPI.

    He intentado añadir el repositorio de Wheezy, que creo que es el más parecido a Raspbian, al sources.list, la key, pero a la hora de hacer el “apt-get update”, al ser un dispositivo ARM, me da el siguiente error:

    ——————————————————————————————————————————————————–
    W: Imposible obtener http://packages.irontec.com/debian/dists/wheezy/Release Unable to find expected entry ‘main/binary-armhf/Packages’ in Release file (Wrong sources.list entry or malformed file)

    E: Some index files failed to download. They have been ignored, or old ones used instead.
    ——————————————————————————————————————————————————–

    ¿Se podría instalar de alguna forma?

    Saludos

    Juan García Hace 3 años Responde


  • […] pesar de tener increíbles herramientas, como Sngrep (de mano de nuestro compañero Iván Alonso), que nos ayudan a analizar llamadas en tiempo real, […]

    Monitorizando nuestro tráfico SIP con Homer 5 | Blog Irontec Hace 2 años Responde


  • Aporte:
    Si deseas correr sngrep como servicio por alguna razón puedes seguir:
    En mi caso fue para integración con HOMER.

    https://groups.google.com/d/msg/homer-discuss/NG5Zo4CUfFU/zWy7wf66DQAJ

    Martin Hace 1 año Responde


Queremos tu opinión :)