Analyser les appels SIP en ligne de commande avec sngrep

,

Un appel qui sonne dans le vide, un poste qui ne s’enregistre plus, un « 486 Busy Here » inexpliqué : pour comprendre ce qui se passe en SIP, il faut voir les messages échangés. Wireshark le fait très bien, mais demande une interface graphique et un transfert de fichier. sngrep affiche les dialogues SIP et leur diagramme de séquence directement dans le terminal, sur le serveur lui-même : IPBX, SBC ou passerelle.

Les commandes et les écrans ci-dessous ont été vérifiés sur Debian 13 (Trixie) avec sngrep 1.8.2.

Installation

apt install sngrep

La capture réseau demande les droits root : lancé par un utilisateur normal, sngrep s’arrête avec Couldn't activate capture: socket: Operation not permitted. Utilisez sudo pour la capture en direct. La lecture d’un fichier pcap, elle, ne demande aucun droit particulier.

Capture en direct

sudo sngrep

Par défaut, sngrep écoute sur toutes les interfaces (any) et affiche tous les paquets SIP qu’il reconnaît. Pour restreindre :

sudo sngrep -d eth0                      # une seule interface
sudo sngrep -d eth0 port 5060            # filtre BPF, même syntaxe que tcpdump
sudo sngrep -d eth0 host 192.168.1.1 and udp
sudo sngrep -c                           # uniquement les dialogues qui commencent par un INVITE

L’option -c est la plus utile sur un serveur chargé : elle masque les REGISTER, OPTIONS et autres messages qui noient les appels.

La liste des dialogues

L’écran principal liste un dialogue SIP par ligne : méthode, appelant, appelé, nombre de messages, source et destination.

                         sngrep - SIP messages flow viewer
  Current Mode: Offline          Dialogs: 2          Filename: test.pcap
  Match Expression:              BPF Filter:
  Display Filter:
      ^Idx Method     SIP From            SIP To                  Msgs  Source              Destination
  [ ] 1    INVITE     101@192.168.1.1     102@192.168.1.1         7     192.168.1.20:5060   192.168.1.1:5060
  [ ] 2    INVITE     101@192.168.1.1     0600000000@192.168.1.1  5     192.168.1.20:5060   192.168.1.1:5060

Esc Quit   Enter Show   Space Select   F1 Help   F2 Save   F3 Search   F4 Extended   F5 Clear   F7 Filter

Touches principales sur cet écran :

Entrée    afficher le diagramme du dialogue sélectionné
Espace    sélectionner plusieurs dialogues (Entrée les affiche ensemble)
F3 ou /   filtre d'affichage : ne garder que les lignes contenant un texte
F4 ou x   diagramme étendu (le dialogue et ceux qui lui sont liés)
F6 ou R   messages bruts du dialogue sélectionné
F7 ou F   filtres : SIP From, SIP To, source, destination, contenu, méthodes
F2 ou S   enregistrer la capture
F5        vider la liste (irréversible)
p         suspendre ou reprendre la capture
F1 ou h   aide
Échap, q  revenir à l'écran précédent ou quitter

Le filtre F7 permet notamment de décocher REGISTER, OPTIONS ou NOTIFY pour ne garder que les appels.

Le diagramme d’un appel

Entrée sur un dialogue affiche son diagramme de séquence, avec l’horodatage et le délai entre chaque message. Le message sélectionné est affiché en entier sur la droite.

                   Call flow for c1@192.168.1.20 (Color by Request/Response)
                                                        │INVITE sip:102@192.168.1.1 SIP/2.0
            192.168.1.20:5060      192.168.1.1:5060     │Via: SIP/2.0/UDP 192.168.1.20:5060;branch=...
          ──────────┬─────────  ──────────┬─────────    │From: <sip:101@192.168.1.1>;tag=ac1
  00:16:40.000000   │        INVITE       │             │To: <sip:102@192.168.1.1>
        +0.010000   │ ──────────────────> │             │Call-ID: c1@192.168.1.20
  00:16:40.010000   │      100 Trying     │             │CSeq: 1 INVITE
        +0.490000   │ <────────────────── │             │Content-Length: 0
  00:16:40.500000   │     180 Ringing     │
        +2.500000   │ <────────────────── │
  00:16:43.000000   │        200 OK       │
        +0.050000   │ <────────────────── │
  00:16:43.050000   │         ACK         │
       +16.950000   │ ──────────────────> │
  00:17:00.000000   │         BYE         │
        +0.020000   │ ──────────────────> │
  00:17:00.020000   │        200 OK       │
                    │ <────────────────── │

Touches sur cet écran :

↑ ↓       passer d'un message à l'autre
Entrée    afficher le message sélectionné en brut
Espace    sélectionner deux messages pour les comparer
F2 ou d   afficher le détail SDP (codecs, adresses et ports média)
F3 ou m   afficher ou masquer les flux RTP (avec la capture RTP activée)
s         diagramme compressé
c         changer le mode de couleur
Échap     revenir à la liste

Ce que l’on lit dans le diagramme :

  • Un INVITE répété sans réponse : les retransmissions indiquent que le message n’arrive pas ou que la réponse ne revient pas. On regarde alors le pare-feu ou le routage.
  • Un 200 OK répété après le décroché : l’ACK n’arrive pas au destinataire. Classique avec un NAT mal géré, l’appel est souvent coupé au bout d’une trentaine de secondes.
  • Une réponse 4xx, 5xx ou 6xx : le code donne la cause du refus (401/407 authentification, 404 numéro inconnu, 486 occupé, 488 codecs incompatibles, 503 service indisponible…).
  • Un appel établi sans son : comparez les adresses IP du SDP (touche F2) dans l’INVITE et dans le 200 OK. Une adresse privée qui part vers l’extérieur trahit un problème de NAT.

Expression de recherche : ne capturer que certains appels

Un texte donné en argument filtre les dialogues dès la capture : si la requête qui ouvre le dialogue contient ce texte, tout le dialogue est conservé, réponses comprises.

sudo sngrep -c 0600000000

Seuls les appels contenant ce numéro sont affichés. Attention, la recherche porte sur la requête initiale (l’INVITE) : sngrep 486 ne trouvera pas les appels rejetés en « 486 Busy Here », car ce code n’apparaît que dans la réponse. Pour cela, utilisez le filtre d’affichage F3 une fois la capture lancée.

Autres options :

-i        rendre la recherche insensible à la casse
-v        inverser la recherche (exclure les dialogues qui correspondent)

Enregistrer et relire une capture

Enregistrer tout ce qui est capturé dans un fichier pcap, tout en gardant l’interface :

sudo sngrep -d eth0 -O /tmp/sip-$(date +%F-%H%M).pcap port 5060

Capturer sans interface, par exemple pendant qu’on reproduit un problème depuis un poste :

sudo sngrep -N -c -O /tmp/appels.pcap

sngrep affiche seulement le nombre de dialogues capturés ; on arrête avec Ctrl+C. Avec une expression de recherche, seuls les dialogues correspondants sont écrits dans le fichier :

sudo sngrep -N -O /tmp/appel-client.pcap 0600000000

Relire ensuite le fichier, sur le serveur ou sur un autre poste, sans droits root :

sngrep -I /tmp/appels.pcap

Le fichier est au format pcap standard : il s’ouvre aussi dans Wireshark ou avec tcpdump -r. Les filtres BPF fonctionnent aussi en lecture : sngrep -I capture.pcap host 192.168.1.1.

Depuis l’interface, F2 ouvre la fenêtre d’enregistrement. On y choisit les dialogues à garder (tous, sélectionnés avec Espace, ou filtrés) et le format : pcap avec le SIP seul, pcap avec SIP et RTP, ou texte.

  ┌─ Dialogs ───────────────────┐ ┌─ Format ────────────────────┐
  │(*) all dialogs              │ │(*) .pcap (SIP)              │
  │( ) selected dialogs [0]     │ │(-) .pcap (SIP + RTP)        │
  │( ) filtered dialogs [2]     │ │( ) .txt                     │
  └─────────────────────────────┘ └─────────────────────────────┘

Le format « SIP + RTP » n’est disponible que si la capture a été lancée avec -r, qui conserve le contenu des paquets RTP en mémoire :

sudo sngrep -c -r -O /tmp/appel-avec-son.pcap

Le son peut ensuite être écouté dans Wireshark (menu Telephony > VoIP Calls). Attention à la mémoire : avec -r, chaque appel occupe nettement plus de place.

Longues captures

sngrep garde les dialogues en mémoire, avec une limite par défaut de 20 000 dialogues. Pour le laisser tourner longtemps sur un serveur chargé :

sudo sngrep -c -l 5000 -R

-l fixe la limite et -R supprime les dialogues les plus anciens quand elle est atteinte, au lieu d’arrêter la capture.

Configuration

Les réglages par défaut se placent dans /etc/sngreprc (pour tout le système) ou ~/.sngreprc (pour un utilisateur). Le fichier livré par Debian contient tous les réglages possibles, en commentaire. Exemple :

vi ~/.sngreprc
# Interface et filtre par défaut
set capture.device eth0
set filter.methods INVITE
# Dossier proposé à l'enregistrement (F2)
set sngrep.savepath /tmp/sngrep-captures
# Ne pas demander de confirmation en quittant
set cl.noexitprompt on

Pour afficher la configuration active : sngrep -D.

Pour aller plus loin

  • SIP sur TLS : l’option -k accepte la clé privée RSA du serveur pour déchiffrer les paquets capturés.
  • HEP/EEP : sngrep peut recevoir des paquets encapsulés envoyés par un IPBX ou un SBC (-L udp:0.0.0.0:9060) ou en envoyer vers un serveur Homer (-H udp:192.168.1.50:9060). Pratique pour observer un équipement sur lequel on ne peut pas installer sngrep.

En résumé

sudo sngrep -c                               # voir les appels en direct
sudo sngrep -c 0600000000                    # suivre un numéro
sudo sngrep -N -c -O /tmp/appels.pcap        # capturer sans interface
sngrep -I /tmp/appels.pcap                   # relire une capture

Sources

Commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.