Lavorando in un’azienda multisede, dopo aver sostituito tutti i vecchi centralini analogici con Asterisk, la prima richiesta fatta è:

si può far sì che le nostre telefonate infra-sede siano gratuite?

La risposta è ovviamente si 😮 (a patto che le sedi da collegare abbiano una connessione adsl, o comunque a banda larga ma questo è un altro discorso)

dopo un minimo di studio della problematica sono arrivato alla scelta di IAX come protocollo di interconnessione asterisk to asterisk.

Oltre ad essere il protocollo nativo di asterisk, iax ha anche altri vantaggi; per esempio:

  • può incapsulare tutto il traffico in un unico canale;
  • usa una sola porta di comunicazione;
  • l’attraversamento delle NAT è nativo, e non da problemi;
  • permette di selezionare il punto di arrivo nel dialplan di destinazione  sin dall’origine….

…e comunque tante altre piccole funzionalità che nell’insieme lo rendono imbattibile.

INSOMMA COME SI INTERCONNETTONO DUE CENTRALINI IN MANIERA SEMPLICE?

la soluzione è stata più semplice del previsto e l’idea di base è paragonabile a quella su cui si basa una VPN

ma veniamo al sodo:

abbiamo due centralini (Homer e Marge) di cui vado ad illustrare iax.conf:

HOMER MARGE
iax.conf:

[general]

bindport=4569
bindaddr=0.0.0.0
language=it
bandwidth=medium
disallow=all
allow=gsm
allow=alaw
allow=ulaw
jitterbuffer=no
forcejitterbuffer=no
autokill=yes
requirecalltoken=no
;maxcallnumbers=512
mailboxdetail=yes

[marge]
type=friend
username=homer
secret=<password>
auth=plaintext
host=marge.mydomain.it
context=fromiax
peercontext=fromiax
qualify=yes
trunk=yes

iax.conf:

[general]

bindport=4569
bindaddr=0.0.0.0
language=it
bandwidth=medium
disallow=all
allow=gsm
allow=alaw
allow=ulaw
jitterbuffer=no
forcejitterbuffer=no
autokill=yes
requirecalltoken=no
;maxcallnumbers=512
mailboxdetail=yes

[homer]
type=friend
username=marge
secret=<password>
auth=plaintext
host=homer.mydomain.it
context=fromiax
peercontext=fromiax
qualify=yes
trunk=yes

Le righe da inserire in extensions.conf a questo punto sono abbastanza semplici e logiche;

occorre una riga nel contesto di uscita con un prefisso di nostro gradimento (99) per chiamare gli interni dell’altro e una riga per le chiamate entranti:

HOMER MARGE
extensions.conf

[outgoing]

[…]

exten => _99XXX,1,Dial(IAX2/marge/${EXTEN:2})

[…]

[fromiax]
exten => _X.,1,Goto(outgoing,${EXTEN},1)

extensions.conf

[outgoing]

[…]

exten => _99XXX,1,Dial(IAX2/homer/${EXTEN:2})

[…]

[fromiax]
exten => _X.,1,Goto(outgoing,${EXTEN},1)

Le chiamate “fromiax” le redirigo in outgoing perché nel mio caso questo è anche il contesto in cui si trovano gli interni.

Ora si pone un piccolo problema:

come distinguere chi chiama dall’altra sede?

Se la reception nella sede “Marge” chiama un interno nella sede “Homer” quest’ultimo vedrà arrivare una chiamata da “Reception”, indistinto dalla reception locale;

questo effetto collaterale può generare molta confusione e per ovviare a ciò ho pensato ad una piccola macro, questa imposta il CallerID a seconda della sede di provenienza, extensions.conf quindi andrà così modificato:

HOMER MARGE
extensions.conf

[outgoing]

[…]

exten => _99XXX,1,Macro(set-iax-callerid,IAX2/marge/${EXTEN:2})

[…]

[fromiax]
exten => _X.,1,Goto(outgoing,${EXTEN},1)

[macro-set-iax-callerid]

;aggiunge un TAG di riconoscimento al CID dei chiamanti
; ARG1 è l’estensione da chiamare

exten => s,1,Set(CALLERID(name)=${CALLERID(name)} – Homer)
exten => s,2,Dial(${ARG1})

extensions.conf

[outgoing]

[…]

exten => _99XXX,1,Macro(set-iax-callerid,IAX2/homer/${EXTEN:2})

[…]

[fromiax]
exten => _X.,1,Goto(outgoing,${EXTEN},1)

[macro-set-iax-callerid]

;aggiunge un TAG di riconoscimento al CID dei chiamanti
; ARG1 è l’estensione da chiamare

exten => s,1,Set(CALLERID(name)=${CALLERID(name)} – Marge)
exten => s,2,Dial(${ARG1})

buon asterisk a tutti.

informazioni d base tratte da: astrecipes.net