Dalla cornetta nera al centralino software che gira su un Raspberry Pi. SIP, Asterisk, FreePBX, telefoni IP, SIP trunk, NAT, sicurezza. Per chi non ne sa nulla e non vuole imparare come si modificano gli array in extensions.conf a mano.
"Ho letto la documentazione di Asterisk per due ore. Ora so come si manipolano le variabili nel dialplan, ma non come faccio a far squillare un telefono." — ogni sysadmin il primo giorno con Asterisk, prima di scoprire FreePBX.
Voce su Internet, anziché voce su filo di rame. Detto così sembra banale, e in effetti lo è.
VoIP = Voice over Internet Protocol. Significa spedire la voce come dati di rete (pacchetti IP), invece di mandarla come segnale analogico sui doppini di rame della vecchia rete telefonica (PSTN, "Public Switched Telephone Network").
Quando parli al microfono del telefono IP: il telefono campiona il tuo audio molte volte al secondo, lo trasforma in numeri, li mette in pacchetti, e li spara via Internet al destinatario. Dall'altra parte: il telefono ricostruisce l'audio dai pacchetti e te lo fa sentire dall'altoparlante. Tutto qui.
La PSTN classica è come la posta tradizionale: c'è un circuito fisico dedicato a te per tutta la durata della chiamata (la "linea"). Il VoIP è come l'email: i tuoi pacchetti voce sono buste che viaggiano in mezzo a milioni di altre buste sulla rete pubblica, riassemblate all'arrivo. Più flessibile, infinitamente più economico, con qualche complicazione tecnica in più (NAT, latenza, jitter).
Chiamate interne tra sedi remote = traffico Internet. Costo zero, ovunque nel mondo.
Lo stesso "interno 101" può squillare sul telefono in ufficio + smartphone + softphone sul laptop, contemporaneamente.
Il tuo "interno aziendale" funziona uguale che tu sia in ufficio, a casa, o in un coworking a Lisbona. Serve Internet, basta.
IVR ("digiti 1 per..."), code, registrazione chiamate, voicemail to email, calendari, integrazione CRM. Tutto software.
Da 5 a 5000 interni cambiano solo configurazione e licenze, non il cablaggio.
Centralino on-premise = i tuoi dati, le tue regole, niente "fornitore cloud che sa chi chiami".
Due protocolli: uno per organizzare la chiamata, uno per portare la voce. Più un codec per spremere i bit.
Una chiamata VoIP usa due flussi diversi sulla rete:
Il PBX nel mezzo serve a: (1) sapere "Bob si raggiunge a quell'indirizzo IP", (2) applicare regole (può chiamare?, è orario d'ufficio?), (3) raccontare la chiamata nei log/CDR. SIP è testuale e leggibile a occhio — spesso somiglia all'HTTP.
Un codec è un algoritmo che digitalizza e comprime la voce. Scelta classica:
| Codec | Bitrate | Qualità | Quando |
|---|---|---|---|
G.711 (a-law / µ-law) | ~64 kbps | Standard PSTN | LAN, fibra, tutto dove c'è banda. Default safe |
G.722 | ~64 kbps | HD voice (wideband) | Telefoni IP moderni interni alla LAN, ottima resa |
G.729 | ~8 kbps | Buona ma compressa | Linee lente, mobile, link satellite. Storicamente brevettato |
Opus | 6–510 kbps adattivo | Eccellente | WebRTC, qualunque scenario moderno. Royalty-free |
GSM | ~13 kbps | Da telefonino anni '90 | Compatibilità legacy, basso CPU |
iLBC | ~13-15 kbps | Buona, robusto a packet loss | Reti con perdite di pacchetti |
Quando premi i tasti durante una chiamata ("digita 1 per assistenza") il telefono manda i tasti. Tre modi:
Quando IVR / voicemail "non riconosce i tasti" — quasi sempre un mismatch DTMF tra i due lati.
Il "centralino" dell'azienda. Da scatola metallica grigia a software su un server.
PBX = Private Branch eXchange. È il centralino telefonico privato di un'azienda: gestisce le chiamate interne tra gli interni (es. "100 chiama 101") e fa da gateway verso la rete pubblica per chiamate in entrata e in uscita.
Nel mondo PSTN classico era una scatola hardware enorme appesa al muro, con cavi RJ-11 dappertutto. Nel mondo VoIP è un software (Asterisk, FreePBX, 3CX, Cisco CallManager, ...) che gira su un server o un cloud.
"100 chiama 101" → squilla telefono di Bob. "100 chiama 0039061234567" → esce sul SIP trunk del provider.
Registra messaggi quando nessuno risponde, manda email con il file audio allegato.
"Premi 1 per amministrazione, 2 per supporto...". Auto-attendant che smista le chiamate in entrata.
Call center base: le chiamate si accodano, vengono distribuite agli agenti liberi, musica d'attesa.
"Quando chiama, squilla a 5 telefoni in parallelo": chi risponde prima vince.
Fuori orario d'ufficio → voicemail. Nel weekend → messaggio di chiusura.
Salva le chiamate (con preavviso legale!) per qualità, training, compliance.
Call Detail Records: chi ha chiamato chi, quando, per quanto, esito. Per fatturazione e analisi.
Pensa al PBX come al portinaio di un palazzo: smista le visite in entrata (chiamate esterne), conosce chi sta in quale stanza (interni), inoltra (transfer), prende messaggi quando non c'è nessuno (voicemail), tiene un registro di chi entra ed esce (CDR). Asterisk è quel portinaio — molto programmabile e che lavora 24/7 senza pausa caffè.
Open source, scritto in C, dal 1999. Potente come pochi, scomodo come tanti.
Asterisk è un framework PBX open source nato nel 1999 da Mark Spencer (che fondò Digium, poi acquisita da Sangoma nel 2018). È scritto in C, gira su Linux/BSD/macOS, è GPLv2 con opzioni commerciali per moduli specifici.
Non è "un centralino chiavi-in-mano": è un toolkit per costruire centralini. Ti dà i mattoni (channel driver, applicazioni dialplan, codec, gateway), tu li componi nei file di configurazione. Risultato: infinitamente flessibile, ma anche infinitamente facile da configurare male.
| Componente | Cosa è |
|---|---|
chan_pjsip | Driver SIP moderno (basato su PJSIP), default da Asterisk 12+. Sostituisce chan_sip (legacy, rimosso in Asterisk 21) |
chan_iax2 | Driver IAX2 (Inter-Asterisk eXchange), protocollo nativo Asterisk, NAT-friendly. Niche |
| Dialplan | Il programma che descrive cosa succede a ogni chiamata. Vive in extensions.conf. Linguaggio dedicato |
| AGI | Asterisk Gateway Interface. Esegue script esterni (Python, Bash, PHP) durante una chiamata. Stile CGI vintage |
| AMI | Asterisk Manager Interface. TCP socket 5038 per pilotare Asterisk da fuori (originate chiamate, monitorare eventi) |
| ARI | Asterisk REST Interface. API REST + WebSocket moderne, da Asterisk 12+. Per app esterne complesse |
Il "programma" che dice ad Asterisk cosa fare quando arriva una chiamata. Sintassi minimale ma propria, con context, extension, priority, application:
; Quando l'interno 100 chiama 101...
[from-internal]
exten => 101,1,Dial(PJSIP/101,30) ; ring 30 secondi
same => n,Voicemail(101@default,u) ; va in voicemail "unavailable"
same => n,Hangup()
; Quando l'interno chiama un numero esterno (qualunque 9+digit)
exten => _9XXXXXXXXX,1,NoOp(Outbound: ${EXTEN:1})
same => n,Dial(PJSIP/${EXTEN:1}@my-sip-trunk,60)
same => n,Hangup()
[from-trunk]
; Quando arriva una chiamata dal trunk, mandala all'IVR
exten => s,1,Answer()
same => n,Goto(ivr-main,s,1)
Niente paura: con FreePBX non scriverai questo a mano — la GUI genera tutto. Ma sapere che esiste aiuta a leggere i log quando le cose vanno male.
Asterisk con una web UI sopra. Stesse capacità, 1/10 del dolore.
FreePBX è un frontend web per Asterisk: web UI in PHP che genera i file di configurazione di Asterisk in base a quello che clicchi. Tu lavori nella web UI, FreePBX si occupa di tradurre il tuo "voglio un IVR che..." in extensions.conf, pjsip.conf, e amici.
Nato come progetto community, ora di proprietà di Sangoma (la stessa azienda che possiede Asterisk). Licenza GPLv3, core 100% open source. Moduli aggiuntivi a pagamento esistono (Endpoint Manager Pro, CRM Link, Conference Pro) ma il core copre il 90% dei bisogni reali.
Se Asterisk è il motore di un'auto (pistoni, valvole, iniettori), FreePBX è il cruscotto e i pedali: l'auto va con o senza, ma senza il cruscotto guidare diventa un esercizio per ingegneri. FreePBX non sostituisce Asterisk: lo rende usabile.
Crei un interno (numero + password SIP + email per voicemail) in 30 secondi. FreePBX genera pjsip.conf ed entry voicemail.
Aggiungi un SIP trunk verso il provider esterno: indirizzo, username, password, codec. La GUI lo registra e ti dice se funziona.
"Quando arriva una chiamata sul numero X, mandala a Y" (IVR, extension, voicemail, queue). Drag & drop concettuale.
"Quando un interno digita 9, ruoti la chiamata sul trunk-pollidori". Pattern matching e dial rules.
Albero IVR multi-livello dalla UI: "1 per amministrazione, 2 per supporto, ...". Senza scrivere righe di dialplan.
Code per il call center: strategy (ringall, leastrecent, fewestcalls), max wait, agent priority, music on hold.
Carichi file audio per musica d'attesa. Per categoria (corp / sales / supporto).
"Fuori orario", "weekend", "festività specifiche". Calendar-based routing.
Backup completo della config + voicemail su file/FTP/S3. Restore in 5 minuti su un nuovo server.
Più opzioni per installarlo:
apt, integrazione naturale con arx/nomina/missus sullo stesso host se vuoi.
Asterisk + PHP + MariaDB + Apache. Quattro pezzi, ben separati, su una sola macchina.
| Componente | Ruolo | Porta |
|---|---|---|
| Asterisk | Il "motore PBX". Gestisce SIP, RTP, dialplan, voicemail, queue | 5060/udp (SIP), 10000-20000/udp (RTP), 5038/tcp (AMI) |
| Apache + PHP | Web server della UI FreePBX. Genera config Asterisk | 80/tcp (HTTP), 443/tcp (HTTPS) |
| MariaDB | DB per config FreePBX, CDR, state delle queue | 3306/tcp (locale) |
| fail2ban | Ban di IP che falliscono autenticazione SIP/SSH | — |
| postfix/exim | MTA locale per voicemail-to-email | 25/tcp (locale) |
/etc/asterisk/ # config Asterisk generati da FreePBX
pjsip.conf, extensions.conf, voicemail.conf, queues.conf, ...
*_custom_post.conf # override manuali a prova di rigenerazione
/var/lib/asterisk/
sounds/ # prompt vocali (lingua, IVR, errori)
moh/ # music on hold
agi-bin/ # script AGI custom
/var/spool/asterisk/
voicemail/default/<ext>/ # caselle vocali
monitor/ # registrazioni chiamate
recording/
/var/log/asterisk/
full, messages, queue_log # log dettagliati
/var/www/html/admin/ # UI FreePBX (PHP)
*_custom_post.conf (o _custom.conf a seconda del file base): FreePBX li include automaticamente e non li tocca.
Telefoni IP, ATA, gateway FXO/FXS, softphone. Cosa comprare per non sbagliare.
I telefoni IP "veri" sono apparecchi dedicati con cornetta, display e tasti, alimentati via PoE o adattatore, che si registrano al PBX via SIP. Per il PBX sono tutti uguali (parlano SIP standard), per l'utente sono il telefono dell'ufficio.
| Marca | Fascia | Note |
|---|---|---|
| Yealink | Entry — alta | T31P/T31G economici e ottimi, T48/T54W top di gamma. Default safe nel 2026 |
| Fanvil | Entry — media | X1S/X3S/X4U cinesi, costano meno e funzionano bene. Spesso scelti per call center |
| Snom | Media — alta | D-series, costruzione tedesca, premium |
| Grandstream | Entry — alta | GRP/GXP series, larga gamma, prezzi competitivi |
| Poly (ex Polycom) | Alta | VVX series, audio HD eccellente, costoso |
| Sangoma | Tutta | Stessi proprietari di FreePBX. Endpoint Manager configurazione zero-touch |
| Cisco | Alta | Costoso, blasonato, talvolta usato in enterprise legacy |
ATA = Analog Telephone Adapter. Una scatoletta che da un lato ha la porta Ethernet (parla SIP col PBX), dall'altro una porta FXS (presa telefonica RJ11) dove colleghi un telefono analogico classico. Il vecchio telefono "diventa" un telefono IP, senza saperlo.
Modelli classici: Grandstream HT801/HT802/HT813, Cisco SPA112, OBi (ora Polycom). Economici (~€30-80), perfetti per riciclare hardware esistente.
Se hai ancora una linea PSTN analogica (numero di telefono fisso classico) e vuoi farla entrare nel PBX:
Hardware: schede PCI Sangoma A-series (A200, A400, A800 con N porte FXO/FXS), OpenVox, Digium (legacy), gateway ethernet stile Yeastar TA800.
App software che fa da telefono SIP. Per chi lavora da casa, da remoto, occasionalmente, o vuole risparmiare hardware:
Open source, multi-piattaforma (Linux/Mac/Win/iOS/Android), maturo
Free + paid, multi-piattaforma, codec ampi (Opus in versione paid)
Windows only, leggerissimo, gratuito, perfetto per call center
Companion FreePBX/PBXact, presence + chat oltre alla voce
Commerciale, premium, in molti contesti enterprise
Solid iOS/Android, push notification nativo per non drenare batteria
Il modo facile è usare la ISO. Il modo "tuo" è installare su Debian vanilla. Vediamo entrambi.
Scarichi l'ISO dal sito FreePBX, la butti su una chiavetta, installi su un mini-PC, Raspberry, VM Proxmox, o VPS. La distribuzione configura tutto: Asterisk, MariaDB, Apache, fail2ban, modulo di update automatico.
Risorse minime per ~20 interni: 2 vCPU, 2 GB RAM, 20 GB disco. Per call center con registrazioni: 4 vCPU, 4 GB RAM, 100+ GB disco.
# Dopo install ISO, primo boot:
# 1. Boot, login console: root / (chiede di settare pwd)
# 2. Trova l'IP che ha preso da DHCP
$ ip addr
# 3. Apri il browser su http://<ip>/
# - Crea utente admin web
# - Imposta email admin (per voicemail-to-email, notifiche)
# - Skip "activate FreePBX" se non hai PBXact license
# 4. Aggiorna i moduli (Admin → Module Admin → Check Online → Upgrade All)
Più lavoro setup ma totale controllo. Per chi già gestisce Debian server e non vuole una distro "magica". Versione consigliata: FreePBX 17 + Asterisk 22 (LTS) + Debian 12 bookworm.
# Su Debian 12 fresca, da root:
# 1. Dipendenze sistema
$ apt update && apt -y full-upgrade
$ apt -y install \
build-essential git curl wget vim sudo gnupg2 \
apache2 mariadb-server mariadb-client \
php php-cli php-pear php-mysql php-curl php-mbstring php-xml \
libapache2-mod-php \
sox lame mpg123 ffmpeg \
fail2ban iptables-persistent ntp
# 2. Asterisk — opzione A: dai repo Debian
$ apt -y install asterisk asterisk-modules asterisk-config
# Opzione B: compilato da sorgente (versione più recente)
$ cd /usr/src
$ wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
$ tar xf asterisk-22-current.tar.gz
$ cd asterisk-22.*
$ contrib/scripts/install_prereq install
$ ./configure
$ make -j$(nproc) && make install && make samples && make config
# 3. FreePBX
$ cd /usr/src
$ wget https://mirror.freepbx.org/modules/packages/freepbx/freepbx-17.0-latest.tgz
$ tar xf freepbx-17.0-latest.tgz
$ cd freepbx
$ ./start_asterisk start
$ ./install -n
# 4. Apri http://<ip>/ e crea admin user
Sei parole che ricorrono ovunque. Una volta che le sai, FreePBX diventa quasi banale.
Un "interno". Numero (es. 100, 101...) + credenziali SIP. Un'extension = un endpoint registrabile. Una persona può avere 1 extension che squilla su 3 device, oppure 3 extension diverse.
Il "collegamento al mondo esterno". Tipicamente un SIP trunk verso un provider VoIP, ma può essere un trunk PSTN (FXO), un trunk GSM, o un trunk tra due PBX.
Regola "chi entra finisce dove". Match su DID (il numero che hanno chiamato), CID (chi sta chiamando), trunk. Destinazione: extension, ring group, IVR, queue, voicemail.
Regola "chi esce passa da dove". Match sul numero digitato (pattern), scelta del trunk, riformattazione del numero (es. togliere il prefisso 9). Ordine conta: prima match vince.
"Premi 1 per...". Albero di scelte: greeting audio, opzioni 0-9 + #/*, timeout/invalid handlers. Può annidare altri IVR (sotto-menu).
Coda call-center. Agenti (statici o dinamici), strategia di distribuzione (ringall, leastrecent, fewestcalls, ...), music on hold, position announce, max wait, esci a voicemail se passa il tempo.
"Quando arriva una chiamata, squilla a tutti questi numeri". Strategie: ringall, hunt (uno alla volta), memoryhunt. Più semplice di una queue, niente metriche d'agente.
Switch routing in base al tempo. Group di "Time Group" (es. "orario d'ufficio", "weekend", "Natale"). Inbound route → Time Condition → due destinazioni (in-hours / out-of-hours).
"Quando squilla il fisso, dopo 15 secondi inoltra anche al cellulare". Setup per persona, su ogni extension.
Una chiamata entrante è un fiume che entra dal trunk. La inbound route è il primo bivio. Poi può passare da una time condition (orario), finire in un IVR (l'utente sceglie), proseguire in una queue (smistato a un agente), o cadere in una voicemail. Configurare un PBX vuol dire disegnare questo fiume. La GUI FreePBX te lo rende ovvio.
Scenario: 8 interni, un numero pubblico, supporto, amministrazione, fuori orario va in voicemail.
Tutto fatto da web UI, zero righe di dialplan. Setup di 1-2 ore.
Come dare un numero pubblico al tuo PBX. Concetti, parametri, esempio.
Un SIP trunk è un accordo con un provider VoIP che ti dà un numero pubblico (DID) e gestisce per te l'interconnessione con la rete telefonica mondiale. Tecnicamente: il tuo PBX si registra al server SIP del provider con username/password, e da quel momento le chiamate al "tuo numero" arrivano al tuo PBX, e le tue chiamate uscenti vengono terminate dal provider.
Costi tipici: ~€1-5/mese per il numero (canone), ~€0.01-0.05/min per le chiamate (tariffa per fascia). Provider italiani noti: Messagenet, VoIPVoice, Eutelia, Skebby, Cheapnet, Eolo. Il mercato cambia: confronta sempre prima di firmare.
| Parametro | Esempio | A cosa serve |
|---|---|---|
| SIP server / proxy | sip.provider.it | Endpoint a cui il tuo PBX si registra |
| Port | 5060 | Standard SIP (a volte 5061 per SIP-TLS) |
| Username | 0635591234 | Spesso coincide con il numero pubblico |
| Password | (stringa casuale lunga) | Auth SIP — tienila al sicuro |
| Codec abilitati | g711alaw, g729 | Confronta col tuo: serve overlap |
| Format DID | E.164 (+39063...) o nazionale | Come ti consegnano il numero chiamato |
| Formato CLI | E.164 | Come consegnare il tuo numero chiamante |
Connectivity → Trunks → Add Trunk → chan_pjsip. Tab principali:
rfc4733), From Domain (di solito = SIP server), Send RPID, Trust RPIDVerifica: Reports → Asterisk Info → PJSIP Info → il trunk deve essere "Registered". Se vedi "Unreachable" o "Auth fail" → controlli credenziali, NAT, firewall.
Connectivity → Inbound Routes → Add. Settings:
Hai già una chiamata in entrata testabile da subito.
Connectivity → Outbound Routes → Add. Settings:
9|. → tutto ciò che inizia con 9, strippa il 9 prima di chiamare0[0-9]X. → numeri nazionali italiani che iniziano con 0+39XXXXXXXXX → format E.164 nazionaleLe due cose che ti faranno bestemmiare. Affrontate, diventano gestibili.
SIP è vecchio (1996, RFC 2543; aggiornato in RFC 3261 nel 2002), è nato in un'epoca "prima del NAT pervasivo". Conseguenza: i messaggi SIP contengono indirizzi IP nei body (header Contact, SDP per RTP). Se il tuo PBX dietro NAT manda "rispondi all'audio su 192.168.1.10", il provider esterno prova a contattare 192.168.1.10 — che non esiste su Internet.
Senti tu ma non senti chi chiama (o viceversa). RTP che si perde in un buco NAT.
Il PBX manda REGISTER, ma il 200 OK del server non torna indietro perché arriva su una porta che il NAT ha già chiuso.
Keepalive insufficienti, il NAT chiude la "pinhole" e la sessione muore.
external_media_address e external_signaling_address, e local_net per ognuna delle tue reti interne. Asterisk riscrive gli header SIP/SDP usando l'IP pubblicostun.l.google.com:19302)allowguest=no)1234 / 100 / secretallowguest=yes (default storico, oggi pericoloso)I comandi e i file di log che ti salveranno alle 23 di sera quando "non funziona più niente".
$ asterisk -rvvv # entra nella CLI di Asterisk live
# Dentro la CLI:
asterisk*CLI> help
asterisk*CLI> core show version
asterisk*CLI> core show channels # chiamate in corso
asterisk*CLI> core show channels concise
asterisk*CLI> core show uptime
asterisk*CLI> reload # ricarica tutto (dialplan, pjsip, ...)
asterisk*CLI> dialplan reload
asterisk*CLI> pjsip reload
asterisk*CLI> pjsip show endpoints # tutti gli endpoint registrati
asterisk*CLI> pjsip show endpoint 101
asterisk*CLI> pjsip show contacts # contatti SIP attivi
asterisk*CLI> pjsip show registrations # trunk registrati
asterisk*CLI> pjsip set logger on # logging SIP raw (verboso!)
asterisk*CLI> pjsip set logger off
asterisk*CLI> queue show
asterisk*CLI> voicemail show users
asterisk*CLI> dialplan show
asterisk*CLI> dialplan show from-internal
asterisk*CLI> channel originate PJSIP/101 extension 102@from-internal
asterisk*CLI> channel request hangup all
asterisk*CLI> exit # o Ctrl+D
# Log Asterisk principale (verbosità in /etc/asterisk/logger.conf)
$ tail -f /var/log/asterisk/full
$ tail -f /var/log/asterisk/messages
# CDR (Call Detail Records) — chi ha chiamato chi
$ tail -f /var/log/asterisk/cdr-csv/Master.csv
# Queue log
$ tail -f /var/log/asterisk/queue_log
# Apache (per problemi UI FreePBX)
$ tail -f /var/log/apache2/error.log
$ tail -f /var/log/apache2/access.log
# fail2ban (chi è stato bannato)
$ tail -f /var/log/fail2ban.log
$ fail2ban-client status # lista jail attive
$ fail2ban-client status asterisk # dettagli jail asterisk
$ fwconsole help
$ fwconsole reload # equivalente di "Apply Config" UI
$ fwconsole restart # restart Asterisk
$ fwconsole stop && fwconsole start
$ fwconsole ma list # moduli installati
$ fwconsole ma listonline # moduli disponibili online
$ fwconsole ma upgradeall # aggiorna tutto
$ fwconsole ma install <mod>
$ fwconsole ma uninstall <mod>
$ fwconsole sysadmin # info di sistema
$ fwconsole chown # fixa i permessi dei file (dopo modifiche manuali)
$ fwconsole backup --backup default # crea backup
$ fwconsole backup --restore /path/to/backup.tar.gz
Quando "niente funziona", segui questa sequenza:
systemctl status asterisk — running?asterisk -rvvv — vedi errori in real-time?pjsip show endpoints — i tuoi telefoni sono "Available"?pjsip show registrations — "Registered"?pjsip set logger on, fai partire una chiamata, leggi cosa sta succedendo a livello SIPtcpdump -i any -nn -s0 -w /tmp/sip.pcap port 5060, poi apri con Wireshark filtro sipnft list ruleset o iptables -L -n -v — non stai bloccando per sbaglio?pjsip show endpoint X → controlla local_net, external_*. Sono giusti?