Un solo Account VoIP con più numeri geografici

Questo articolo si pone l'obbiettivo di chiarire le modalità tramite le quali Messagenet renda possibile la gestione del servizio di trunking, come descritto in oggetto, dal momento che questo tipo di servizio viene spesso richiesto da parte degli utenti.

black-yellow-black-warning-1.svg Attenzione! black-yellow-black-warning-1.svg

Quanto di seguito descritto non costituisce di base la configurazione standard per gli account Messagenet e come tale deve esserene esplicimante richiesta l'attivazione, verificando la necessità effettiva di procedere in questo modo.
Rivolgersi al supporto tramite mail a support@messagenet.it o tramite questo portale, indicando la modalità scelta per lo scopo compatibilmente alle caratteristiche del proprio apparato: Messagenet non offre supporto all'implementazione diretta di questa tipologia di servizio sugli apparati dei propri clienti, limitandosi a fornire indicazioni specifiche nei limiti del possibile;

Premessa

Generalmente, ad un Account VoIP (od URI) viene assegnato un Numero Geografico (sia questo del tipo FreeNumber o SmartNumber): questo però non è strettamente necessario ed ad un Account VoIP possono essere assegnati più numeri geografici, o può non esserne assegnato nessuno.

Questi numeri possono essere impiegati in due modi dall'Account VoIP:

  • come riferimento per essere raggiunti dalla rete telefonica;
  • come numeri chiamante (o CLI) in uscita verso la rete telefonica;

Ovviamente, un Account VoIP senza numerazioni geografiche, non potrà essere raggiunto dalla rete telefonica pubblica, ma solo chiamato direttamente da altri utenti Messagenet, così come in chiamata verso destinazioni della rete telefonica mostrerà sempre il numero chiamante "privato".

Fatte queste premesse, a prescindere, va detto che:

  • Messagenet non implemente direttamente il concetto di SIP Trunking e le chiamate vengono ricevute dal Client SIP deputato alla ricezione di chiamate solo previa Registrazione al Servizio: il client si presenterà periodicamente presso il nostro proxy registrar indicando il proprio indirizzo IP, la propria porta sorgente ed il proprio contatto di registrazione (SIP Contact Field): nel caso l'autenticazione sia avvenuta correttamente, le chiamate verranno inoltrate all'indirizzo di registrazione del client usando come Request URI proprio il contact field dichiarato dall'apparato;
  • il numero effettivamente chiamato, associato all'Account VoIP, può essere del tutto differente da questo contact field ed è quindi errato ritenere che la Request URI ricevuta sul proprio apparato equivalga direttamente a questo numero, od all'account VoIP; il numero effettivamente chiamato, sia questo il numero geografico dalla rete PSTN o direttamente l'Account VoIP chiamato da parte di un differente utente, sarà comunque sempre indicato nella User-Part dell'header "To:" della segnalazione SIP ricevuta;

Riconoscimento del numero geografico chiamato

Data la precedente premessa, si capisce che può essere di nostro interesse, nel caso si desideri avere più numerazioni geografiche attive sul medesimo Account VoIP, discernere effettivamente quale numero sia stato chiamato di volta in volta.

Il desiderio di avere una simile configurazione dipende dalla volontà, ad esempio, di unificare in un solo account ed una sola registrazione al servizio diverse numerazioni in ingresso sul proprio apparato, ma per poter riconoscere ogni singola chiamata su quale numero sia stata effettuata è necessario che il nostro apparato sia in grado di leggere la user-part dell'header "To:" e, come desiderato, agire conseguentemente al fine di poter operare scelte condizionali sulla base del numero chiamato.

Implementazione di esempio per Asterisk PBX

Come esempio, consideriamo l'Account VoIP 5xxxxxx con password password al quale sono correlati due numeri geografici: il numero di Roma 0612345678 ed il numero di Milano 0212345678. L'idea è che quindi si potrà in linea di massima ricevere chiamate dirette a:

  • il numero di Roma: 0612345678;
  • il numero di Milano: 0212345678;
  • il numero interno: 5xxxxxx;

Innanzitutto, nel file sip.conf, si avrà:

register => 5xxxxxx:password@sip.messagenet.it:5061/200

Si presti attenzione alla parte finale, ovvero alla register extension, nel nosto caso "200": questa è l'estensione locale con la quale le chiamate verranno gestite lungo il context relativo a questa richiesta di registrazione al servizio.

Per questo, dunque, è necessario che nel dialplan sia configurata un'extension 200 e che questa operi in modo da discriminare le chiamate in base al numero di destinazione, quindi trattate in modi diversi. Un esempio di come farlo è il seguente:

[sipin]
exten => 200,1,Set(CALLED=${CUT(CUT(SIP_HEADER(TO),@,1),:,2)})
exten => 200,n,Verbose(Chiamata su Messagenet per il numero ${CALLED})
exten => 200,n,GotoIf($["${CALLED}" == "0612345678"]?to-rome,s,1)
exten => 200,n,GotoIf($["${CALLED}" == "0212345678"]?to-milan,s,1)
exten => 200,n,GotoIf($["${CALLED}" == "5312345"]?to-internal,s,1)
exten => 200,n,Goto(to-other,s,1)

[to-rome]
exten => s,1,Verbose(Chiamata per Roma)
exten => s,n,Dial(SIP/201)
exten => s,n,Hangup()

[to-milan]
exten => s,1,Verbose(Chiamata per Milano)
exten => s,n,Dial(SIP/202) exten => s,n,Hangup()

[to-internal]
exten => s,1,Verbose(Chiamata per l'interno Messagenet)
exten => s,n,Dial(SIP/203) exten => s,n,Hangup()

[to-other]
exten => s,1,Verbose(Chiamata per numero non configurato)
exten => s,n,Playback(pbx-invalid) exten => s,n,Hangup()

Ecco cosa accade in questo dialplan di esempio:

  • la chiamata arriva, e viene diretta nel context sipin, sull'extension 200;
  • la variabile CALLED viene riempita con una porzione dell'header SIP, quella che dovrebbe contenere il numero chiamato;
  • vengono fatti sequenzialmente dei controlli sulla variabile CALLED, durante i quali, se il numero in essa contenuto risulta essere uno di quelli elencati, si viene inviati ad un nuovo context opportuno;

I context sono così descritti:

  • to-rome gira la chiamata all'extension locale 201;
  • to-milan gira la chiamata all'extension locale 202;
  • to-internal gira la chiamata all'extension locale 203;
  • to-other riproduce un messaggio vocale che cita che l'extension non è valida, quindi riaggancia.

In questo dialplan sono presenti una serie di comandi Verbose() che possono essere rimossi, ma che fanno in modo di poter seguire una chiamata da una console di Asterisk per verificare che si comporti come desiderato.
Il risultato ottenuto, ovviamente, è che a seconda del numero chiamato, le chiamate vengono dirottate a diversi operatori o destinazioni, ossia si demultiplexano le chiamate entranti.

N.B.: tutti i nomi di contesti ed estensioni, nonchè la modalità tramite la quale quanto discusso è stato realizzato, sono effettuati imponendo nomi esemplificativi: quello che si vuole sottolineare è il senso della dinamica di quanto effettuato, ma la configurazione è meramente esemplificativa;

N.B.: altri dispositivi simili come FreePBX, essendo un derivato di Asterisk PBX ed in linea con altre versioni derivate da questo PBX, possono analogamente ottemperare allo scopo: prendere visione della documentazione in merito;

Selezione dinamica del CLI in chiamata

Al pari del punto precedente, è ancora più interessante in uno scenario di questo tipo poter scegliere di volta in volta con quale numerazione geografica originare la chiamata in uscita.

In generale:

  • il numero chiamante sulla rete telefonica non può essere arbitrariamente scelto dal chiamante SIP: l'operatore fa screening della numerazione e si fa carico di garantire che per le chiamate originate dalla propria rete vengano impiegati dei numeri chiamanti validi ed attribuiti effettivamente al cliente chiamante: le impostazioni pertanto saranno verificate sempre da parte dei sistemi Messagenet ed avranno effetto solo:
    1. dalla linea di demarcazione tra rete VoIP Messagenet e rete telefonica pubblica: per quanto riguarda la visualizzazione del chiamante relativamente alle chiamate tra sole utenze VoIP, l'apparato chiamato visualizzerà verosimilmente quanto specificato nel Display Name (display part dell'header "From:") secondo quanto suggerito nelle specifiche;
    2. se precedentemente concordate tramite contatto di supporto (Tecnico od Amministrativo);
    3. se correttamente configurate in relazione al punto precedente;
  • ogni Account VoIP di Messagenet avrà un numero chiamante di default (nella maggior parte dei casi è il primo numero geografico scelto per l'Account VoIP in questione) che verrà impiegato in caso di errore nella specifica di altre numerazioni chiamanti, o se non nascosto volontariamente;

Nel caso si sia scelto di associare numerazioni geografiche in più alla medesima Utenza VoIP e' possibile scegliere dinamicamente quale tra queste utilizzare per la terminazione di una chiamata sulla rete telefonica pubblica, ma questa possibilità deve essere concordata precedentemente e configurata sui nostri sistemi.

Esistono infatti due modalita' distinte e reciprocamente esclusive per ottenere questo scopo, basate sull'utilizzo di due differenti header SIP:

1 - Utilizzo degli Header P-Preferred-Identity o del Remote-Party-ID

Nel caso venga scelta questa modalità, è necessario che l'apparato chiamante possa aggiungere un particolare header SIP all'INVITE generato e diretto ai nostri sistemi. In Particolare, si tratta di aggiungere l'header P-Preferred-Identity" valorizzandolo con la URI completa, sostituendo il numero dell'account in uso con il numero geografico da utilizzare come CLI in formato e164 con leading plus (nel nostro caso faremo un esempio con un numero +3912345678900):

P-Preferred-Identity: <sip:+3912345678900@sip.messagenet.it>

L'intero payload dell'INVITE apparira' di conseguenza nella forma:

U 2012/12/06 11:15:40.188965 212.97.35.XX:5003 -> 212.97.59.76:5061
INVITE sip:3XXXXXXXXX@sip.messagenet.it SIP/2.0.
Via: SIP/2.0/UDP 192.168.130.10:5060;branch=z9hG4bK2400e757.
Max-Forwards: 70.
From: "Pinco Pallino" <sip:5XXXXXX@192.168.130.10>;tag=as5ac44caf.
To: <sip:3XXXXXXXXX@sip.messagenet.it>.
Contact: <sip:5XXXXXX@192.168.130.10:5060>.
Call-ID: 5717ebf5402014bc4e96bebe6d361b64@192.168.130.10:5060.
CSeq: 103 INVITE.
User-Agent: AsteriskPBX.
Proxy-Authorization: Digest username="5XXXXXX", realm="sip.messagenet.it", algorithm=MD5, uri="sip:3XXXXXXXXX@sip.messagenet.it", nonce="UMBxdlDAcEqmHgHBDkXEs9Mh9I4cpRQ1gIlnlIH6fznfgXG0r
Sz7yUk1LA+C", response="13e09ead6b93cf47efa9a23a76c5ee54", qop=auth, cnonce="311d4651", nc=00000001.
Date: Thu, 06 Dec 2012 10:15:40 GMT.
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH.
Supported: replaces, timer.
Privacy: none.
P-Preferred-Identity: <sip:+3912345678900@sip.messagenet.it>.
Content-Type: application/sdp.
Content-Length: 355.
...

N.B.: e' possibile utilizzare "Remote-Party-ID" al posto dell'header "P-Preferred-Identity" valorizzandolo nel medesimo modo, nel caso l'uso di questo header fosse piu' pratico. Nel caso vengano specificati entrambi e siano tra di loro contrastanti, l'header "P-Preferred-Identity" ha precedenza tra i due.

Implementazione di esempio per Asterisk PBX

Si ipotizzi di aver abilitato il numero 021234567 e lo 061234567 sulla medesima utenza 5xxxxxx; per scegliere il CLI nelle chiamate in uscita in questa modalità, andrà aggiunto l'header SIP atto allo scopo: se ad un certo momento del dialplan, alla priorità "n", l'estensione "ext" effettua una Dial() SIP usando l'account 5xxxxxx per chiamare 3212345678, normalmente si avrebbe:

...
exten => ext,n,Dial(SIP/5xxxxxx/3212345678)
...
exten => h,1,HangUp()

Si vuole scegliere con quale dei due numeri uscire e per questo fine si scelga di aggiungere con una priorità precedente alla Dial() un'altra direttiva (le priorità sono tipicamente numeriche, scriviamo "n-1" e "n-2" unicamente per maggiore comprensione) atto a scegliere con quale CLI uscire su rete telefonica:

...
exten => ext,n-1,SipAddHeader(P-Preferred-Identity: <sip:+39021234567@sip.messagenet.it>)
exten => ext,n,Dial(SIP/5xxxxxx/3212345678)
...
exten => h,1,HangUp()

Con questo setup la chiamata andrà su rete telefonica con CLI 021234567.

N.B.: altri dispositivi simili come FreePBX, essendo un derivato di Asterisk PBX ed in linea con altre versioni derivate da questo PBX, possono analogamente ottemperare allo scopo: prendere visione della documentazione in merito;

2- Utilizzo della display part dell'header "From:"

Nel caso venga scelta questa modalita', e' necessario che l'apparato chiamante specifichi il numero geografico da utilizzare come CLI (in formato e164 con leading plus) come valore della display part dell' Header "From:".
Osservando il precedente INVITE, si tratterebbe di modificare il valore dell'header come segue:

From: "+3912345678900" <sip:5XXXXXX@192.168.130.10>;tag=as5ac44caf.

Attenzione: si sta parlando della display part, ovvero il Displayname e non della user part dell'header "From:": la user part viene infatti utilizzata a fine di autenticazione e deve coincidere assieme all'Authentication-Username al Account VoIP in uso (nel nostro caso, 5XXXXXX); in caso contrario, la chiamata verrà rifiutata.

Implementazione di esempio per Asterisk PBX

Anche qui, si ipotizzi di aver abilitato il numero 021234567 e lo 061234567 sulla medesima utenza 5xxxxxx e di voler chiamare, nel dialplan, il numero 3212345678; differentemente dal precedente caso, questa volta il dialplan sarà così modificato:

...
exten => ext,n-1,Set(CALLERID(name)="+39061234567")
exten => ext,n,Dial(SIP/5xxxxxx/3212345678)
...
exten => h,1,HangUp()

N.B.: altri dispositivi simili come FreePBX, essendo un derivato di Asterisk PBX ed in linea con altre versioni derivate da questo PBX, possono analogamente ottemperare allo scopo: prendere visione della documentazione in merito;

Anonimizzazione del CLI tramite aggiunta dell'header "Privacy"

La visibilità del CLI in chiamata segue il comportamento di default abilitato inizialmente in modo statico (visibile o anonimo), configurabile tramite sito web di Messagenet.

Nel caso venga invece visualizzato un CLI (dinamicamente come visto, se correttamente specificato, o di default se non correttamente specificato o non specificato affatto) e lo si voglia nascondere in determinate circostanze, è possibile agire dinamicamente anche in questo senso aggiungendo l'header SIP "Privacy" e valorizzandolo opportunamente.

Per chiarire, l'header "Privacy" puo' essere valorizzato con:

  • none
    consente la visualizzazione del CLI (vedere l'INVITE precedente);
  • id
    nasconde il CLI su rete telefonica tradizionale;

Implementazione di esempio per Asterisk PBX

Ovviamente questa funzionalità dinamica è impiegabile indistintamente nelle due diverse modalità precedentemente discusse, ovvero può essere implementata in maniera complementare ad entrambe.
Per comprendere, si faccia riferimento al primo dei due casi trattato: in questo caso, il dialplan potrebbe essere indicato come segue:

...
exten => ext,n-2,SipAddHeader(P-Preferred-Identity: <sip:+39021234567@sip.messagenet.it>)
exten => ext,n-1,SipAddHeader(Privacy: none)
exten => ext,n,Dial(SIP/5xxxxxx/3212345678)
...
exten => h,1,HangUp()

Con questo setup, la chiamata verrà immessa su rete telefonica con CLI 021234567 e la visibilità del numero sarà esplicitamente consentita.

N.B.: altri dispositivi simili come FreePBX, essendo un derivato di Asterisk PBX ed in linea con altre versioni derivate da questo PBX, possono analogamente ottemperare allo scopo: prendere visione della documentazione in merito;

Chiarimenti e richieste per abilitazione del servizio

Rivolgersi al supporto tramite mail a support@messagenet.it o tramite questo portale, indicando la modalità scelta per lo scopo compatibilmente alle caratteristiche del proprio apparato: Messagenet non offre supporto all'implementazione diretta di questa tipologia di servizio sugli apparati dei propri clienti, limitandosi a fornire indicazioni specifiche nei limiti del possibile;