Lo strato applicativo di Internet

OpenSER e Twinkle

Svolgiamo alcuni esperimenti relativi al VoIP SIP. Per concentrarci sulla segnalazione SIP e RTP, scegliamo di non utilizzare componenti di autenticazione, né di sfruttare il supporto offerto dal DNS.

Scelta dello UA

Presso il Wiki del progetto Sapientel, è stata stilata una tabella di comparazione dei softphone SIP disponibili in forma libera, e tra quelli, scegliamo di usare Twinkle, che scarichiamo mediante Synaptics. La scelta di Twinke è dettata dalla sua implementazione diretta degli standard, senza mascherarli troppo dietro interfacce utente oltremodo semplificate. Inoltre, sembra offrire caratteristiche interessanti, come la conferenza a tre, svariate funzioni di controllo chiamata, confidenzialità del media, e possibilità di eseguire degli script in corrispondenza alla ricezione della chiamata.

Chiamata diretta

Per provare subito se funziona, sperimentiamo una chiamata diretta, che non faccia uso di Proxy intermedi. Per questo, creiamo (ad esempio, con il wizard) un profilo di utente che potremmo chiamare diretto in cui scegliamo come SIP service provider none, indichiamo un Address of Record con nome labint, e con dominio quello del nostro computer (mionome.labint). Se invece stiamo usando un profilo per il quale abbiamo scelto un SIP service provider, dovremo modicarlo (menù File/change user/nomeprofilo/Edit/Sip Server), disabilitando l'interruttore Register at startup.

Ora, possiamo provare a chiamare i nostri colleghi, con AoR labint@suonome.labint. Se catturiamo il traffico, possiamo verificare come viene comunque fatto il tentativo di interrogare il DNS, ma non trovando nessun RR di tipo SRV, lo UA Twinkle rinuncia al tentativo di usare il Registrar del dominio di destinazione, e procede ad inviare allo stesso la chiamata in modo diretto. Per abbattere la chiamata, usiamo il tasto .

Risoluzione problemi

Non funziona? ...niente di più normale... ad esempio, verifichiamo che il dominio di secondo livello (mionome.labint, suonome.labint) possa essere risolto con un indirizzo IP. Cioè, che il file di zona ospitato presso il DNS autorevole per questi domini, contenga la linea @   A   192.168.1.NN.

Servizi addizionali

Sperimentiamo alcune funzioni di Twinkle, contraddistinte dalle icone riportate di seguito, e cioè

Appresso sono forniti i file di capture per il caso in cui alice@dock chiama bruno@dock, e ottenuti presso lo UA di alice. Nella sezione dei Riferimenti, troviamo una nutrita casistica di servizi aggiuntivi realizzabili con SIP.

Messa in attesa

In questo caso (hold), viene eseguito un re-INVITE da parte di alice, nel cui nuovo SDP la sessione viene dichiarata sendonly, e che quando accettato da bruno, produce un SDP di risposta che dichiara (dal suo punto di vista) la sessione receiveonly. Lo sviluppo attuale di Twinkle non sembra (ancora) prevedere l'invio di una musica di attesa, però ci starebbe bene...

Chiamata su altra linea

Mentre alice e bruno sono in conversazione, alice decide di chiamare una amica, e clicca sulla seconda linea. Il capture svela che anche in questo caso, bruno è stato messo on hold con la stessa tecnica di prima.

Conferenza a tre

L'amica chiamata da alice, in realtà è l'annuncio preregistrato ascoltabile presso sip:test@ing.uniroma1.it... beh poco male, proviamo a creare una conferenza a tre tra alice, bruno, e l'annuncio. La tecnica svelata dal capture è sempre la stessa: bruno viene messo on hold, parte l'INVITE verso test, e poi, quando si attiva la conferenza a tre... bruno è re-invitato per la terza volta, e viene riaperto il flusso RTP verso di lui, che ora è mixato (dallo UA di Alice) assieme a quello di test.

Trasferimento di chiamata

In questo caso alice, dopo aver chiamato bruno, decide di trasferire la chiamata verso sip:test@ing.uniroma1.it. In questo caso il capture svela deiparticolari interessanti: dopo aver messo, come al solito, bruno on hold, alice clicca sul trasferimento di chiamata, e sceglie di voler effettuare un blind transfer, indicando la nuova URI di destinazione: il risultato è che bruno riceve un REFER, che nella intestazione refer-to, indica la nuova URI. Lo UA di bruno risponde al REFER con un 202 Accepted, e dopo un pò, bruno (l'umano) risponde affermativamente alla finestra di notifica che gli propone il trasferimento, causando l'emissione di un INVITE verso la nuova URI. Per alice, l'invio del REFER sottindente la sottoscrizione alle notifiche relative allo stato della nuova chiamata, ed infatti bruno inizia a tenere informata alice della evoluzione della nuova chiamata, per mezzo di messaggi NOTIFY, nel cui body sono contenute le risposte che bruno riceve per la nuova chiamata. Finché bruno non termina il dialogo con alice, con un BYE.

Invio di DTMF

Nel caso ci si trovi a dover interagire con un IVR, può capitare di dover immettere dei toni da tastiera. In questo caso, il capture ci mostra come questocorrisponda ad inviare, nei pacchetti RTP, un diverso payload type, che contiene la rappresentazione letterale del tasto premuto.

Wireshark ed il VoIP

Prendiamo l'esempio fornito per la conferenza a tre, per illustrare le funzioni che Wireshark (il mio è alla versione 1.2.2) offre in supporto all'analisi del traffico VoIP:

Registrazione su di un hub

Ora, possiamo creare un nuovo profilo utente, che potremmo chiamare hub, che usa come nome, il vostronome, e come dominio, sip.labint; Tenendo aperto wireshark, proviamo a

  1. registrarci/deregistrarci mediante la quarta voce del menù in alto
  2. interrogare le nostre registrazioni mediante l'icona-stellina all'estrema destra del nome del profilo

Possiamo verificare come, anche senza aver specificato un Registrar, viene per default utilizzato quello corrispondente al proprio dominio. Nel primo caso, l'intestazione Contact contiene un parametro, expires, pari rispettivamente a 3600, ed a zero. Nel secondo caso, invece, la richiesta non contiene nessuna intestazione Contact, e viene quindi usata per recuperare dal Registrar le registrazioni attive.

Proviamo ora, sempre con wireshark attivo, a chiamare un nostro collega, alla URI sip:suonome@sip.labint. In base alle intestazioni Server e UserAgent, determiniamo quali risposte ci vengono inviate dal Registrar, e quali dallo UA chiamato.

Configuriamo un Outbound Proxy

Il proxy SIP che possiamo scaricare con Synaptic, è OpenSER. Dopo averlo fatto, dobbiamo abilitarne il funzionamento, per cui editiamo un primo file di configurazione (sudo gedit /etc/default/openser), e modifichiamo una delle prime linee come

RUN_OPENSER=yes

e quindi possiamo lanciare OpenSER, con il consueto sudo service openser start, e controllare l'esito con il comando sudo service openser status. Nel caso non sia in esecuzione, proviamo a determinare perché.

Risoluzione problemi

Come sempre, è più probabile che ci sia qualcosa che non va piuttosto che vada, e di seguito sono riportate alcune dritte relative a problemi effettivamente incontrati.

Attivazione dei messaggi di log

Per avere un feedback di ciò che succede, possiamo modificare l'inizio di /etc/openser/openser.cfg, impostando

/* uncomment the following lines to enable debugging */
debug=6                  /* qui è meglio limitarsi a 3 */
fork=no
log_stderror=yes

e quindi ri-lanciare Openser con il comando sudo service openser debug che ci mostra a schermo tutta una serie di messaggi, ed in particolare alle linee contrassegnate con ERROR: ci indica cos'è che non va.

Moduli inattivi

Ad esempio (almeno nella versione 1.3.2-2_i386.deb), possiamo trovare il messaggio ERROR:acc:init_acc_rad: failed to open radius config file: /usr/local/etc/radiusclient-ng/radiusclient.conf che si riferisce ad un componente di cui non abbiamo bisogno. In tal caso, è sufficiente inserire in /etc/openser/openser.cfg, subito dopo il commento # ----- acc params -----, la direttiva

modparam("acc", "radius_config", "")

e quindi eseguire di nuovo sudo service openser debug per vedere se ora va.

Identità corretta

Oppure, dopo aver impartito sudo service openser debug lo schermo potrebbe rimanere muto: in tal caso, la causa più probabile è una impossibilità di effettuare la risoluzione DNS inversa degli indirizzi IP su cui OpenSer tenta di mettersi in ascolto, da verificare (ad es) sniffando il traffico che si sviluppa verso il DNS. In tal caso, la soluzione è quella di indicare in modo esplicito un solo indirizzo, inserendo in /etc/openser/openser.cfg la direttiva

listen=udp:192.168.1.NN:5060

in cui l'indirizzo IP utilizzato è lo stesso a cui corrisponde la risoluzione diretta per nostronome.labint. Inoltre, se usato come Registrar, e se allo stesso computer è stato assegnato più di un nome a dominio, OpenSer potrebbe confondersi e non riconoscere il dominio da servire come proprio, tentare di inoltrare il REGISTER altrove, e dato che il DNS insiste nel dirgli che il dominio dell'AoR corrisponde a lui stesso, desistere inviando una risposta 483 Too Many Hops. In tal caso, occorre dichiarare in modo esplicito in /etc/openser/openser.cfg la direttiva

alias=proprionome.labint

che lo istruisce a elaborare personalmente i messaggi diretti al suo dominio. Anche stavolta, eseguiamo sudo service openser debug per vedere se ora va.

Quanti siamo sul socket?

Infine, potremmo osservare il messaggio del tipo ERROR: udp_init: bind(5, 0x813a7fc, 16) on 127.0.0.1: Address already in use ? Ha ragione lui: la porta 5060 è già occupata da Twinkle, ed OpenSER non può aprire il suo socket. Per rimediare, riconfiguriamo Twinkle: con la voce di menù Edit/System settings/Network, scegliamo una diversa porta per il SIP, e quindi chiudiamo e riapriamo Twinkle. Per l'ultima volta (si spera) eseguiamo sudo service openser debug per vedere se ora va.

Quando tutto è a posto, possiamo tornare a commentare le tre linee con cui abbiamo attivato la modalità di debug, e lanciare di nuovo sudo /etc/init.d/openser start.

Uso dell'Outbound Proxy

Finalmente ci siamo. Creiamo un nuovo profilo su Twinkle, che potremo chiamare Proxy, che usa anch'esso come nome il proprionome, e come dominio, sip.labint; quindi

Trapezisti!

Ora, possiamo sperimentare l'evoluzione delle intestazioni di segnalazione, sniffando contemporaneamente sul proprio computer, e (tramite ssh) presso sip.labint. Sul proprio computer, ricordiamoci di sniffare sull'interfaccia any, dato che il traffico sviluppato tra lo UA Twinkle ed Openser viaggia sulla interfaccia lo:.

Come esempio di quel che avviene, ecco due capture, ottenuti rispettivamente pressol'outbound proxy co-locato con lo UA chiamante, e presso il Registrar, per unachiamata da sip:alef-laptop@alef.softel, verso sip:fabio@alef.softel.


Riferimenti

x
Logo

Lo Strato Applicativo
di Internet

Dal TCP al VoIP, dal DNS all'Email alla crittografia, tutto ciò che accade dietro le quinte di Internet, completo di cattura del traffico.
Scopri come effettuare il download, ricevere gli aggiornamenti, e contribuire!


Realizzato con Document made with Kompozer da Alessandro Falaschi -