Archivio

Posts Tagged ‘Dialplan’

Più servers Asterisk, un unico centralino

27/11/2009 1 commento

Tra i file di configurazione di Asterisk, vincono a pari merito la il premio per i più inutilizzati extensions.ael e dundi.conf. La comunità degli utilizzatori del famoso IPPBX non sembra aver apprezzato lo sforzo di Mark Spencer e soci nel creare qualcosa di più dei soliti servizi. Eppure si tratta di due funzionalità molto potenti che semplificherebbero di molto la vita dei progettatori. Di AEL abbiamo già parlato in un precedente post, oggi volevo parlarvi dei miei esperimenti con DUNDi.

A cosa serve questo nuovo protocollo della premiata ditta Digium? A fare quello che tutti i progettatori di reti VoIP basate su Asterisk chiedevano da anni, anche se, quando la soluzione è arrivata nessuno se ne accorto. Con DUNDi è possibile condividere i piani di numerazione di macchine diverse, senza dover ricreare gli interni su ciascuna macchina. L’uovo di colombo è questo protocollo cifrato che interroga i vari servers alla ricerca dell’interno cercato, ricevendo come risposta l’indirizzo esatto a cui sparare la chiamata, sempre se esiste. La tecnica non è innovativa, dato che viene usata da tutti i principali software per il peer2peer ma unita alle qualità di Asterisk, fornisce un qualcosa di rivoluzionario.

Com’è ormai usanza di questo blog, voglio mostrarvi un semplice esempio applicativo. A tale proposito supponiamo di avere due aziende, la Acme Corporation e la Experience Ltd, dotate entrambi del loro bel Asterisk Server, con connesso un flusso primario dal quale ricevono e fanno chiamate. Ad un certo punto la Acme compra la Experience e le due aziend econdividono la stessa rete. Gli amministratori decidono di unificare i centralini per non passare dalla rete telefonica nazionale, quando la chiamata è da un interno di un’azienda all’altra. Le due macchine sono così fatte:

Asterisk Acme :                   IP address 192.168.1.10                   MAC Address: 11:11:11:11

Asterisk Experience :          IP address 192.168.2.10                   MAC Address: 22:22:22:22

Si decide di creare un link DUNDì tra le due, cosa fattibile in pochi semplici passi.

Generazione delle chiavi pubbliche e private

In Asterisk Acme, sotto il path /var/lib/asterisk/keys digitare:

astgenkey -n Acme

verranno generati due files, Acme.key e Acme.pub . Acme.pub deve essere copiato nella stessa sottodirectory nel server Asterisk Experience. La stessa operazione andrà eseguita, in verso opposto, sostituendo “Experience” nel comando astgenkey, nell’Asterisk di Experience Ltd.

DUNDi.conf

A questo punto bisogna configurare il DUNDi, dichiarando le altre macchine che compongono il mega centralino. Nel nostro caso è facile perché sono solo due, ma il principio è lo stesso anche per molte macchine.

Nella prima sezione del file dundi.conf si dichiarano informazioni sulla collocazione della macchina locale e sul criterio di interrogazione delle altre macchine. Per il server Acme sarà:

[general]
organization= Acme Corporation
locality= Zona indistriale
stateprov= Milano
country=It
email=amministratore@acme.com
phone=+39.0255.144.915
bindaddr=0.0.0.0
port=4520
entityid=11:11:11:11  ; Per convenzione il MAC del server
cachetime=3600
ttl=5                 ; 2000 + ttl * 200 = 3000ms di attesa massima per le query DUNDi
autokill=yes
secretpath=dundi
storehistory=no

Segue poi una sezione in cui si dichiarano i criteri di ricerca degli interni nelle altre macchine e nella macchina locale. Sparo la parte di configurazione e poi l’analizzo:

[mappings]
priv => ext-condivise,0,IAX2,priv:${SECRET}@192.168.1.10/${NUMBER},nopartial

Il canale di ricerca DUNDi si chiama priv. E’ uno solo ma se ne possono avere quanti se ne vuole. Se una macchina esterna interroga questo server alla ricerca di un interno, si deve controllare un contesto del file extensions.conf chiamato [ext-condivise] per avere una risposta. E’ quindi possibile condividere solo gli interni che si vuole, vedremo poi come. Se l’interno che l’altro server cerca esiste, questo è contattabile in IAX sparando la chiamata al contesto IAX che si chiama priv. Esiste quindi un contesto IAX che accetta chiamate con autenticazione criptata, che accede ai contesti extensions di questa macchina.

L’ultima parte di questo file di configurazione è la dichiarazione dei servers che compongono il mega centralino. Si avranno tante sezioni come quella che segue. Nel nostro caso è solo una perché si ha un solo server da controllare, oltre il locale.

[22:22:22:22] ; MAC address del server Experience
model = symmetric
host = 192.168.2.10 ; IP del server Experience
inkey = Experience
outkey = Acme
include = priv
permit = priv
qualify = yes
order = primary

Et voila, il file dundi.conf è servito. Da notare che abbiamo citato parti dell’extensions.conf e dello iax.conf che dobbiamo andare a creare. Per la macchina Experience, il file dundi.conf sarà esattamente simmetrico, apportando le giuste modifiche.

IAX.conf

La parte IAX è forse la più semplice. Inanzi tutto è bene specificare che si poteva usare anche il SIP o l’H323 come protocollo, ma in Asterisk tutto è più semplice usando IAX per il trunking. Si tratta di creare un contesto per accettare le chiamate dagli altri server sulla base di un’autenticazione del tipo chiave pubblica/chiave privata ( a questo servono i file creati al primo step).

[general]
bindport = 4569
bindaddr = 0.0.0.0
disallow=all
allow=alaw
allow=gsm
mailboxdetail=yes

[priv]
type=friend
dbsecret=dundi/secret
context=incoming-dundi

La prima parte è un semplice contesto general di iax.conf. Nella seconda si dice che si accettano chiamate nel contesto [priv] , l’autenticazione usa il dbsecret del DUNDi e il contesto in extensions.conf che gestisce la chiamata si chiama [incoming-dundi]. Il dbsecret del DUNDi è un campo del DB interno Asterisk che viene continuamente modificato dal processo DUNDi secondo le chiavi segrete locali e pubbliche remote. Questo iax.conf può essere copiato pari pari nella macchina Experience, oppure basta aggiungere il contesto [priv].

Extensions.conf

Per finire l’opera bisogna popolare il file extensions.conf con tutti i contesti definiti nei precedenti files. Devo premettere che ho implementato questa soluzione tra due macchine con Freepbx , quindi non ho toccato extensions.conf, bensì extensions_custom.conf, ma la sostanza non cambia. Per prima cosa si crea un contesto dove si mostrano i numeri condivisi, come segue:

[ext-condivise]
exten => 0211144947,1,NoOp
exten => 0211144945,1,NoOp
exten => 0211144939,1,NoOp

Ho scelto di pubblicare i numeri esterni del centralino e non gli effettivi interni, perché volevo che le chiamate in arrivo dall’altro centralino fossero trattate come quelle in arrivo dalla Rete Telefonica. Così l’operatore di Experience che era abituato a fare il numero pubblico di un collega Acme, non si accorgerà del passaggio. Un interno è pubblicato e visibile agli altri server se si trova in questo contesto. Poi si crea il contesto che gestisce le chiamate in arrivo dal trunk iax:

[incoming-dundi]
include => from-trunk

Sempre perché lavoro su freepbx, ho incluso il context from-trunk, dove la chiamata viene trattata come se arrivasse dalla PSTN. Quando l’operatore Experience chiama il numero del collega Acme, il DUNDi fa un’interrogazione criptata sul contesto [ext-condivise] cercando il numero chiamato e, se lo trova, spara la chiamata sul trunk iax che la fa gestire dal contesto [incoming-dundi]. Sembra complicato ma ha una logica lapalissiana.

A questo punto manca solo un contestino per fare le query nell’altro verso: dalla macchina Acme a quella Experience. Segue lo striminzito contesto:

[lookupdundi]
switch => DUNDi/priv

Switch è l’extension che scatena la query usando il protocollo DUNDi sul contesto DUNDi chiamato [priv]. That’s all folks a livello di files di configurazione. Su Freepbx ho dovuto creare un trunk custom per sparare le chiamate prima sul DUNDi e poi, se non esisteva il chiamato sull’altro server, sulla rete telefonica pubblica.

Infine basta mettere come prima scelta nell’outboundroute generale il trunk appena creato, prima dell’uscita su PSTN. E il gioco è fatto.