In breve
- Asterisk si collega all'agente vocale AI di Aptiva con una registrazione in uscita: su IAX2 basta una sezione friend in iax.conf con cifratura forzata; su SIP servono transport TLS, registration, auth, aor, endpoint con SRTP e un identify sull'indirizzo che ti forniamo.
- Le chiamate da Aptiva (i trasferimenti verso i tuoi interni) atterrano in un contesto dedicato che raggiunge gli interni previsti, come si fa con il trunk di qualunque operatore. L'agente può anche chiamare in uscita dal numero della tua azienda, attraverso il tuo operatore (campagne, richiami): serve un contesto dedicato di poche righe, una per lunghezza di numero, che trovi nella guida o configuriamo insieme.
- Per mandare una chiamata all'agente basta un Dial verso il trunk: Dial(IAX2/<UTENTE>/8000) oppure Dial(PJSIP/8000@aptiva). Il numero composto non è vincolante e il caller ID non va toccato.
- Riferimento: Asterisk 20 e 22 LTS con chan_iax2 e chan_pjsip. chan_sip è stato rimosso in Asterisk 21 e non è coperto. Istruzioni scritte sulla documentazione ufficiale e sul sample di configurazione di Asterisk.
Per collegare un Asterisk configurato a mano all'agente vocale AI di Aptiva ti servono tre cose: una registrazione in uscita verso di noi (in iax.conf oppure in pjsip.conf), un contesto dedicato in extensions.conf che riceva i trasferimenti dell'agente e raggiunga solo gli interni previsti, e un Dial verso il trunk nei punti del dialplan dove vuoi che la chiamata passi all'agente. Nessuna porta da aprire, nessun IP statico: è il tuo Asterisk a iniziare il collegamento.
Il riferimento è Asterisk 20 e 22 LTS con chan_iax2 e chan_pjsip. Le configurazioni qui sotto sono scritte sulla documentazione ufficiale e sui file di esempio di Asterisk; il collegamento in sé — trunk, registrazione, chiamata all'agente e trasferimento a un interno — è già stato provato sul campo su FreePBX, che è Asterisk con un'interfaccia sopra. Per requisiti, credenziali, sicurezza e problemi comuni a tutti i centralini rimandiamo alla guida generale al collegamento del centralino: qui trovi solo i file.
Cosa ti serve prima di aprire i file#
Prima di scrivere una riga di configurazione ti servono le credenziali del collegamento e un Asterisk con i moduli giusti caricati.
- Le credenziali del collegamento, che richiedi a noi indicando il protocollo. Ricevi utente, password, server, porta e, per SIP, l'indirizzo da autorizzare: nei file compaiono come
<UTENTE>,<PASSWORD>,<SERVER>,<PORTA>e<INDIRIZZO_APTIVA>. Copia server e porta dal foglio di configurazione, senza fidarti dei valori predefiniti. - I moduli caricati:
module show like iax2per IAX2; per SIPmodule show like pjsip(servono almenores_pjsip,res_pjsip_outbound_registrationeres_pjsip_endpoint_identifier_ip) emodule show like srtpperres_srtp, senza il quale l'audio cifrato non si negozia. Su Asterisk 21 e successivichan_sipnon esiste più: se il tuo dialplan lo usa ancora, il trunk verso Aptiva va comunque fatto conchan_pjsip. - Un resolver DNS funzionante: il server Aptiva è indicato per nome.
Su quale protocollo scegliere vale la regola generale: IAX2 per la famiglia Asterisk, perché ha meno modi di fallire in silenzio. SIP su TLS resta disponibile se preferisci standard IETF e un certificato verificabile. Sui codec (G.711 A-law e μ-law, e perché non Opus) vale la guida generale, sezione Codec G.711 e perché non Opus.
iax.conf: il trunk IAX2 (consigliato)#
Il trunk IAX2 verso Aptiva è una registrazione nella sezione [general] più una sezione friend il cui nome è esattamente <UTENTE>. Con type=friend la stessa sezione vale da peer (le chiamate che mandi ad Aptiva) e da user (i trasferimenti che Aptiva manda a te): il trunk deve accettare anche le chiamate che arrivano da Aptiva, ed è la direzione che un semplice type=peer non coprirebbe.
; /etc/asterisk/iax.conf
[general]
; La porta locale resta quella predefinita: non va aperta in ingresso,
; perché la registrazione la apre Asterisk verso Aptiva.
register => <UTENTE>:<PASSWORD>@<SERVER>:<PORTA>
; Lascia attive le protezioni predefinite descritte in "IAX2 Security"
; (validazione dei call token e limiti di chiamata): non serve toccarle.
; Il sample di Asterisk contiene una sezione [guest] per chiamate non autenticate:
; se è presente nel tuo file, rimuovila o assegnale un contesto che non fa nulla.
[<UTENTE>]
; Il nome della sezione DEVE essere l'utente che ti abbiamo emesso:
; è l'identificativo con cui Aptiva autentica il tuo Asterisk in entrambe le direzioni.
type = friend
host = <SERVER>
port = <PORTA>
username = <UTENTE>
secret = <PASSWORD>
; Contesto dedicato ai trasferimenti dell'agente: vedi extensions.conf più sotto.
context = from-aptiva
; La cifratura è forzata dalla parte di Aptiva: senza queste due righe
; il trunk non si collega in chiaro, non si collega affatto.
encryption = yes
forceencryption = yes
requirecalltoken = yes
; Solo G.711, A-law per primo (Italia).
disallow = all
allow = alaw
allow = ulaw
; Tiene viva la mappatura NAT e ti dice se il peer risponde.
qualify = yes
Le righe da capire, oltre a quelle commentate: context=from-aptiva decide dove atterrano le chiamate provenienti da Aptiva, cioè i trasferimenti verso i tuoi interni; encryption e forceencryption sono obbligatorie perché la cifratura IAX2 (AES, con chiave derivata dalla password) è richiesta dal nostro lato; requirecalltoken=yes mantiene la validazione dei call token che la documentazione Asterisk raccomanda, e Aptiva la supporta.
Dopo iax2 reload, il comando iax2 show registry deve mostrare Registered e iax2 show peers il peer <UTENTE> con stato OK e un tempo di risposta.
pjsip.conf: il trunk SIP su TLS con SRTP#
Il trunk SIP verso Aptiva è composto da sei oggetti: un transport TLS, una registration in uscita, un auth, un aor, un endpoint con SRTP obbligatorio e un identify sull'indirizzo di Aptiva. SIP in chiaro e audio non cifrato non sono accettati.
; /etc/asterisk/pjsip.conf
;--- Trasporto TLS -------------------------------------------------------
; PJSIP crea un trasporto TLS solo se gli indichi un certificato. Aptiva NON
; richiede un certificato client: un certificato autofirmato va benissimo.
; La porta di bind è locale e non va aperta in ingresso.
[transport-tls]
type = transport
protocol = tls
bind = 0.0.0.0:5061
cert_file = /etc/asterisk/keys/asterisk.crt
priv_key_file = /etc/asterisk/keys/asterisk.key
; sslv23: nonostante il nome negozia la versione TLS più alta disponibile
; (TLS 1.2 o 1.3, le due che il collegamento accetta). tlsv1_2 funziona ma
; esclude TLS 1.3; il predefinito si ferma a TLS 1.0, che Aptiva rifiuta.
method = sslv23
; Verifica il certificato pubblico di Aptiva con la CA di sistema (percorso Debian).
; Se preferisci un file singolo, usa ca_list_file: il file deve contenere la
; radice ISRG Root X1 di Let's Encrypt (per esempio il bundle delle CA di
; sistema), non il certificato del nostro server, che si rinnova da solo.
verify_server = yes
ca_list_path = /etc/ssl/certs
; Dietro NAT, decommenta e adatta (vedi la guida ufficiale sul NAT):
; local_net = 192.168.1.0/24
; external_signaling_address = <IL_TUO_IP_PUBBLICO_O_FQDN>
; external_media_address = <IL_TUO_IP_PUBBLICO_O_FQDN>
;--- Registrazione in uscita ---------------------------------------------
[aptiva]
type = registration
transport = transport-tls
outbound_auth = aptiva
server_uri = sip:<SERVER>:<PORTA>;transport=tls
client_uri = sip:<UTENTE>@<SERVER>
retry_interval = 60
forbidden_retry_interval = 60
expiration = 3600
;--- Credenziali ---------------------------------------------------------
[aptiva]
type = auth
auth_type = userpass
username = <UTENTE>
password = <PASSWORD>
;--- Dove mandare le chiamate verso Aptiva ------------------------------
; La parte utente del contatto la imposta il Dial: Dial(PJSIP/8000@aptiva).
[aptiva]
type = aor
contact = sip:<SERVER>:<PORTA>;transport=tls
qualify_frequency = 60
;--- L'endpoint ----------------------------------------------------------
[aptiva]
type = endpoint
transport = transport-tls
; Contesto dedicato ai trasferimenti dell'agente: vedi extensions.conf più sotto.
context = from-aptiva
outbound_auth = aptiva
aors = aptiva
disallow = all
allow = alaw
allow = ulaw
; Audio cifrato obbligatorio. Con la cifratura "opzionale" (optimistic=yes)
; la chiamata fallisce: sul collegamento non esiste un ripiego in chiaro.
media_encryption = sdes
media_encryption_optimistic = no
; NAT: quasi sempre corretti per un trunk verso un servizio su Internet.
rtp_symmetric = yes
force_rport = yes
rewrite_contact = yes
direct_media = no
; NON impostare from_user né riscrivere il caller ID: nel From viaggia
; il numero di chi chiama, ed è ciò che Aptiva deve ricevere intatto.
;--- Riconoscere le chiamate che arrivano da Aptiva ---------------------
; Il trunk deve accettare anche le chiamate che arrivano da Aptiva, cioè i
; trasferimenti dell'agente. Portano nel From il numero del chiamante originale,
; non il nostro utente: Asterisk deve associarli all'endpoint per indirizzo,
; altrimenti li scarta come "No matching endpoint found".
[aptiva]
type = identify
endpoint = aptiva
match = <INDIRIZZO_APTIVA>
Il certificato autofirmato, se non ne hai già uno, si genera con OpenSSL in un comando (openssl req -x509 -newkey rsa:2048 -nodes -days 3650 -keyout asterisk.key -out asterisk.crt -subj "/CN=pbx"); i file devono essere leggibili dall'utente con cui gira Asterisk. verify_server=yes fa controllare il certificato di Aptiva contro le CA di sistema: il nostro certificato è pubblico, emesso da Let's Encrypt e rinnovato automaticamente, quindi il collegamento risulta autenticato oltre che cifrato.
Un'avvertenza sui trasporti: le modifiche a un transport esistente non si applicano con pjsip reload se allow_reload è a no (il predefinito). Un trasporto nuovo nasce con il reload; per modificarne uno esistente riavvia Asterisk.
Dopo pjsip reload, pjsip show registrations deve mostrare Registered, pjsip show endpoint aptiva lo stato Not in use e pjsip show identifies la regola con <INDIRIZZO_APTIVA>.
extensions.conf: il contesto che riceve i trasferimenti#
Le chiamate che arrivano dal trunk Aptiva sono i trasferimenti dell'agente verso i tuoi interni, e atterrano nel contesto indicato nella sezione IAX2 o nell'endpoint SIP. Quando l'agente trasferisce, Aptiva compone verso il tuo Asterisk il numero della voce di rubrica così com'è (da 1 a 5 cifre, per esempio 201), con il numero del chiamante originale come caller ID: chi risponde lo vede sul display. Il contesto è uno solo, lo stesso per IAX2 e per SIP, e contiene l'elenco degli interni e dei gruppi che l'agente può far squillare.
; /etc/asterisk/extensions.conf
;--- Gli interni che l'agente può far squillare --------------------------
; Il context della sezione [<UTENTE>] in iax.conf e dell'endpoint in pjsip.conf.
[from-aptiva]
exten => _20[1-9],1,NoOp(Trasferimento dall'agente vocale AI verso ${EXTEN} per il chiamante ${CALLERID(num)})
same => n,Dial(PJSIP/${EXTEN},30)
same => n,Hangup()
; Un gruppo: la voce di rubrica "7" fa squillare insieme due telefoni.
exten => 7,1,NoOp(Trasferimento dall'agente vocale AI al gruppo segreteria)
same => n,Dial(PJSIP/201&PJSIP/202,30)
same => n,Hangup()
Il pattern _20[1-9] copre gli interni da 201 a 209: adattalo ai tuoi. Se i telefoni sono ancora su chan_sip o su un altro canale, cambia la tecnologia nel Dial, non il contesto. Il timeout di 30 secondi qui è un secondo livello: il tempo di squillo lo governa l'agente (predefinito 30 secondi, configurabile), come spiegato nella guida sul trasferimento assistito. Se nessuno risponde, l'agente riprende la conversazione con il chiamante seguendo il messaggio di mancata risposta: impostalo sempre, insieme all'istruzione di presentazione.
Due attenzioni sulle voci di rubrica:
- Segreteria e inoltri contano come risposta. Se sull'interno scatta una casella vocale o un inoltro prima della fine del tempo di squillo dell'agente, per l'agente «ha risposto qualcuno»: fa la presentazione alla segreteria ed esce. Tieni il tempo di squillo dell'agente più corto di quello della segreteria o dell'inoltro dell'interno.
- Un gruppo in rubrica non deve ricadere sull'agente. Se il gruppo
7dell'esempio, quando nessuno risponde, prosegue con unDialverso il trunk Aptiva, il trasferimento torna all'agente, che presenta la chiamata a un'altra sessione dell'agente. Se ti servono entrambi i ruoli — gruppo raggiungibile dall'agente e gruppo che ricade sull'agente — usa due gruppi distinti.
Due accortezze in from-aptiva: tienilo separato dal contesto dei tuoi interni e dalle rotte in uscita, come faresti con il trunk di qualunque operatore (le chiamate in uscita dell'agente, se le attivi, passano da un contesto dedicato: vedi più sotto), e non riscrivere CALLERID prima del Dial, altrimenti chi risponde perde il numero del chiamante. Se il tuo dialplan applica regole di riscrittura del caller ID sulle chiamate in ingresso, sono quelle a decidere cosa compare sul display.
Mandare una chiamata all'agente con Dial#
Una chiamata passa all'agente vocale AI con un Dial verso il trunk Aptiva dal punto del dialplan che preferisci. Il numero composto non è vincolante: la chiamata arriva comunque al tuo agente, quindi qui usiamo 8000 solo come esempio.
; IAX2: tecnologia/peer/numero
exten => s,1,Dial(IAX2/<UTENTE>/8000,60)
; SIP: numero@endpoint (la parte utente sostituisce quella del contatto dell'AOR)
exten => s,1,Dial(PJSIP/8000@aptiva,60)
Gli scenari tipici, sul contesto in cui il tuo operatore consegna le chiamate:
[from-operatore]
; 1) Tutte le chiamate al numero collegato vanno all'agente.
exten => 0432000000,1,NoOp(Chiamata da ${CALLERID(num)} all'agente vocale AI)
same => n,Dial(IAX2/<UTENTE>/8000,60)
same => n,Hangup()
; 2) Prima squillano i telefoni; se nessuno risponde entro 20 secondi, l'agente.
exten => 0432000001,1,Dial(PJSIP/201&PJSIP/202,20)
same => n,Dial(IAX2/<UTENTE>/8000,60)
same => n,Hangup()
; 3) In orario d'ufficio i telefoni, fuori orario l'agente.
exten => 0432000002,1,GotoIfTime(09:00-18:00,mon-fri,*,*?ufficio:agente)
same => n(ufficio),Dial(PJSIP/201&PJSIP/202,30)
same => n,Goto(agente)
same => n(agente),Dial(IAX2/<UTENTE>/8000,60)
same => n,Hangup()
; 4) Da un menu vocale: l'opzione 3 passa all'agente.
[ivr-principale]
exten => 3,1,Dial(IAX2/<UTENTE>/8000,60)
same => n,Hangup()
Con SIP sostituisci IAX2/<UTENTE>/8000 con PJSIP/8000@aptiva. In tutti i casi il caller ID non va toccato: Aptiva riceve il numero del chiamante dal caller ID (IAX2) o dal From (SIP), lo usa per riconoscere il contatto e lo ripresenta all'interno in caso di trasferimento. Un Set(CALLERID(num)=...) prima del Dial sostituirebbe il numero del chiamante: l'agente non saprebbe più chi chiama e, se il valore non è un numero di telefono, Aptiva rifiuta la chiamata.
Nello scenario «tutte le chiamate», instrada altrove le chiamate con numero nascosto — per esempio ai telefoni, con un controllo sul CALLERID(num) prima del Dial — perché oggi l'agente non le gestisce: vengono rifiutate, e dal centralino risultano occupato. Puoi collegare più numeri, ognuno con il suo agente: ogni numero è un collegamento con le proprie credenziali, quindi una sezione (o un endpoint) distinta, ed è il trunk usato nel Dial a decidere quale agente risponde, non il numero composto.
Una precisazione che ti risparmia una prova fallita: una chiamata da un tuo interno verso 8000 non è il modo per provare il collegamento. Di default l'agente risponde alle chiamate che arrivano dall'esterno e che il centralino gli passa; l'interno che chiama direttamente l'agente è disponibile su richiesta. Prova chiamando il numero collegato da un telefono esterno.
Chiamate in uscita dal tuo numero#
Con il trunk collegato, l'agente vocale AI può anche chiamare in uscita mostrando il numero della tua azienda: le campagne verso i tuoi contatti e i richiami annotati durante una conversazione. La chiamata arriva al tuo Asterisk dal trunk Aptiva, con il numero da chiamare in formato internazionale (per esempio +393331234567), ed è il tuo Asterisk a farla uscire dal trunk del tuo operatore, come una chiamata fatta da un tuo interno, con il tuo piano tariffario. Il contesto from-aptiva della sezione precedente, da solo, non la fa uscire: l'uscita si abilita con le righe qui sotto. Il quadro generale — cosa serve e perché — è nella guida generale, sezione Chiamate in uscita dal tuo numero.
Se preferisci farla da te, qui sotto trovi la configurazione completa. È in due parti, tutte in extensions.conf. Poche righe nel contesto from-aptiva, accanto alle regole degli interni, che mandano a un contesto dedicato solo i numeri con +39 di cellulari, fissi e VoIP italiani, una riga per lunghezza. E il contesto aptiva-uscita, che presenta numero e nome della tua azienda, pone un tetto alle chiamate contemporanee dell'agente e compone verso il trunk del tuo operatore. Vale per IAX2 e per SIP allo stesso modo, perché entrambi atterrano in from-aptiva.
Oltre ai soliti segnaposto ne servono tre: <NUMERO_AZIENDA>, il numero da presentare a chi riceve, nel formato che il tuo operatore accetta; <NOME_AZIENDA>, il nome da presentare; <TRUNK_OPERATORE>, il nome dell'endpoint PJSIP del tuo operatore.
; /etc/asterisk/extensions.conf
[from-aptiva]
; Le regole degli interni restano quelle della sezione precedente. Accanto, aggiungi:
; cellulari a 9 e 10 cifre
exten => _+393XXXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+393XXXXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
; fissi da 6 a 11 cifre
exten => _+390[1-9]XXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+390[1-9]XXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+390[1-9]XXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+390[1-9]XXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+390[1-9]XXXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
exten => _+390[1-9]XXXXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
; numeri VoIP (serie 55)
exten => _+3955XXXXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
; numeri verdi, facoltativi: decommenta solo se ti servono
;exten => _+39800XXXXXX,1,Goto(aptiva-uscita,${EXTEN},1)
;exten => _+39803XXX,1,Goto(aptiva-uscita,${EXTEN},1)
;--- L'uscita verso il trunk del tuo operatore -----------------------------
[aptiva-uscita]
exten => _+39X.,1,Set(GROUP()=aptiva-uscita)
same => n,GotoIf($[${GROUP_COUNT(aptiva-uscita)} > 2]?pieno)
same => n,Set(CALLERID(num)=<NUMERO_AZIENDA>)
same => n,Set(CALLERID(name)=<NOME_AZIENDA>)
same => n,Dial(PJSIP/${EXTEN:3}@<TRUNK_OPERATORE>,60)
same => n,Hangup()
same => n(pieno),Hangup(34)
Ogni scelta ha un motivo:
- Cifre esatte, una riga per lunghezza. Sono più righe di quante ne servirebbero con un pattern come
_+393X., e la differenza è voluta: il punto finale accetta qualunque carattere e qualunque lunghezza, mentre con le cifre esatte (Xè una cifra qualsiasi,[1-9]una cifra da 1 a 9) il numero che arriva alDialè sempre fatto solo di cifre, della lunghezza giusta, e per questo non serve nessuna funzione di pulizia. Escono solo cellulari, fissi e VoIP italiani, mai numeri esteri né numerazioni che iniziano per 1 o per 8, come 144, 166, 892 e 899 (salvo i numeri verdi, se decommenti le righe facoltative); lo0[1-9]esclude anche lo00del prefisso internazionale. Un numero che non corrisponde a nessuna riga non trova un'estensione infrom-aptivae viene rifiutato. L'unica numerazione speciale con la forma di un fisso è lo 0878: i pattern non la distinguono, ma Aptiva non chiama numerazioni a sovrapprezzo, quindi dal nostro lato non arriva. - Un contesto dedicato. Il trunk Aptiva raggiunge verso l'esterno solo
aptiva-uscita, che compone un solo trunk e non include nulla: non passa dal contesto dei tuoi interni, dove stanno tutte le rotte in uscita e i codici di servizio. GROUP_COUNT. In Asterisk non c'è un Maximum Channels da impostare in un'interfaccia:GROUPeGROUP_COUNTsono il modo standard per limitare le chiamate contemporanee. La chiamata corrente è già contata, quindi> 2ne ammette al massimo due; oltre, la chiamata cade con causa 34, congestione. Il contatore vede solo le chiamate dell'agente che passano daaptiva-uscita, non quelle dei tuoi interni né quelle in arrivo dei tuoi clienti, che usano le stesse linee: tieni il valore sotto il numero di linee del tuo contratto, con un margine che lasci sempre linee libere agli interni e alle chiamate in arrivo anche durante una campagna.- Numero e nome aziendali, sempre. L'identificativo con cui una chiamata arriva dal trunk Aptiva non è sempre quello da presentare fuori: un trasferimento verso un numero esterno, per esempio, porta il numero del chiamante originale, che serve sul display dei tuoi interni ma non può uscire sulla rete pubblica. Verso l'operatore parte sempre l'identità della tua azienda.
DialsenzaAnswerprima. La chiamata va risposta solo quando risponde chi è chiamato: con unAnswerprima delDiall'agente comincerebbe a parlare sopra lo squillo.
EXTEN:3 toglie il +39 prima di comporre, quindi l'operatore riceve il numero in formato nazionale (3331234567), come quando lo compone un tuo interno; se il tuo operatore vuole un altro formato, cambia solo quella parte del Dial, per esempio anteponendo 0039. Se il trunk del tuo operatore è IAX2, il Dial diventa IAX2/<TRUNK_OPERATORE>/ seguito dal numero.
Dopo dialplan reload, dialplan show from-aptiva deve mostrare le righe +39 accanto a quelle degli interni e dialplan show aptiva-uscita il contesto; durante una campagna group show channels elenca le chiamate del gruppo in corso.
La prima prova#
La prima chiamata di prova falla verso il tuo cellulare; se vuoi, la seguiamo insieme dal nostro lato. Sul display devono comparire il numero e il nome della tua azienda. Se qualcosa non torna, questi sono i sintomi tipici:
- La chiamata viene rifiutata e nel log compare
Extension '+39…' not found in context 'from-aptiva'. Le righe+39non sono nel contesto giusto, cioè quello indicato nella sezione IAX2 o nell'endpoint SIP, oppure il numero non è un cellulare, un fisso o un VoIP italiano della lunghezza prevista, e allora il rifiuto è quello voluto. - La chiamata cade subito con causa 34. Il limite del
GROUP_COUNTè raggiunto:group show channelsti dice da quali chiamate. - La chiamata non parte dal trunk dell'operatore.
<TRUNK_OPERATORE>non è il nome dell'endpoint (pjsip show endpoints), o l'operatore vuole il numero in un altro formato. - La chiamata esce con un numero diverso da quello dell'azienda. Mancano le due righe
CALLERIDprima delDial, oppure l'operatore non accetta il formato di<NUMERO_AZIENDA>.
Una configurazione sicura, in breve#
Fatta così, la configurazione apre al trunk Aptiva una sola via verso l'esterno e la tiene stretta: escono solo cellulari, fissi e VoIP italiani, della lunghezza giusta; escono con l'identità della tua azienda; passano da aptiva-uscita, quindi dal tetto del GROUP_COUNT. Due accortezze restano dalla tua parte, e valgono per qualunque trunk da cui si può chiamare fuori:
- Le credenziali del collegamento. Con le chiamate in uscita attive, autorizzano chiamate che escono dalle tue linee a tue spese: trattale come quelle del tuo operatore e, al minimo dubbio, chiedici di rigenerarle.
- Il trasporto del trunk. Con un trunk SIP il tuo Asterisk riconosce le chiamate di Aptiva dall'indirizzo, con l'
identify, quindi nessun trasporto SIP in chiaro, UDP o TCP, deve essere raggiungibile da Internet. Se puoi scegliere, usa IAX2: ogni chiamata è autenticata con la password della sezione, e la domanda non si pone.
Comandi CLI di verifica e diagnosi#
Da asterisk -rvvv questi comandi ti dicono in pochi secondi se il collegamento è su e, se non lo è, dove si ferma.
| Cosa verificare | IAX2 | SIP (PJSIP) |
|---|---|---|
| La registrazione verso Aptiva | iax2 show registry → Registered | pjsip show registrations → Registered |
| Il peer/endpoint risponde | iax2 show peers → OK (NN ms) | pjsip show endpoint aptiva → Not in use; pjsip show aor aptiva con un contatto Avail |
| L'associazione delle chiamate in arrivo | (implicita nel nome della sezione) | pjsip show identifies → match con <INDIRIZZO_APTIVA> |
| Il trasporto TLS è caricato | — | pjsip show transports (mostra la configurazione, non lo stato del listener) |
| Forzare una nuova registrazione | iax2 reload | pjsip send register aptiva |
| Il contesto dei trasferimenti | dialplan show from-aptiva | come IAX2 |
| Le chiamate in uscita dell'agente | dialplan show aptiva-uscita; group show channels | come IAX2 |
| Traccia di una chiamata | iax2 set debug on (poi off) | pjsip set logger on (poi off); rtp set debug on per l'audio |
| Canali attivi | core show channels verbose | core show channels verbose |
I sintomi con la loro firma nei log:
- Registrazione
RejectedoRequest Sentche non progredisce. Credenziali o porta errate; su IAX2, cifratura non configurata (dal lato Aptiva è forzata); su SIP, trasporto TLS non caricato o<SERVER>non risolto. Unopenssl s_client -connect <SERVER>:<PORTA>dalla macchina di Asterisk ti dice se la connessione TLS si apre e quale certificato presenta. No matching endpoint foundsu un INVITE in arrivo. Manca la sezioneidentify, o ilmatchnon è<INDIRIZZO_APTIVA>: Asterisk non sa a quale endpoint attribuire il trasferimento e lo scarta.- La chiamata verso Aptiva viene rifiutata subito. Il numero del chiamante è stato sostituito da un
Set(CALLERID(...))nel dialplan con un valore che non è un numero di telefono; oppure la chiamata è con numero nascosto (oggi l'agente non le gestisce: dal centralino risultano occupato); oppure è una prova fatta da un interno, disponibile su richiesta. Extension ... not foundosent into invalid extensioninfrom-aptiva. L'agente ha composto una voce di rubrica che il contesto non prevede: aggiungi il pattern o correggi la rubrica.- La chiamata SIP cade con causa
BUSY/CONGESTIONsenza audio. Negoziazione SRTP fallita: controllamedia_encryption=sdes,media_encryption_optimistic=no(con la cifratura opzionale la chiamata fallisce, non parte in chiaro) e cheres_srtpsia caricato (module show like srtp). - Il trasferimento torna all'agente. Il gruppo in rubrica, quando nessuno risponde, ricade sul trunk Aptiva: usa un gruppo distinto per il fallback verso l'agente.
- Una chiamata in uscita dell'agente non parte o esce con un numero diverso da quello dell'azienda. Nell'ordine: le righe
+39sono nel contesto del trunk (dialplan show from-aptiva); il numero è un cellulare, un fisso o un VoIP italiano della lunghezza prevista; il tetto delGROUP_COUNTnon è raggiunto (causa 34);<TRUNK_OPERATORE>è il nome giusto; le due righeCALLERIDci sono. I sintomi sono nella sezione sulle chiamate in uscita; se non torna, scrivici con l'ora della prova. - Audio a senso unico o assente. Vale la sezione Problemi comuni della guida generale; su PJSIP controlla
rtp_symmetric,force_rport,rewrite_contacte le righeexternal_*/local_netdel trasporto. Su IAX2 il problema non si presenta, perché l'audio viaggia sulla stessa porta della segnalazione.
Sicurezza del trunk in Asterisk#
Il collegamento è cifrato in entrambe le direzioni ed è il tuo Asterisk a collegarsi ad Aptiva, non il contrario: non c'è nessuna porta da aprire. Poche accortezze completano il quadro.
- Il contesto del trunk raggiunge gli interni previsti e resta separato dalle rotte in uscita, come quello di qualunque operatore. Con le chiamate in uscita attive, l'unica via verso l'esterno è
aptiva-uscita, che lascia uscire solo cellulari, fissi e VoIP italiani con l'identità della tua azienda: vedi Una configurazione sicura, in breve. - Niente SIP in chiaro esposto su Internet. Verso Aptiva si usa solo TLS e, se puoi scegliere, preferisci IAX2, dove ogni chiamata è autenticata con la password della sezione.
- Firewall. Asterisk non ha un firewall integrato. Non servono regole in ingresso: la registrazione IAX2 e la connessione TLS le apre il tuo Asterisk, e l'audio segue le stesse mappature. Se sull'host gira
fail2bano un equivalente sui log di Asterisk, aggiungi all'ignoreip<INDIRIZZO_APTIVA>(SIP) oppure il nome o l'indirizzo di<SERVER>(IAX2): da lì arrivano i trasferimenti e i controlli del trunk, e un blocco li farebbe fallire. - Credenziali. Le rilascia Aptiva, distinte per ogni collegamento, con password lunga e casuale; se sospetti un problema le rigeneriamo su richiesta. Il resto è nella guida generale, sezione Sicurezza del collegamento.
Passi successivi#
- Richiedi le credenziali del collegamento indicando il protocollo (IAX2 consigliato), la versione di Asterisk, il numero da collegare e gli interni o i gruppi a cui l'agente deve poter trasferire. L'attivazione non ha costi.
- Leggi la guida generale al collegamento per requisiti, sicurezza, costi e problemi comuni, e la guida sul trasferimento assistito per rubrica, tempo di squillo, presentazione e messaggio di mancata risposta.
- Scopri cosa può fare l'agente una volta collegato nella pagina Centralino AI.
Fonti
- 1.Asterisk — Asterisk Versions (stato di supporto di 20, 21, 22 e 24)
- 2.Asterisk — What's new in Asterisk 21 (rimozione di chan_sip)
- 3.Asterisk — Module Deprecations (chan_iax2 non è deprecato)
- 4.Asterisk — res_pjsip Configuration Examples (trunk SIP con registrazione in uscita)
- 5.Asterisk — res_pjsip: opzioni di configurazione
- 6.Asterisk — Dialing PJSIP Channels
- 7.Asterisk — Configuring res_pjsip to work through NAT
- 8.Asterisk — IAX2 Security
- 9.Asterisk — iax.conf.sample (repository ufficiale)
- 10.RFC 5456 — IAX: Inter-Asterisk eXchange Version 2
A cura di Redazione Aptiva
Costruiamo e gestiamo in casa la piattaforma di agenti vocali AI di Aptiva: queste guide nascono dall'esperienza diretta sul prodotto e sulle chiamate reali dei clienti.