Asterisk Pbx – Migrazione a PJSIP
Asterisk, il più famoso centralino voip open source prodotto da Digium, storicamente ha supportato il protocollo SIP esclusivamente tramite il modulo chan_sip. A partire dalla versione 12 è stata introdotta una nuova implementazione di questo procotollo basata sulle librerie PJSIP (www.pjsip.org) dalla quale è nato il modulo res_pjsip. Il nuovo driver rispetto al suo predecessore ha una struttura modulare che lo rende più flessibile agevolando lo sviluppo di aggiornamenti e l’introduzione di nuove funzionalità.
Principali novità
Tra la novità più interessanti introdotte in res_pjsip vi sono una gestione del NAT molto flessibile con la possibilità di configurare servizi di trasporto multipli e la possibilità di associare la stessa estensione a più dispositivi (telefoni IP, softphone o altro) sfruttando la gestione dei contact. Quando l’estensione viene innescata dal dialplan tutti i dispositivi associati squillano contemporaneamente e quindi tutti possono essere utilizzati per rispondere. Per le chiamate uscenti invece tutti i dispositivi si presentano con lo stesso CallerID indipendentemente dall’endpoint utilizzato per effettuare la chiamata.
Configurazione
Nel vecchio chan_sip viene utilizzata un’unica sezione per la definizione di ogni oggetto, sia questo un dispositivo o un trunk (inteso come collegamento a provider di servizi VoIP o ad un gateway SIP). La maggior flessibilità offerta da res_pjsip richiede una configurazione che di primo impatto può sembrare più complessa in quanto vengono utilizzate diverse sezioni ciascuna con una propria funzionalità specifica. Le sezioni principali sono le seguenti:
- TRANSPORT, definisce come il modulo res_pjsip deve operare a livello di trasporto. In questa sezione vengono configurati quindi i protocolli (TCP, UDP, TLS), i metodi di encryption se richiesti, gli indirizzi di binding. E’ possibile configurare più transport in ascolto su porte o indirizzi differenti, per ogni dispositivo o trunk (endpoint) è poi necessario specificare il transport associato. Se si utilizzano nello stesso sistema chan_sip e res_pjsip bisogna fare attenzione ai binding. Se il binding di chan_sip è configurato come di default su 0.0.0.0:5060 su protocollo UDP è necessario specificare una porta o protocollo differente per res_pjsip.
- ENDPOINT, le principali configurazioni di questa sezione riguardano il transport, i codec e il contesto. Sono presenti inoltre i riferimenti ad altre sezioni come aors e auth associate all’endpoint.
- AUTH, dove vengono definite le impostazioni di autenticazione. Rispetto a chan_sip non sono più presenti le opzioni peer, friend, user e la stringa register. Alla sezione AUTH vengono collegate in genere altre sezioni come ENDPOINT o REGISTRATION.
- AOR, Address of Record, definisce a quali indirizzi l’endpoint può essere contattato. Vengono definiti inoltre altri parametri come le mailbox associate per le richieste MWI, i parametri di qualify e di sip expiration ed il numero massimo di dispositivi che è possibile associare all’endpoint.
- REGISTRATION, definisce le impostazioni di una registrazione uscente. Sostituisce la vecchia stringa Register presente in chan_sip.
- IDENTIFY, se definito viene utilizzato per identificare a quale endpoint è associato un pacchetto in ingresso.
- ACL, utilizzato per configurare delle Access Control List in base alle quali è possibile consentire o bloccare del traffico SIP.
Esempio di configurazione di un transport
Nell’esempio seguente viene riportata la configurazione di un transport di esempio con bind sulla porta 5062 udp su tutti gli indirizzi del server. Vengono inoltre definite la sottorete locale (192.168.10.0/24) e l’indirizzo ip pubblico (1.2.3.4) utilizzato dal protocollo SIP per le segnalazioni e per il media stream.
[transport-default]
type=transport
protocol=udp
bind=0.0.0.0:5062
local_net=192.168.10.0/24
external_media_address=1.2.3.4
external_signaling_address=1.2.3.4
Esempio di configurazione di un endpoint locale
Nell’esempio seguente viene illustrato un esempio di configurazione di un’estensione locale (definita come 100) generalmente utilizzata per collegare un interno SIP al centralino asterisk.
Con chan_sip:
[100]
type=friend
context=incoming
dtmfmode=rfc2833
host=dynamic
defaultuser=100
secret=100
callerid=100 <100>
canreinvite=no
qualify=yesPer chiamare l’estensione a livello di dialplan:
exten => 100,1,Dial(SIP\100)
Utilizzando res_pjsip:
[100]
type=endpoint
context=incoming
disallow=all
allow=alaw
allow=ulaw
trust_id_outbound=yes
callerid=100 <100>
transport=transport-default (definito nell’esempio precedente).
auth=100
aors=100[100]
type=auth
auth_type=userpass
username=100
password=100[100]
type=aor
max_contacts=5 (indica il numero massimo di dispositivi che possono essere collegati all’endpoint).Per chiamare tutti i dispositivi associati all’indpoint è necessario utilizzare la funzione PJSIP_DIAL_CONTACTS.
exten => 100,1,Dial(${PJSIP_DIAL_CONTACTS(100)})
Esempio di configurazione di un trunk MESSAGENET
L’ultimo esempio riguarda la configurazione di un trunk verso un provider VoIP. Nello specifico il provider scelto per i test è MESSAGENET che accetta connessioni SIP sulla porta UDP 5061.
I parametri di esempio utilizzati sono i seguenti:
Sip server: sip.messagenet.it
Porta: UDP 5061
Username: 123456789
Password: abcdefgh
Numero geografico: 01187654321
Con chan_sip:
[MESSAGENET]
host=sip.messagenet.it
port=5061
defaultuser=123456789
secret=abcdefgh
type=friend
dtmfmode=rfc2833
fromuser=123456789
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
context=incomingregister => 123456789:abcdefgh@sip.messagenet.it/01187654321
A livello di dialplan:
Chiamate in ingresso: instradiamo le chiamate in ingresso verso il dispositivo SIP 100.exten => 01187654321,Dial(SIP\100)
Chiamate in uscita: per chiamare il numero geografico 0211223344 utilizzando il trunk creato definendo un pattern catch-all.
exten => _X.,1,Dial(SIP\MESSAGENET\0211223344)
Utilizzando res_pjsip:
[MESSAGENET]
type=registration
transport=transport-default
outbound_auth=MESSAGENET
server_uri=sip:sip.messagenet.it:5061
client_uri=sip:123456789@sip.messagenet.it:5061
contact_user=01187654321
retry_interval=60
expiration=3600
line=yes
endpoint=MESSAGENET[MESSAGENET]
type=endpoint
aors=MESSAGENET
outbound_auth=MESSAGENET
context=incoming
disallow=all
allow=alaw
allow=ulaw
from_user=123456789
language=it[MESSAGENET]
type=auth
auth_type=userpass
username=123456789
password=abcdefgh
realm=sip.messagenet.it[MESSAGENET]
type=aor
contact=sip:sip.messagenet.it:5061[MESSAGENET]
type=identify
endpoint=MESSAGENET
match=sip.messagenet.it:5061A livello di dialplan:
Chiamate in ingresso: instradiamo le chiamate in ingresso verso il dispositivo PJSIP 100.exten => 01187654321,Dial(PJSIP\100)
Chiamate in uscita: per chiamare il numero geografico 0211223344 utilizzando il trunk creato definendo un pattern catch-all.
exten => _X.,1,Dial(PJSIP\0211223344@MESSAGENET)
Riferimenti:
https://wiki.asterisk.org/wiki/display/AST/Configuring+res_pjsip