Buonasera, dopo un po' di tentativi con differenti versioni di Asterisk, sono in grado di riprodurre in modo affidabile l'errore che ho descritto nel mio primo messaggio a partire dalla versione 20.5.0
Al contrario, da Asterisk 20.4.0 a ritroso l'errore di URI sul trunk per le chiamate in ingresso non si verifica.
Per il momento sono soddisfatto della configurazione che riporto a seguire, tuttavia se qualcuno avesse idee per tentare di scovare il problema sono a disposizione per fare tentativi.
Sistema e software
PBX
Utilizzo l'immagine container docker.io/izdock/izpbx-asterisk:20.16.9 che è basata su Rocky Linux 8 e comprende Asterisk 20.4.0 e FreePBX 16; con essa, utilizzo MariaDB alla esatta versione 10.11.4, come indicato dall'autore, tramite l'immagine docker.io/library/mariadb:10.11.4
Utilizzo Podman per eseguire i due container in un Pod, ma lo steso autore utilizza Docker Compose e documenta questo secondo caso d'uso.
Iliadbox
Per poter utilizzare un centralino virtuale su un dispositivo nella propria LAN, è necessario modificare le seguenti opzioni della Iliadbox:
- Parametri della Iliadbox (Modalità avanzata)
- (connessione internet) Configurazione IPv6
- (Generale) Firewall > Attiva il firewall IPv6: off
- (DHCPv6) Abilita il DHCPv6: ON
- (Telefonia) Cablato
- SIP > Attiva porta TEL su iliadbox Server: off
Nell'ultima schermata citata sarà inoltre possibile trovare i dati per configurare il trunk PJSIP
NOTA: subito dopo aver cambiato le impostazioni per la porta TEL e IPv6, io ho riavviato la Iliadbox.
Trunk PJSIP
Configurazione
Impostato come descritto da questo post; si noti che è necessario modificare sia le impostazioni di FreePBX dalle schede indicate, sia alcuni file di Asterisk.
Assumendo che il numero di telefono sia 07XXXX (senza il prefisso +39), il proxy sia proxy-voip-1.iliad.it e il dominio sia voip.iliad.it (questi dati sono accessibili dalla schermata "Cablato" della sezione "Telefonia" nei "Parametri della Iliadbox") segue un modello di trunk configurato:
- Connectivity
- Trunks
- Add Trunk > Add SIP (chan_pjsip) Trunk
- General
- Trunk name: Iliad
- Outbound CallerID: 07XXXX
- pjsip Settings
- General
- Username: 07XXXX
- Secret: password
- SIP Server: proxy-voip-1.iliad.it
- Advanced
- Qualify Frequency: 0
- Outbound Proxy: sip:proxy-voip-1.iliad.it\;lr
- Contact User: 07XXXX
- From Domain: voip.iliad.it
- From User: 07XXXX
- Client URI: sip:07XXXX@voip.iliad.it
- Server URI: sip:voip.iliad.it
- AOR Contact: sip:voip.iliad.it
Dopo aver apportato le seguenti modifiche, cliccare il bottone Submit in basso a destra della pagina, e una volta terminato il caricamento il bottone rosso Apply Config in alto a destra.
Una volta ricaricata la pagina web, sarà necessario modificare altri tre file di configurazione; per comodità riporto i comandi che ho usato da un sistema Fedora IoT con Podman installato:
Avviare una sessione di login all'interno del container di izPBX
podman exec -it nomedelcontainer bash
Spostarsi nella cartella di configurazione di Asterisk
cd /etc/asterisk
Modificare i tre file di configurazione, copiando e incollando i seguenti tre comandi
cat << EOF >> pjsip.transports_custom_post.conf
[ipv6-udp]
type=transport
protocol=udp
bind=[::]:5060
allow_reload=no
tos=cs3
cos=3
EOF
cat << EOF >> pjsip.endpoint_custom_post.conf
[Iliad](+type=endpoint)
transport=ipv6-udp
EOF
cat << EOF >> pjsip.registration_custom_post.conf
[Iliad](+type=registration)
transport=ipv6-udp
EOF
Arrivati a questo punto, sarà necessario riavviare il container dell'applicazione Asterisk/FreePBX; nel mio caso, riavvio il Pod izPBX che contiene sia il container che l'applicazione (il comando preciso varia in base al modo in cui viene gestito il container e allo strumento).
Prova e rimedi
Una volta riavviato il container di izPBX, ho controllato la situazione del trunk eseguendo una sessione all'interno del container e agganciandomi alla CLI di Asterisk coi seguenti comandi:
podman exec -it nomedelcontainer bash
asterisk -rvvvv
pjsip set logger on
NOTA: Il terzo comando potrebbe andare in errore: attendere che il servizio di Asterisk sia completamente disponibile, questo sarà denotato dalla riga "Asterisk Ready."
Se notate dei messaggi di registrazione fallita per il trunk, controllate che esso sia in ascolto davvero su IPv6 col seguente comando:
pjsip show endpoints
Se l'indirizzo di ascolto risulta 0.0.0.0:5060 invece di [::]:5060, ci deve essere un errore nei file di configurazione o nel percorso dove sono stati posizionati, oppure il container non è stato riavviato correttamente.
Avrete conferma che il trunk si è correttamente registrato se lo stato riportato dal seguente comando sarà "Registered":
pjsip show registrations
Ricevere chiamate
Per ricevere chiamate è necessario decidere come esse verranno instradate all'interno del sistema: nel caso si voglia collegare la chiamata con un dispositivo fisico, come un telefono IP, sarà necessario aggiungere solamente una estensione, e poi configurare l'accesso su tale dispositivo.
Per quanto mi riguarda, descrivo a seguire il mio caso specifico, per il quale vogliamo far squillare i nostri cellulari tramite client SIP installati su di essi e connessi al centralino:
nel caso di una chiamata in arrivo, tutti i cellulari squilleranno; in assenza di risposta, la chiamata sarà inoltrata a una casella vocale condivisa per poter lasciare un messaggio.
Estensioni
Una estensione rappresenta un dispositivo fisico o software, che può interagire col centralino ricevendo ed effettuando chiamate. Creiamo una estensione SIP nel modo seguente:
- Applications
- Extensions
- Quick Create Extension
- Extension Number: 301 (scegliere un numero maggiore di 199)
- Display Name: Asdrubale Temistocli
- Email Address: indirizzo@postaelet.it
- (Next)
- (Finish)
Cliccare Apply Config in alto a destra.
NOTA: Per creare la casella vocale condivisa, ho aggiunto una estensione virtuale e poi ho permesso l'accesso la sua casella vocale dalle altre estensioni.
Linphone
Come client SIP abbiamo selezionato Linphone: per effettuare l'accesso dall'app Android è suficiente scegliere di aggiungere un account SIP generico, inserire il numero estensione (301) come "Utente" e l'IP della macchina che esegue izPBX come "Dominio".
La password sarà visibile dalla scheda "General" per l'estensione appena aggiunta: per visualizzarla è necessario cliccare sul bottone con l'icona del foglio e matita a destra della riga dell'estensione, e spostare il cursore del mouse sulla casella di testo accanto all'etichetta "Secret"
NOTA: Potete effettuare un test di eco della voce chiamando il numero *43 dal client appena registrato, per confermare che tutto funzioni correttamente.
Registrazioni di sistema
Per poter collegare la chiamata al centralino prima di compiere qualunque instradamento, ho scelto qusto metodo sul quale sono aperto a suggerimenti: usare un annuncio che riproduce una registrazione di lunghezza nulla, e poi instrada la chiamata a un "Ring group".
In primo luogo, ho generato un file WAV vuoto col seguente comando:
ffmpeg -f lavfi -t 2 -i anullsrc -bsf noise=drop=1 vuoto.wav
Poi ho caricato il file nella sezione delle registrazioni:
- Admin
- System Recordings
- Add Recording
- Name: vuoto
- Description: Proxy per ring group
- Upload Recording (Browse) > selezionare il file vuoto generato
- Convert To: selezionare anche alaw
Ricordatevi di premere il bottone Submit in basso a destra, seguito dal bottone Apply Config in alto a destra, e attendete il caricamento.
Ring Group
Aggiungiamo il gruppo di estensioni da far squillare con l'oggetto Ring Group: prima di tutto, nel mio caso ho dovuto installare il relativo modulo; per farlo, seguire il percorso che riporto nei menù della pagina:
- Admin
- Module Admin
- Check Online cliccare il bottone
- (Applications) > Ring Groups espandere l'oggetto
- Action: (Download and Install)
- Process cliccare il bottone in basso a destra
A questo punto cliccare Confirm, poi attendere l'installazione e cliccare Return e infine cliccare Apply Config in alto a destra.
Aggiungiamo il Ring Group nel modo seguente:
- Applications
- Ring group
- Add Ring Group
- Ring Group Number: 400
- Group Description: Squilla tutte le estensioni
- Extension List: inserire numeri estensioni da far squillare separati da a capo
- Ring Time: 60
- Destination if no answer: Voicemail
- selezionare dal menu a tendina la casella vocale in cui ricevere i messaggi in caso di mancata risposta
Premere Submit in basso a destra, e poi Apply Config in alto a destra.
Annunci
Per poter innescare correttamente il Ring Group appena creato, aggiungiamo un annuncio che faccia da tramite verso di esso, usando la registrazione vuota creata in precedenza:
- Applications
- Announcements
- Add
- Description: Annuncio vuoto (proxy per ring group)
- Recording: vuoto
- Destination after Playback: Ring Groups
- 400 Squilla tutte le estensioni
Premere Submit in basso a destra, e poi Apply Config in alto a destra.
Rotte in ingresso
Finalmente inseriamo la rotta in ingresso che collegherà le chiamate esterne con le estensioni autenticate verso il centralino:
- Connectivity
- Inbound Routes
- Add Inbound Route
- General
- Description: Predefinita
- Set Destination: Announcements
- Annuncio vuoto (proxy per ring group)
Premere Submit in basso a destra, e poi Apply Config in alto a destra.
A questo punto potete già testare chiamando il vostro numero di linea fissa da un altro numero esterno, e verificare che le estensioni nel Ring Group squillino tutte.
Rotte in uscita
A concludere questa guida, riporto come ho configurato una rotta in uscita abbastanza permissiva che permetta di chiamare numeri di 3, 10 e 11 cifre, con o senza prefisso italiano:
- Connectivity
- Outbound Routes
- Add Outbound Route
- Route Settings
- Route Name: Nazionali
- Trunk Sequence for Matched Routes: Iliad
- Dial Patterns
- (solamente come match pattern)
1XX
+391XX
XXXXXXXXXX
+39XXXXXXXXXX
XXXXXXXXXXX
+39XXXXXXXXXXX
Premere Submit in basso a destra, e poi Apply Config in alto a destra.
NOTA: Potete provare ad esempio a chiamare il 177.
A disposizione per correzioni e spunti.