Premetto che quanto di seguito funziona con i pacchetti disponibili sul repository ufficiale di Debian Jessie di OpenSIPS ed Asterisk: la struttura delle tabelle, le convenzioni, i nomi possono pertanto essere differenti dalle altre versioni disponibili su altre distribuzioni Linux.
Lo scenario descritto vede due server Linux con Debian Jessie 8.1 già in rete: VoIP Router (IP:10.0.0.1) e VoIP Mediabox (IP:10.0.0.2)
Procediamo con il server “VoIP Router”, che gestisce il routing delle segnalazioni SIP, la registrazione degli utenti, lo smistamento su eventuali trunk esterni.
Database MySQL
Come primo punto, è necessario predisporre e configurare un DBMS MySQL dove implementare le tabelle per opensips e per asterisk: può essere utilizzato anche uno dei due server, valutando attentamente lo spazio necessario per la tabella del CDR, che ha la tendenza a crescere piuttosto velocemente.
Dopo aver predisposto il DBMS MySQL implementando due database: ‘opensips’ e ‘asterisk’, con relativi utenti e permessi per l’accesso, possiamo iniziare ad installare il software necessario.
OpenSIPS
Dal terminale sul server VoIP Router installiamo OpenSIPS 1.11.5 con il comando:
sudo apt-get install opensips
ed installiamo anche altri pacchetti di supporto necessari:
sudo apt-get install opensips-carrierroute-module sudo apt-get install opensips-dialplan-module sudo apt-get install opensips-mysql-module sudo apt-get install opensips-identity-module sudo apt-get install opensips-presence-module
(probabilmente verrà richiesto di soddisfare alcune dipendenze con librerie esterne). Adesso dobbiamo popolare il database ‘opensips’ con le tabelle che trovate nella directory /usr/share/opensips/mysql, avendo cura di importare solo quelle richieste (in neretto – in realtà possiamo anche importarle tutte ma aumenta la confusione e lo spreco di spazio):
acc-create.sql cachedb_sql-create.sql dialplan-create.sql imc-create.sql registrant-create.sql standard-create.sql alias_db-create.sql call_center-create.sql dispatcher-create.sql load_balancer-create.sql registrar-create.sql uri_db-create.sql auth_db-create.sql carrierroute-create.sql domain-create.sql msilo-create.sql rls-create.sql userblacklist-create.sql avpops-create.sql closeddial-create.sql domainpolicy-create.sql pdt-create.sql rtpproxy-create.sql usrloc-create.sql b2b-create.sql cpl-create.sql drouting-create.sql permissions-create.sql siptrace-create.sql b2b_sca-create.sql dialog-create.sql group-create.sql presence-create.sql speeddial-create.sql
Adesso possiamo passare alla configurazione di OpenSIPS, contenuta nel file opensips.cfg dentro la directory /etc/opensips. Il file di default può essere usato come base di partenza, avendo cura di aggiungere sia il caricamento del modulo MySQL che le relative impostazioni e credenziali:
#### MYSQL module loadmodule "db_mysql.so" db_default_url="mysql://[nome utente]:[password]@[host dbms]/opensips"
una volta concluso, ricordarsi di cambiare la variabile RUN_OPENSIPS= da ‘no’ a ‘yes’ dentro il file /etc/default/opensips.
Asterisk
Sul server dedicato ai servizi multimediali (caselle vocali, ivr, code di risposta….) tramite Asterisk, procediamo all’installazione del server con:
sudo apt-get install asterisk
e dei relativi pacchetti con i moduli e le voci:
sudo apt-get install asterisk-config asterisk-core-sounds-en asterisk-modules asterisk-mysql asterisk-voicemail
dopodichè popoliamo il relativo database ‘asterisk‘ sul nostro DBMS con le seguenti viste (da Realtime OpenSIPS – Asterisk Integration)
CREATE TABLE `meetme` ( `confno` varchar(80) NOT NULL default '0', `username` varchar(64) NOT NULL default '', `domain` varchar(128) NOT NULL default '', `pin` varchar(20) default NULL, `adminpin` varchar(20) default NULL, `members` int(11) NOT NULL default '0', PRIMARY KEY (`confno`) ) ENGINE=MyISAM CREATE VIEW `asterisk`.`sipusers` AS select `opensips`.`subscriber`.`username` AS `name`, `opensips`.`subscriber`.`username` AS `username`, _latin1'friend' AS `type`, NULL AS `secret`, `opensips`.`subscriber`.`domain` AS `host`, concat(`opensips`.`subscriber`.`rpid`,_latin1' ',_latin1'<',`opensips`.`subscriber`.`username`,_latin1'>') AS `callerid`, _latin1'default' AS `context`, `opensips`.`subscriber`.`username` AS `mailbox`, _latin1'force_rport,comedia' AS `nat`, _latin1'no' AS `qualify`, `opensips`.`subscriber`.`username` AS `fromuser`, NULL AS `authuser`, `opensips`.`subscriber`.`domain` AS `fromdomain`, NULL AS `insecure`, _latin1'no' AS `canreinvite`, NULL AS `disallow`, NULL AS `allow`, NULL AS `restrictcid`, `opensips`.`subscriber`.`domain` AS `defaultip`, `opensips`.`subscriber`.`domain` AS `ipaddr`, _latin1'5060' AS `port`, NULL AS `regseconds`, NULL AS `callbackextension` from `opensips`.`subscriber`; CREATE VIEW `asterisk`.`vmusers` AS select concat(`opensips`.`subscriber`.`username`,`opensips`.`subscriber`.`domain`) AS `uniqueid`, `opensips`.`subscriber`.`username` AS `customer_id`, _latin1'default' AS `context`, `opensips`.`subscriber`.`username` AS `mailbox`, `opensips`.`subscriber`.`vmail_password` AS `password`, concat(`opensips`.`subscriber`.`first_name`,_latin1' ',`opensips`.`subscriber`.`last_name`) AS `fullname`, `opensips`.`subscriber`.`email_address` AS `email`, NULL AS `pager`, `opensips`.`subscriber`.`datetime_created` AS `stamp` from `opensips`.`subscriber`; CREATE VIEW `asterisk`.`vmaliases` AS select `opensips`.`dbaliases`.`alias_username` AS `alias`, _latin1'default' AS `context`, `opensips`.`dbaliases`.`username` AS `mailbox` from `opensips`.`dbaliases`;
per avere la tabella con gli utenti (sipusers), gli alias di chiamata (vmaliases), le caselle vocali (vmusers) e le conferenze (meetme).
A questo punto è necessario configurare Asterisk per usare i dati contenuti nelle tabelle sul database. Nel file /etc/asterisk/res_config_mysql.conf è necessario impostare i parametri di connessione al database:
[general] dbhost = [host] dbname = asterisk dbuser = [utente] dbpass = [password] dbport = 3306
e nel file /etc/asterisk/extconfig.conf indichiamo ad Asterisk dove deve prendere i dati (sintassi: file => driver,database[,table[,priority]]):
[settings] sipusers => mysql,general,sipusers sippeers => mysql,general,sipusers voicemail => mysql,general,vmusers meetme => mysql,general,meetme
A questo punto possiamo provare ad eseguire Asterisk (‘sudo /etc/init.d/asterisk start’) e connettersi alla consolle di amministrazione attraverso il comando ‘asterisk -r’. Per verificare la connessione al database si può usare il comando ‘realtime mysql status‘.
Configurare OpenSIPS per i servizi multimediali di Asterisk
La configurazione di OpenSIPS può sembrare abbastanza ostica e, sinceramente, lo è. Presuppone una conoscenza abbastanza approfondita del protocollo SIP e delle relative segnalazioni, nonché tutta una serie di procedure proprie del programma.
Per comodità, allego due configurazioni semplificate di quelle da me implementate, che potete scaricare qui: opensips.cfg e extensions.conf.
Da notare che quando desideriamo che la chiamata venga dirottata sul server Asterisk è necessario reimpostare i parametri della chiamata, come ad esempio per l’accesso alla casella vocale, usando il prefisso ‘VMR’:
prefix("VMR_"); rewritehostport("10.0.0.2:5060");
che nella configurazione di Asterisk (‘extensions.conf‘) sarà intercettato da:
[from-voip] ... exten => _VMR_.,1,Noop("from-voip: ${CALLERID(num)} ${EXTEN}") exten => _VMR_.,n,Set(DID=${EXTEN:4}) exten => _VMR_.,n,Answer() exten => _VMR_.,n,Wait(1) exten => _VMR_.,n,MailboxExists(${DID}) exten => _VMR_.,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?avail:unavail) exten => _VMR_.,n(avail),Voicemail(${DID},u) exten => _VMR_.,n,Hangup() exten => _VMR_.,n(unavail),Playback(vm-theperson) exten => _VMR_.,n,SayDigits(${DID}); exten => _VMR_.,n,Playback(vm-isunavail) exten => _VMR_.,n,Hangup()
A questo punto le possibilità sono virtualmente infinite e dipendono dalla vostra fantasia e capacità di implementazione. Vi ricordo che il web è una ottima fonte di esempi, documentazione e troubleshooting, come ad esempio il sito Voip-info.org che contiene moltissima documentazione su Asterisk. Per OpenSIPS la documentazione è un po’ più carente e la trovate essenzialmente sul sito ufficiale del progetto: Opensips.org.