🍺 Buy me a beer
☎️

VoIP per Svogliati

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.

01 / 12

Cos'è il VoIP

Voce su Internet, anziché voce su filo di rame. Detto così sembra banale, e in effetti lo è.

☎️ La definizione, facile facile

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.

🧠 L'analogia

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).

Cosa puoi fare con il VoIP che con la PSTN no

💰

Costi crollati

Chiamate interne tra sedi remote = traffico Internet. Costo zero, ovunque nel mondo.

📱

Un numero, mille device

Lo stesso "interno 101" può squillare sul telefono in ufficio + smartphone + softphone sul laptop, contemporaneamente.

🌐

Dovunque

Il tuo "interno aziendale" funziona uguale che tu sia in ufficio, a casa, o in un coworking a Lisbona. Serve Internet, basta.

⚙️

Funzionalità smart

IVR ("digiti 1 per..."), code, registrazione chiamate, voicemail to email, calendari, integrazione CRM. Tutto software.

📊

Scalabilità

Da 5 a 5000 interni cambiano solo configurazione e licenze, non il cablaggio.

🛡️

Sotto il tuo controllo

Centralino on-premise = i tuoi dati, le tue regole, niente "fornitore cloud che sa chi chiami".

📝 Lo standard de facto. Oggi praticamente tutte le grandi reti telefoniche del mondo sono internamente VoIP, anche quando ti vendono ancora "una linea telefonica" a casa. La PSTN tradizionale è in dismissione: in Italia TIM sta migrando tutto a IP entro pochi anni; UK e Germania hanno già date di switch-off del PSTN tradizionale. Il VoIP non è "il futuro": è il presente.
02 / 12

Come funziona davvero

Due protocolli: uno per organizzare la chiamata, uno per portare la voce. Più un codec per spremere i bit.

📡 SIP + RTP, in un disegno

Una chiamata VoIP usa due flussi diversi sulla rete:

  • SIP (Session Initiation Protocol) — gestisce il "chi chiama chi, accetta?, riaggancia". È come i bigliettini che si passano due persone per accordarsi sull'incontro. Porta standard: 5060/udp (e 5061/tcp per SIPS, cifrato).
  • RTP (Real-time Transport Protocol) — trasporta il "flusso di voce vero" una volta che la chiamata è partita. Porte: range alto UDP (tipicamente 10000-20000/udp).

Flusso completo di una chiamata SIP

Alice (telefono A) PBX (Asterisk) Bob (telefono B) | | | | INVITE bob@pbx (SIP) | | |--------------------------->| | | | INVITE bob@.. (SIP) | | |------------------------->| | | 180 Ringing | | |<-------------------------| | 180 Ringing | (squilla) | |<---------------------------| | | | 200 OK (risponde) | | |<-------------------------| | 200 OK | | |<---------------------------| | | ACK | | |--------------------------->| | | | ACK | | |------------------------->| | | | ==== RTP audio flow (UDP, bidirezionale) ==== | |<======================================================>| | | | BYE (riaggancia) | | |--------------------------->| | | | BYE | | |------------------------->| | 200 OK | 200 OK | |<---------------------------|<-------------------------|

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.

Codec — comprimere la voce

Un codec è un algoritmo che digitalizza e comprime la voce. Scelta classica:

CodecBitrateQualitàQuando
G.711 (a-law / µ-law)~64 kbpsStandard PSTNLAN, fibra, tutto dove c'è banda. Default safe
G.722~64 kbpsHD voice (wideband)Telefoni IP moderni interni alla LAN, ottima resa
G.729~8 kbpsBuona ma compressaLinee lente, mobile, link satellite. Storicamente brevettato
Opus6–510 kbps adattivoEccellenteWebRTC, qualunque scenario moderno. Royalty-free
GSM~13 kbpsDa telefonino anni '90Compatibilità legacy, basso CPU
iLBC~13-15 kbpsBuona, robusto a packet lossReti con perdite di pacchetti
🎤 Match dei codec. Entrambi i lati devono supportare lo stesso codec, altrimenti negoziano qualcosa di comune (di solito G.711) o la chiamata fallisce. Tenere abilitati 2-3 codec ben supportati (G.711 + Opus + magari G.722) è sano. Abilitare 12 codec esotici causa solo strane chiamate senza audio.

DTMF — i toni dei tasti

Quando premi i tasti durante una chiamata ("digita 1 per assistenza") il telefono manda i tasti. Tre modi:

  • In-band: tono audio dentro l'RTP. Funziona, ma codec aggressivi lo distorcono → problemi
  • RFC 2833 / RFC 4733: eventi DTMF dentro RTP ma fuori-banda dall'audio. Standard de facto
  • SIP INFO: messaggi SIP separati. Affidabile, raro

Quando IVR / voicemail "non riconosce i tasti" — quasi sempre un mismatch DTMF tra i due lati.

03 / 12

Cos'è un PBX

Il "centralino" dell'azienda. Da scatola metallica grigia a software su un server.

📞 Definizione

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.

Cosa fa un PBX

📞 Routing chiamate

"100 chiama 101" → squilla telefono di Bob. "100 chiama 0039061234567" → esce sul SIP trunk del provider.

📧 Voicemail

Registra messaggi quando nessuno risponde, manda email con il file audio allegato.

💬 IVR

"Premi 1 per amministrazione, 2 per supporto...". Auto-attendant che smista le chiamate in entrata.

📥 Code (queue)

Call center base: le chiamate si accodano, vengono distribuite agli agenti liberi, musica d'attesa.

🔔 Ring group

"Quando chiama, squilla a 5 telefoni in parallelo": chi risponde prima vince.

📅 Condizioni temporali

Fuori orario d'ufficio → voicemail. Nel weekend → messaggio di chiusura.

🎤 Registrazione

Salva le chiamate (con preavviso legale!) per qualità, training, compliance.

📊 CDR & reporting

Call Detail Records: chi ha chiamato chi, quando, per quanto, esito. Per fatturazione e analisi.

🧠 L'analogia

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è.

On-premise vs cloud (UCaaS)

PBX on-premise (Asterisk/FreePBX)

  • Costo fisso (server + SIP trunk), niente per-utente
  • Dati tutti tuoi (CDR, registrazioni, contatti)
  • Personalizzabile fino al last mile (script AGI/AMI)
  • Integrazione facile con sistemi interni (CRM/ERP)
  • Niente fornitore che cambia listino o fa EOL il prodotto

UCaaS cloud (3CX cloud, RingCentral, Zoom Phone, MS Teams)

  • ~€10-30 per utente al mese, scala (male) con il team
  • Dati nel cloud altrui
  • Limitazioni "perché il piano standard non include questo"
  • Integrazione = "ti diamo un'API rate-limitata"
  • Provider che può deprecare feature o cambiare prezzi
💬 Verdetto svogliato: per ≤ 5 interni, MS Teams/Zoom Phone bastano e fanno bene a non gestire un PBX. Per 10+ interni, una PMI seria, multi-sede, integrazioni custom: FreePBX su un mini-server o VPS ripaga in mesi e ti dà controllo che il cloud non offre.
04 / 12

Asterisk — il motore

Open source, scritto in C, dal 1999. Potente come pochi, scomodo come tanti.

⚙️ Cos'è Asterisk

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.

L'ecosistema in 4 sigle

ComponenteCosa è
chan_pjsipDriver SIP moderno (basato su PJSIP), default da Asterisk 12+. Sostituisce chan_sip (legacy, rimosso in Asterisk 21)
chan_iax2Driver IAX2 (Inter-Asterisk eXchange), protocollo nativo Asterisk, NAT-friendly. Niche
DialplanIl programma che descrive cosa succede a ogni chiamata. Vive in extensions.conf. Linguaggio dedicato
AGIAsterisk Gateway Interface. Esegue script esterni (Python, Bash, PHP) durante una chiamata. Stile CGI vintage
AMIAsterisk Manager Interface. TCP socket 5038 per pilotare Asterisk da fuori (originate chiamate, monitorare eventi)
ARIAsterisk REST Interface. API REST + WebSocket moderne, da Asterisk 12+. Per app esterne complesse

Il dialplan — la cosa intimidatoria

Il "programma" che dice ad Asterisk cosa fare quando arriva una chiamata. Sintassi minimale ma propria, con context, extension, priority, application:

/etc/asterisk/extensions.conf (esempio dialplan minimal)
; 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.

🤯 Il vero problema di Asterisk "puro": per il setup di un PBX da 20 interni servono ~8 file di configurazione, una decina di context dialplan, gestione manuale di certificati, registrazione manuale dei telefoni, troubleshooting di errori SIP a mano nei log. Si può fare, ma per il sysadmin medio è come fare un'app web scrivendo HTTP raw a mano. Da qui nasce FreePBX.
05 / 12

FreePBX — la GUI che ti salva la vita

Asterisk con una web UI sopra. Stesse capacità, 1/10 del dolore.

🏫 Cos'è FreePBX

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.

🧠 L'analogia

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.

Cosa fa la GUI

👤 Extension

Crei un interno (numero + password SIP + email per voicemail) in 30 secondi. FreePBX genera pjsip.conf ed entry voicemail.

📡 Trunk

Aggiungi un SIP trunk verso il provider esterno: indirizzo, username, password, codec. La GUI lo registra e ti dice se funziona.

📥 Inbound route

"Quando arriva una chiamata sul numero X, mandala a Y" (IVR, extension, voicemail, queue). Drag & drop concettuale.

📤 Outbound route

"Quando un interno digita 9, ruoti la chiamata sul trunk-pollidori". Pattern matching e dial rules.

💬 IVR builder

Albero IVR multi-livello dalla UI: "1 per amministrazione, 2 per supporto, ...". Senza scrivere righe di dialplan.

📥 Queue

Code per il call center: strategy (ringall, leastrecent, fewestcalls), max wait, agent priority, music on hold.

🎤 Music on hold

Carichi file audio per musica d'attesa. Per categoria (corp / sales / supporto).

📅 Time conditions

"Fuori orario", "weekend", "festività specifiche". Calendar-based routing.

📝 Backup & restore

Backup completo della config + voicemail su file/FTP/S3. Restore in 5 minuti su un nuovo server.

Versioni e distro

Più opzioni per installarlo:

  • FreePBX Distro — immagine ISO pronta. Storicamente CentOS-based; dalla versione 17 è passato a Debian (l'EOL di CentOS ha forzato la migrazione). Tutto pre-configurato, mass-install.
  • FreePBX su Debian/Ubuntu vanilla — installi Asterisk + FreePBX a mano sopra una Debian che già gestisci. Più controllo, più lavoro setup, integrazione con la tua infra.
  • PBXact — appliance commerciale di Sangoma. FreePBX + moduli commerciali Pro inclusi, supporto incluso, hardware Sangoma certificato. Per chi vuole zero pensieri e ha budget.
🎯 FreePBX 17 + Debian è il setup raccomandato per chi parte oggi. Coerente con il resto del tuo stack Debian (vedi Linux Admin), update via apt, integrazione naturale con arx/nomina/missus sullo stesso host se vuoi.
06 / 12

Architettura: cosa gira sopra cosa

Asterisk + PHP + MariaDB + Apache. Quattro pezzi, ben separati, su una sola macchina.

Browser admin Telefoni IP SIP trunk provider | | | HTTPS 443 SIP 5060/udp SIP 5060/udp | | | v v v +---------------+ +-----------------+ +------------------+ | Apache + PHP | | | | | | (FreePBX UI) | | | | | +---------------+ | Asterisk |<==========>| | | | | | | | scrive .conf | (chan_pjsip, | RTP audio (UDP 10000-20000) v | dialplan, | | | +---------------+ | apps, voice- | | | | /etc/asterisk/| | mail, queue) | | | +---------------+ | | | | ^ +-----------------+ +------------------+ | metadata | | v +---------------+ +-----------------+ | MariaDB/MySQL|<---->| CDR / queue | | (config + CDR)| | log / state | +---------------+ +-----------------+

I componenti spiegati

ComponenteRuoloPorta
AsteriskIl "motore PBX". Gestisce SIP, RTP, dialplan, voicemail, queue5060/udp (SIP), 10000-20000/udp (RTP), 5038/tcp (AMI)
Apache + PHPWeb server della UI FreePBX. Genera config Asterisk80/tcp (HTTP), 443/tcp (HTTPS)
MariaDBDB per config FreePBX, CDR, state delle queue3306/tcp (locale)
fail2banBan di IP che falliscono autenticazione SIP/SSH
postfix/eximMTA locale per voicemail-to-email25/tcp (locale)

Dove vivono i file

layout FreePBX/Asterisk
/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)
⚠️ Non modificare i file generati da FreePBX a mano: alla prima "apply config" la GUI li sovrascriverà. Per personalizzazioni usa i file *_custom_post.conf (o _custom.conf a seconda del file base): FreePBX li include automaticamente e non li tocca.
07 / 12

Hardware

Telefoni IP, ATA, gateway FXO/FXS, softphone. Cosa comprare per non sbagliare.

📱 Telefoni IP da scrivania

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.

MarcaFasciaNote
YealinkEntry — altaT31P/T31G economici e ottimi, T48/T54W top di gamma. Default safe nel 2026
FanvilEntry — mediaX1S/X3S/X4U cinesi, costano meno e funzionano bene. Spesso scelti per call center
SnomMedia — altaD-series, costruzione tedesca, premium
GrandstreamEntry — altaGRP/GXP series, larga gamma, prezzi competitivi
Poly (ex Polycom)AltaVVX series, audio HD eccellente, costoso
SangomaTuttaStessi proprietari di FreePBX. Endpoint Manager configurazione zero-touch
CiscoAltaCostoso, blasonato, talvolta usato in enterprise legacy
🔌 PoE (Power over Ethernet): i telefoni IP moderni si alimentano dal cavo Ethernet stesso, niente alimentatore. Switch PoE serio (Mikrotik CRS, Netgear ProSafe, Cisco SG-series) e via — un cavo per scrivania anziché due.

ATA — collegare i vecchi telefoni analogici

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.

Gateway FXO/FXS — il PSTN entra nel PBX

Se hai ancora una linea PSTN analogica (numero di telefono fisso classico) e vuoi farla entrare nel PBX:

  • FXO (Foreign eXchange Office) — la porta che "riceve" dalla rete telefonica. Ci colleghi la presa muro PSTN del fornitore
  • FXS (Foreign eXchange Subscriber) — la porta che "serve" un telefono analogico. Fornisce tensione, ringer, dial tone

Hardware: schede PCI Sangoma A-series (A200, A400, A800 con N porte FXO/FXS), OpenVox, Digium (legacy), gateway ethernet stile Yeastar TA800.

Softphone — il telefono nel laptop/smartphone

App software che fa da telefono SIP. Per chi lavora da casa, da remoto, occasionalmente, o vuole risparmiare hardware:

💻

Linphone

Open source, multi-piattaforma (Linux/Mac/Win/iOS/Android), maturo

📱

Zoiper

Free + paid, multi-piattaforma, codec ampi (Opus in versione paid)

📍

MicroSIP

Windows only, leggerissimo, gratuito, perfetto per call center

🌏

Sangoma Talk

Companion FreePBX/PBXact, presence + chat oltre alla voce

💰

Bria

Commerciale, premium, in molti contesti enterprise

🧑‍💻

Acrobits

Solid iOS/Android, push notification nativo per non drenare batteria

08 / 12

Installazione (FreePBX su Debian)

Il modo facile è usare la ISO. Il modo "tuo" è installare su Debian vanilla. Vediamo entrambi.

Path A: FreePBX Distro (la ISO pronta)

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.

FreePBX Distro — post-install
# 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)

Path B: install su Debian vanilla

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.

install manuale (riassunto concettuale)
# 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
📝 Per i comandi esatti aggiornati consulta sempre i wiki ufficiali FreePBX/Sangoma. La sequenza precisa di pacchetti / versioni cambia tra release: i comandi sopra sono lo scheletro per capire il tipo di lavoro, non un copia-incolla che funziona out-of-the-box su ogni Debian. Per produzione: ISO ufficiale è più sicura.

Setup post-install: i primi 5 passi

  1. Cambiare le password root, MariaDB, admin web FreePBX (default sono note)
  2. Aggiornare i moduli: Admin → Module Admin → Check Online → Upgrade All
  3. Configurare email: Admin → System Admin → Notifications (server SMTP, mittente)
  4. Abilitare HTTPS con certbot (Admin → System Admin → HTTPS Setup, o manuale)
  5. Configurare fail2ban: di default FreePBX Distro lo ha già, su install manuale aggiungi le jail SIP
09 / 12

I concetti chiave

Sei parole che ricorrono ovunque. Una volta che le sai, FreePBX diventa quasi banale.

👤 Extension

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.

📡 Trunk

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.

📥 Inbound Route

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.

📤 Outbound Route

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.

💬 IVR

"Premi 1 per...". Albero di scelte: greeting audio, opzioni 0-9 + #/*, timeout/invalid handlers. Può annidare altri IVR (sotto-menu).

📥 Queue

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.

🔔 Ring Group

"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.

📅 Time Condition

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).

📷 Follow Me

"Quando squilla il fisso, dopo 15 secondi inoltra anche al cellulare". Setup per persona, su ogni extension.

🧠 Il modello mentale

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.

Esempio reale: una piccola azienda

Scenario: 8 interni, un numero pubblico, supporto, amministrazione, fuori orario va in voicemail.

  1. Crei 8 extension (101-108), una per ciascun dipendente.
  2. Aggiungi un SIP trunk verso il provider VoIP con il numero pubblico.
  3. Crei una queue "supporto" con agenti = extension 102, 103.
  4. Crei una queue "amministrazione" con agenti = extension 104, 105.
  5. Crei un IVR "main": "Premi 1 per supporto, 2 per amministrazione, 0 per centralino" → manda alle queue o all'extension 101.
  6. Crei una time condition "orario d'ufficio" (Lun-Ven 9-18).
  7. Crei una inbound route sul DID pubblico: in-hours → IVR, out-of-hours → voicemail generica.
  8. Crei una outbound route: numeri 9XX... → trunk (con strip del 9 iniziale).

Tutto fatto da web UI, zero righe di dialplan. Setup di 1-2 ore.

10 / 12

SIP trunk con un provider

Come dare un numero pubblico al tuo PBX. Concetti, parametri, esempio.

📡 Cos'è un SIP trunk

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.

Parametri tipici che ti danno

ParametroEsempioA cosa serve
SIP server / proxysip.provider.itEndpoint a cui il tuo PBX si registra
Port5060Standard SIP (a volte 5061 per SIP-TLS)
Username0635591234Spesso coincide con il numero pubblico
Password(stringa casuale lunga)Auth SIP — tienila al sicuro
Codec abilitatig711alaw, g729Confronta col tuo: serve overlap
Format DIDE.164 (+39063...) o nazionaleCome ti consegnano il numero chiamato
Formato CLIE.164Come consegnare il tuo numero chiamante

Configurazione trunk in FreePBX (UI)

Connectivity → Trunks → Add Trunk → chan_pjsip. Tab principali:

  • General: trunk name, outbound CallerID (il tuo numero), max channels
  • pjsip Settings → General: Username, Secret (password), SIP server, SIP server port, Authentication, Registration
  • pjsip Settings → Advanced: Codecs (selezione), DTMF mode (rfc4733), From Domain (di solito = SIP server), Send RPID, Trust RPID
  • Submit + Apply Config

Verifica: Reports → Asterisk Info → PJSIP Info → il trunk deve essere "Registered". Se vedi "Unreachable" o "Auth fail" → controlli credenziali, NAT, firewall.

Inbound route per il numero pubblico

Connectivity → Inbound Routes → Add. Settings:

  • DID Number: il numero pubblico (formato che ti consegna il provider)
  • Set Destination: IVR / Queue / Extension / Time Condition

Hai già una chiamata in entrata testabile da subito.

Outbound route per uscire

Connectivity → Outbound Routes → Add. Settings:

  • Route Name: "out-via-provider"
  • Trunk Sequence: il trunk appena creato
  • Dial Patterns: il pattern dei numeri che instradano qui. Esempi:
    • 9|. → tutto ciò che inizia con 9, strippa il 9 prima di chiamare
    • 0[0-9]X. → numeri nazionali italiani che iniziano con 0
    • +39XXXXXXXXX → format E.164 nazionale
📝 Numeri di emergenza. Crea una outbound route prioritaria per i numeri di emergenza (112, 113, 115, 118), che esce sempre, anche dagli utenti senza permessi outbound. Per legge e per buon senso: chi compone 112 deve poter sempre uscire, anche fuori orario, anche senza credito.
🇺🇸 Localizzazione emergenze. Con la VoIP la chiamata di emergenza esce dal punto del provider, non dal punto fisico dove sei. Per uffici multi-sede è tema legale serio: il 118 deve sapere dove intervenire. Provider seri offrono "Emergency Location Information Service" e config per-extension. Non è un dettaglio cosmetico.
11 / 12

NAT & sicurezza

Le due cose che ti faranno bestemmiare. Affrontate, diventano gestibili.

Il problema NAT

🤯 Perché SIP odia NAT

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.

I sintomi classici

🔇

One-way audio

Senti tu ma non senti chi chiama (o viceversa). RTP che si perde in un buco NAT.

📥

Registrazione fallita

Il PBX manda REGISTER, ma il 200 OK del server non torna indietro perché arriva su una porta che il NAT ha già chiuso.

🎤

Chiamate cadono dopo 30 secondi

Keepalive insufficienti, il NAT chiude la "pinhole" e la sessione muore.

Le soluzioni

  • Configurare l'external IP sul PBX: in pjsip 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 pubblico
  • Port forwarding sul router: 5060/udp (SIP) + il range RTP (es. 10000-20000/udp) verso il PBX. Su CGNAT serio puoi essere fregato — serve un IP pubblico vero
  • SIP-ALG OFF sul router: la maggior parte dei router SOHO hanno un "SIP Application Layer Gateway" che cerca di aiutare riscrivendo i pacchetti SIP. Risultato: tipicamente li rompe. Disabilitare sempre
  • Telefoni IP esterni: stesso problema, dall'altro lato. Usa SIP-TLS + SRTP (cifrato + meno problemi con middlebox), o VPN dei device verso il PBX
  • STUN / TURN: per softphone su rete sconosciuta. Provider serie offrono server STUN pubblici (Google: stun.l.google.com:19302)

Sicurezza — il toll fraud è reale

🚨 Storia di paura vera: PBX VoIP esposto a Internet senza hardening, password "1234" sull'extension 101, bot scansiona porta 5060, indovina la password in 4 ore, inizia a fare chiamate verso numeri premium internazionali (Cuba, Somalia, Mauritania, ...). In una notte: 3000-15000€ di chiamate. Il provider non te le sconta, è "uso lecito" da parte sua. Ci sono storie documentate ovunque sul web. È il rischio numero uno del VoIP self-hosted.

Hardening base — obbligatorio prima di esporre

Cosa fare

  • Password forti sulle extension (es. 24+ caratteri random, non "100")
  • fail2ban attivo con jail SIP (ban veloce: 5 fail in 60s = ban 24h)
  • Disabilitare guest/anonymous calls (allowguest=no)
  • Limitare i codec internazionali: outbound route che blocca prefissi non necessari (00X, 00Y...)
  • Limit di concurrent calls per extension: nessuna extension dovrebbe fare 50 chiamate simultanee
  • Cambio porta SIP (5060 → 5160 random): security through obscurity, ma scoraggia bot stupidi
  • Firewall: whitelist gli IP dei provider SIP. Tutto il resto → drop
  • HTTPS sulla web UI FreePBX + 2FA per admin
  • Alert su CDR anomali: spike in chiamate notturne, destinazioni estere
  • Backup della config + voicemail. Test restore prima che serva

Cosa NON fare

  • Esporre porta 5060 + 80/443 web UI senza fail2ban
  • Password come 1234 / 100 / secret
  • Lasciare allowguest=yes (default storico, oggi pericoloso)
  • Outbound route "qualsiasi numero qualsiasi prefisso"
  • Saltàre l'update dei moduli FreePBX per mesi
  • Esporre AMI (5038/tcp) senza ACL severo
  • Tenere abilitato chan_sip se non strettamente serve (legacy, attaccabile)
  • Web UI HTTP senza HTTPS
  • Affidarsi solo a fail2ban senza limitazione codec/destinazioni
  • Pensare "tanto il mio è un PBX piccolo, chi lo attacca": sbagliato, gli attacchi sono automatizzati
🛡️ Strategie aggiuntive serie: PBX su rete privata senza esposizione pubblica e telefoni remoti via WireGuard / OpenVPN. Trunk verso provider via IP whitelist (il provider sa il tuo IP, accetta solo da lì). Soluzione perfetta per uffici fissi: zero superficie d'attacco pubblica.
12 / 12

Cheat sheet

I comandi e i file di log che ti salveranno alle 23 di sera quando "non funziona più niente".

Asterisk CLI

asterisk -rvvv
$ 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 da guardare quando le cose vanno male

logs
# 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

FreePBX CLI

fwconsole
$ 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

Troubleshooting flow

Quando "niente funziona", segui questa sequenza:

  1. Stato Asterisk: systemctl status asterisk — running?
  2. CLI live: asterisk -rvvv — vedi errori in real-time?
  3. Endpoint registrati: pjsip show endpoints — i tuoi telefoni sono "Available"?
  4. Trunk registrato: pjsip show registrations — "Registered"?
  5. Logger SIP raw: pjsip set logger on, fai partire una chiamata, leggi cosa sta succedendo a livello SIP
  6. tcpdump per i casi disperati: tcpdump -i any -nn -s0 -w /tmp/sip.pcap port 5060, poi apri con Wireshark filtro sip
  7. Firewall: nft list ruleset o iptables -L -n -v — non stai bloccando per sbaglio?
  8. NAT: pjsip show endpoint X → controlla local_net, external_*. Sono giusti?
📚 Risorse ufficiali: wiki.freepbx.org (docs ufficiali FreePBX, dettagliata), docs.asterisk.org (riferimento dialplan, applications, modules), community.freepbx.org (forum attivo, risposte di sviluppatori), asterisk.org.
🔗 Guide collegate: Linux Admin (FreePBX gira su Debian, le basi valgono), Proxmox VE (LXC perfetto per ospitare un FreePBX di test), AppArmor (per confinare ulteriormente il PBX), arx · nomina · missus (la famiglia di pannelli su Debian che vive bene accanto a FreePBX), Ansible (per provisionare configurazione FreePBX da fuori).