Notando l’uptick nelle richieste riguardanti la configurazione del VoIP di Fastweb con il modem libero, ho pensato di scrivere questo breve post che descriva nel (relativo) dettaglio il suo funzionamento per prevenire e curare eventuali problemi di configurazione.

Gli assunti principali sono:

  1. Avere Fastweb (d’uh)
  2. Avere attivato il modem libero per vie ufficiali (niente spoofing MAC address o simili)
  3. Avere IP pubblico (è naturalmente possibile usare il VoIP anche dietro CG-NAT, ma è meno naturale e IMHO avere modem libero senza IP pubblico con Fastweb non ha senso)
  4. Avere le credenziali VoIP fornite da Fastweb
NAT + SIP Premi per mostrare NAT + SIP Premi per nascondere

Un ulteriore assunto, anche se nascosto, è che qualsiasi tipo di NAT helper (SIP ALG o simili) sia disattivato. Questi ultimi aggiungono complessità che nel caso di Fastweb non è utile ma solo dannosa.

Il punto di vista di questo post sarà un po’ inusuale, seguirò la sequenza di pacchetti come catturata dalla CPE analizzando:

  1. il flusso, per identificare problemi di NAT e Firewall
  2. gli headers, per identificare problemi di autenticazione

Legenda indirizzi IP:

  1. 172.16.15.16: PBX
  2. 85.18.217.100 (voip.fastwebnet.it): SIP-F
  3. 85.18.217.108: RTP-F

Registrazione

Questo è il flusso di una registrazione SIP che ha successo. PBX manda un SIP REGISTER iniziale a SIP-F, rappresentato qui sotto.

SIP-F risponde sempre con 401 Unauthorized, che invita PBX a produrre le sue credenziali (tramite una challenge).
PBX risponde nuovamente con un SIP REGISTER, sostanzialmente identico a quello sopra con l’aggiunta della risposta alla challenge. SIP-F risponde con 200 OK se e solo se le credenziali sono accettate.

Ora concentriamoci sugli headers SIP, che sono quasi tutti della forma sip:<user>@<domain>.
Gli headers From e To sono identici, <user> deve essere il proprio numero di telefono, mentre <domain> non ha effetto.
Quello che ci interessa però è l’header Contact: <user> qui non ha importanza, mentre <domain> deve essere il proprio indirizzo IP pubblico (così come l’indirizzo dell’header Via, se presente).

Vediamo ora come configurare le varie componenti per ottenere con successo la registrazione.

PBX (o ATA) Premi per mostrare PBX (o ATA) Premi per nascondere

L’impostazione user deve essere il vostro numero di telefono senza prefisso internazionale.
L’impostazione domain deve essere voip.fastwebnet.it.
Deve essere presente un’impostazione che permetta di inserire l’indirizzo IP pubblico (esterno/di NAT/ecc.), in caso contrario è necessario utilizzare un server STUN (sono tutti funzionalmente identici, trovate una lista qui).

Firewall Premi per mostrare Firewall Premi per nascondere

Bisogna avere una regola che permetta la comunicazione PBX:5060->WAN:5060 (generalmente nelle regole di LAN). È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come destinazione.

NAT Premi per mostrare NAT Premi per nascondere

Bisogna avere una regola di NAT outbound statico PBX:5060->WAN:5060. È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come destinazione.

Problema: Username e password sono corretti, ma gli header Contact e Via non contengono l'indirizzo pubblico e quindi Fastweb non accetta comunque l'autenticazione.
Soluzione: Assicurarsi che l'indirizzo IP pubblico sia correttamente impostato, e che Rewrite Contact headers (o simili) sia attivo. Se non è possibile impostare l'indirizzo IP pubblico, usare STUN. Controllare inoltre che il NAT helper per SIP sia disattivato nella propria CPE (firewall/router/ecc.).

Chiamate in entrata

Questo è il flusso di una chiamata in entrata che ha successo.

Se avete seguito correttamente gli step per la registrazione, gli headers qui saranno automaticamente corretti e non avranno alcun segreto. L’unica cosa a cui fare attenzione è utilizzare i codec indicati da Fastweb, i.e. G711A (o alaw, o PCMA), G729, e G729A.

L’invito per la chiamata (SIP INVITE) arriva da SIP-F, mentre la sessione RTP (l’audio in sé) parte dal nostro PBX.

Vediamo ora come configurare le varie componenti per ottenere con successo una chiamata in entrata.

PBX (o ATA) Premi per mostrare PBX (o ATA) Premi per nascondere

I codecs supportati devono includere almeno uno tra G711A, G729, e G729A.

Firewall Premi per mostrare Firewall Premi per nascondere

Bisogna avere una regola che permetta la comunicazione PBX:<range di porte RTP>->WAN:<range di porte RTP> (generalmente nelle regole di LAN). È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come destinazione.

Inoltre bisogna avere una regola WAN:5060->PBX:5060 (generalmente nelle regole di WAN), che permetta ad INVITE di superare il Firewall. È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come sorgente.

NAT Premi per mostrare NAT Premi per nascondere

Bisogna avere una regola di NAT outbound statico PBX:<range di porte RTP->WAN:<range di porte RTP>. È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come destinazione.

Inoltre bisogna avere una regola di NAT port forward WAN:5060->PBX:5060, che permetta ad INVITE di superare il NAT. È possibile restringere la regola al solo indirizzo voip.fastwebnet.it come sorgente.

Problema: La sessione RTP generalmente è simmetrica, il che significa che come noi ci connettiamo a Fastweb, Fastweb si connette a noi. Se la configurazione del NAT non è corretta questa connessione “inversa” non ha successo.
Sintomo: L'audio funziona in uscita ma non in entrata (dal punto di vista di PBX).

Keepalive Premi per mostrare Keepalive Premi per nascondere

É tecnicamente possibile utilizzare il cosiddetto "hole punching" al posto della regola di NAT port forward sulla porta 5060 (come facciamo con RTP), mantenendo attiva la connessione PBX:5060->SIP-F:5060 (che automaticamente permette anche la connessione inversa, si "apre un buco" nel NAT e nel Firewall).

Questo richiede l'utilizzo di un keepalive (chiamato anche qualify, una sorta di ping continuo), che nel caso di SIP è spesso un pacchetto SIP OPTIONS. SIP-F però non risponde a SIP OPTIONS ben formati, vanificando questa tecnica poiché se non riceve risposta PBX considera la sessione SIP non funzionante. É possibile quindi inviare appositamente SIP OPTIONS malformati, che invece sollecitano una risposta da SIP-F.

Personalmente non trovo questa soluzione elegante e perciò non la uso (essendo sostanzialmente equivalente a una regola di NAT port forward limitata al solo voip.fastwebnet.it), ma è valida.

Chiamate in uscita

Questo è il flusso di una chiamata in uscita che ha successo.

Se avete seguito correttamente gli step per la registrazione, gli headers qui saranno automaticamente corretti e non avranno alcun segreto.

Tutti i flussi partono da PBX, il che rende la configurazione più semplice. Se avete seguito correttamente gli step per le chiamate in entrata, le chiamate in uscita dovrebbero funzionare senza ulteriori aggiustamenti.

Disclaimer 1: Questa è solo una delle possibili configurazioni, ma è IMHO la più semplice nonchè quella che uso personalmente.
Disclaimer 2: Se nonostante abbiate seguito questo post il VoIP ancora non funziona, assicuratevi di aver seguito attentamente questo post.
Disclaimer 3: Se nonostante abbiate seguito il Disclaimer 2 il VoIP ancora non funziona, postare un packet capture che indichi dove si trova l'intoppo è sempre utile. Per ottenere il SIP flow come nelle immagini sopra, su Wireshark andare su Telephony->SIP Flows->Flow sequence.
Disclaimer 4: Se ho scritto qualcosa di sbagliato, per favore correggetemi.

    fracarza

    Il meccanismo di generazione delle credenziali è noto, se gli amministratori me lo permettono lo scriverò qui.

    è abbastanza inutile perché se non ti attivano il voip "per modem libero" quelle credenziali non vanno

    • [cancellato]

    fracarza Ottima e dettagliata guida! Solo un appunto:

    fracarza Inoltre bisogna avere una regola WAN:5060->PBX:5060 (generalmente nelle regole di WAN), che permetta ad INVITE di superare il Firewall.

    dovrebbe essere ridondante, perché se il PBX è registrato al proxy SIP, esiste nel router una connessione nella tabella degli stati e per tanto è automaticamente (?) tradotta senza dover aprire le porte. Alla peggio basta mettere una qualche funzione di keepalive delle registrazioni (io con roba assolutamente consumer e provder Eutelia ho sempre fatto così ed è sempre andata senza toccare nulla lato router, ma non so se FW sia più schizzinoso).

    fracarza Usare i DNS Fastweb (sono necessari per la risoluzione di voip.fastwebnet.it, è possibile usarli solo per questo dominio in particolare)

    Nope.

    $ dig +short voip.fastwebnet.it @8.8.8.8
    85.18.217.100

      ho un problema di flusso in entrata con fastweb, cioè il mio voip fin'ora ha sempre funzionato da una settimana ho il problema che "se mi chiamano sento chi ha chiamato e chi chiama mi sente" mentre "se chiamo io non sento chi chiamo ma chi chiamo mi sente"
      eppure io non ho modificato nulla dei parametri da quando ho il voip

      • Ninja77 ha risposto a questo messaggio
        • [cancellato]

        • Modificato

        Alcuni termini sono tipici di pfSense/OPNSense, ma non universali. Ad esempio "outbound NAT statico", Draytek lo chiama NAT/Open ports (che per loro è diverso da NAT/Port redirection, il primo non può mappare una porta sorgente su una diversa porta destinazione, il secondo sì). Altri router/firewall potrebbero usare una terminologia ancora diversa.

        Tecnicamente la porta usata dall'ATA/PBX non ha importanza purché poi sia correttamente configurato il NAT e il firewall per la porta in uso. Se si usano più provider VoIP è necessario usare (e configurare) una porta diversa per ogni provider (o usare indirizzi pubblici diversi, cosa non sempre possibile con IPv4).

        [cancellato] per tanto è automaticamente (?) tradotta senza dover aprire le porte. Alla peggio basta mettere una qualche funzione di keepalive delle registrazioni

        Hai le due opzioni: o apri la porta o usi il keepalive. La prima usa meno risorse perché non c'è il traffico continuo del keep alive la cui frequenza dipende da quanto dura la vita dello stato. Non a caso su pfSense/OPNSense conviene impostare "Firewall Optimization Options" (In System > Advanced > Firewall & NAT) a "Conservative" per far sì che gli stati durino più a lungo, e non trovarsi la connessione droppata.

        La porta aperta ha lo svantaggio, se non limitata agli IP del proxy SIP da firewall o da ATA/PBX, di essere accessibile a tutti, mentre il NAT (se non è full-cone) accetta pacchetti solo dagli IP ai quali ha inviato un pacchetto.

          [cancellato] Alla peggio basta mettere una qualche funzione di keepalive delle registrazioni

          Giustissimo, purtroppo però Fastweb fa un po' le bizze. Il keepalive generalmente è un SIP OPTIONS, ma Fastweb non risponde a queste queries se gli headers sono "corretti". Paradossalmente bisogna mettere un From user sbagliato per far funzionare il keepalive.
          Per questo non mi piace particolarmente e preferisco usare il port forward, che se limitato a voip.fastwebnet.it è sostanzialmente equivalente. Comunque anche questa è una soluzione più che valida.

          Urca, grazie! Devono averlo cambiato di recente perché ricordo che dovetti fare così un po' di tempo fa.

            Ninja77

            Avere IP pubblico (è naturalmente possibile usare il VoIP anche dietro CG-NAT, ma è meno naturale e IMHO avere modem libero senza IP pubblico con Fastweb non ha senso)

            credo di appartenere a questa categoria, cioè quelli che hanno FW senza un IP pubblico

              fracarza ottima guida, mi sento preso in causa in quanto amemtti ultimamente di aver pompato abbastanza su richiesta d'aiuto.
              Se fosse possibile anche mettere esempi pratici di configurazione, nel mio caso console 3cx.
              Quello che finora non ho fatto è il discorso DNS Fastweb.
              Sto però arrivando alla conclusione che nel mio caso il problema sia dovuto alle rotte interne del Debian 3cx su proxmox..

                apez84 anche se... Con software di terze parti installato sullo stesso pc ho sempre il problema del "forbidden"

                  [cancellato] Ad esempio "outbound NAT statico"

                  Quel tipo di NAT si chiama tecnicamente Static NAT (o PAT).

                  Comunque si purtroppo ogni sistema ha la sua terminologia, ho cercato di essere il più generico possibile ma se hai suggerimenti di pure.

                  [cancellato] Tecnicamente la porta usata dall'ATA/PBX non ha importanza purché poi sia correttamente configurato il NAT e il firewall per la porta in uso. Se si usano più provider VoIP è necessario usare (e configurare) una porta diversa per ogni provider (o usare indirizzi pubblici diversi, cosa non sempre possibile con IPv4).

                  Vero, ho voluto mantenere la configurazione "standard" perché in ogni caso avere trunk multipli è qualcosa di ben più avanzato.

                  Ninja77 In questo caso indovinare mi è un po' difficile, dovresti postare il SIP flow delle tue chiamate in uscita e in entrata.

                  apez84 anche se... Con software di terze parti installato sullo stesso pc ho sempre il problema del "forbidden"

                  Anche nel tuo caso sarebbe utile un packet capture.

                  • Ninja77 ha risposto a questo messaggio

                    fracarza
                    Se sai dirmi come fare ad ottenre il SIP flow volentieri

                      • [cancellato]

                      • Modificato

                      fracarza Giustissimo, purtroppo però Fastweb fa un po' le bizze. Il keepalive generalmente è un SIP OPTIONS, ma Fastweb non risponde a queste queries se gli headers sono "corretti".

                      Beh non dovrebbe importare. L'importante per il firewall è che ci sia un flusso di pacchetti che fa ricominciare il timer di eviction. Basta anche solo il semplice invio (almeno, in teoria).

                      Alla peggio resta valido il tuo consiglio di aprire le porte se con il keepalive non si risolve. Personalmente resto sempre mooolto restio ad esporre PBX o ATA, e non tutti gli apparati sono così sofisticati da permettere un'apertura condizionata all'host mittente, tipicamente su roba consumer non ce la si fa.

                      [cancellato] Hai le due opzioni: o apri la porta o usi il keepalive. La prima usa meno risorse perché non c'è il traffico continuo del keep alive la cui frequenza dipende da quanto dura la vita dello stato.

                      Chiaro ma un pacchetto di OPTIONS ogni 30s è totalmente ininfluente per gli apparati in casa dell'utente. Lato server/provider... affari suoi 😄

                      [cancellato] il NAT (se non è full-cone) accetta pacchetti solo dagli IP ai quali ha inviato un pacchetto.

                      Se sei registrato presso un proxy è costui a logica a doverti inviare gli INVITE, quindi il discorso full cone o meno non ha influenza.

                        Ninja77 Se sai dirmi come fare ad ottenre il SIP flow volentieri

                        L'ho aggiunto al post. Fai il packet capture e poi usi Wireshark->Telephony->SIP Flows->Flow sequence.

                        [cancellato] Basta anche solo il semplice invio (almeno, in teoria).

                        Ní: dal punto di vista di NAT si, ma se non riceve risposta il PBX pensa che il trunk sia down e smette di funzionare.

                        • Ninja77 ha risposto a questo messaggio

                          fracarza
                          se ho capito bene prima devo autorizzare la cattura dei pacchetti tramite packet capture che sarebbe tramite pktmon ? e poi avvio il software Wireshark per analizzare il traffico

                            Ninja77 Non avevo visto che avevi già un post con la tua configurazione.

                            Nel tuo caso ti consiglierei di salvare la configurazione che hai attualmente e di reimpostare NAT e Firewall come scritto in questo post. Essendo dietro CG-NAT non puoi usare STUN, e il tuo Gigaset non supporta l'inserimento di un indirizzo IP esterno, quindi ti rimane solo l'utilizzo del NAT helper SIP. Nella scheda "NAT passthrough" seleziona "SIP passthrough" abilitato con NAT helper (se c'è), e cerca nelle altre pagine di configurazione se c'è qualcosa di simile.

                            Se ancora non va dopo aver reimpostato NAT, Firewall, e NAT helper, allora esegui tcpdump dalla CPE e carica il packet capture su Wireshark come descritto sopra. Dovresti vedere che uno dei due flussi RTP manca. Se puoi fai la stessa cosa anche dal Gigaset.

                            scusatemi mi spiegate come posso sniffare il traffico del server pfsense che ho(la procedura), per controllare perchè mi da sempre registrazione fallita

                              ragazzi quando esce come codice il 404?not found indica che il numero non esiste sui loro server?

                                napdj https://docs.netgate.com/pfsense/en/latest/diagnostics/packetcapture/webgui.html. Attiva promiscuous mode, protocollo UDP, e le porte sia SIP che RTP.

                                napdj ragazzi quando esce come codice il 404?not found indica che il numero non esiste sui loro server?

                                Come risposta a SIP INVITE vuol dire che lo user negli headers To e From non è corretto. Deve essere il tuo numero di telefono senza prefisso internazionale.

                                Informativa privacy - Informativa cookie - Termini e condizioni - Regolamento - Disclaimer - 🏳️‍🌈
                                P.I. IT16712091004 - info@fibraclick.it

                                ♻️ Il server di questo sito è alimentato al 100% con energia rinnovabile