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
-kaccepte 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
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.