Aggiornamento, dopo parecchie decine di ore di studio sulla wiki di Asterisk, YouTube, FibraClick, e vari forum, sono arrivato a creare queste configurazioni, che mi permettono di chiamare e ricevere. Mi aspettavo problemi col NAT eppure sia SIP che RTP funzionano, non ho effettuato alcun port forwarding, non uso STUN, né SIP ALG sul router.

Ecco pjsip.conf (bob è il telefono VoIP)

[udp_transport]
type = transport
protocol = udp
bind = 0.0.0.0

[bob]
type = endpoint
context = internal
disallow = all
allow = ulaw,alaw
aors = bob
auth = bob_auth

[bob]
type = aor
max_contacts = 1
qualify_frequency = 25

[bob_auth]
type = auth
auth_type = userpass
username = bob
password = 12345678

[telecom]
type = endpoint
aors = telecom
outbound_proxy = sip:xxxxx.co.imsw.telecomitalia.it\;lr
disallow = all
allow = ulaw,alaw
context = external
outbound_auth = telecom_auth
direct_media = no

[telecom]
type = aor
contact = sip:telecomitalia.it
outbound_proxy = sip:xxxxx.co.imsw.telecomitalia.it\;lr
qualify_frequency = 25

[telecom_auth]
type = auth
auth_type = userpass
username = +39NUM_TEL
password = SIP_KEY
realm = telecomitalia.it

[telecom_reg]
type = registration
endpoint = telecom
transport = udp_transport
outbound_auth = telecom_auth
server_uri = sip:telecomitalia.it
client_uri = sip:+39NUM_TEL@telecomitalia.it
outbound_proxy = sip:xxxxx.co.imsw.telecomitalia.it\;lr
contact_user = +39NUM_TEL
expiration = 86400
line = yes

[telecom_id]
type = identify
endpoint = telecom
match = xxxxx.co.imsw.telecomitalia.it
srv_lookups = yes

E il dialplan extensions.conf. Permette solo chiamate verso l'Italia.

[external]
exten => +39NUM_TEL,1,Goto(internal,001,1)

[internal]
exten => 001,1,Verbose(2, Chiamata in entrata da "${CALLERID(num)}")
same => n,Dial(PJSIP/bob)
same => n,Hangup()

exten => _X.,1,Set(SAFE_EXTEN=${FILTER(0-9,${EXTEN})})
same => n,Set(ORIGINAL_EXTEN=${EXTEN})
same => n,GotoIf($["${EXTEN}" != "${SAFE_EXTEN}"]?error,1)
same => n,Verbose(2, Chiamata in uscita verso "${SAFE_EXTEN}")
same => n,Dial(PJSIP/${SAFE_EXTEN}@telecom)
same => n,Hangup()

exten => _+39X.,1,Set(SAFE_EXTEN=+39${FILTER(0-9,${EXTEN:3})})
same => n,Set(ORIGINAL_EXTEN=${EXTEN})
same => n,GotoIf($["${EXTEN}" != "${SAFE_EXTEN}"]?error,1)
same => n,Verbose(2, Chiamata in uscita verso "${SAFE_EXTEN}")
same => n,Dial(PJSIP/${SAFE_EXTEN}@telecom)
same => n,Hangup()

exten => error,1,Verbose(2, Chiamata in uscita rifiutata, numero "${ORIGINAL_EXTEN}" non valido)
same => n,Hangup()

@eutampieri Confermo che le chiamate in uscita verso TIM funzionano. Inoltre, alla luce di quanto scritto qui credo che il tuo dialplan sia bypassabile per chiamare all'estero.

    Marco25 si sì, con il mio dialplan prendo anche i numeri tipo 00xx quindi si chiama all’estero. In quello vero in realtà tutte le chiamate che iniziano con +qualcosa o 00qualcosa con qualcosa diverso da 39 vengono fatte uscire su un altro trunk per evitare salassi 😉

    Mi sa che ci risentiremo per le chiamate in uscita su rete TIM.
    @[cancellato] può essere che il problema derivi dal fatto che OP abbia usato PJSIP e io SIP “normale”?

      Marco25 pjsip.conf

      A proposito, migrerò il mio template a PJSIP visto che pare che sia meglio (questo mio setup è così da asterisk 13 è solo da poco ha questo problema)

      Grazie per il link a safe asterisk, lo leggerò fu sicuro!

      • [cancellato]

      eutampieri può essere che il problema derivi dal fatto che OP abbia usato PJSIP e io SIP “normale”?

      Può essere - magari c'è qualcosa che viene parsato o riconosciuto in modo diverso - ma non sono un esperto di Asterisk.

      Marco25 ho fatto le stesse tue configurazioni ma va ancora peggio (?!): le chiamate arrivano in ingresso tre volte e in uscita proprio non vanno

      Confermo in parte. Questa mattina non ho avuto problemi con le chiamate in entrata, in queste ore però sono ripetute. Ho fatto un po' di prove, se disattivo il dialplan viene loggato più volte l'avviso circa l'assenza dell'estensione (come previsto).

      NOTICE[1283]: res_pjsip_session.c:4027 new_invite: telecom: Call (UDP:OUTBOUND_PROXY:5060) to extension '+39NUM_TEL' rejected because extension not found in context 'external'.

      Quindi pare che TIM mandi più INVITE per chiamata. Ciononostante se si risponde la chiamata ha successo, la voce passa in entrambe le direzioni, mentre per riagganciare bisogna rifiutare tutte le chiamate in ingresso.
      Inoltre ho notato che non è sempre tre volte. Può essere due, uno, ma anche quattro, ciò mi fa pensare che il centralino di TIM si aspetti una qualche risposta da Asterisk che non arriva sempre in tempo e quindi manda di nuovo l'INVITE.
      Nessun problema invece con le chiamate in uscita, esattamente cosa intendi per "non vanno"? La console di asterisk cosa ti dice? (asterisk -rvvv e chiami).

        Marco25 everyone is busy/congested. Da wireshark vedo un errore SIP

        
          == Setting global variable 'SIPDOMAIN' to 'hostname.lan'
            -- Executing [cell@phones:1] NoOp("PJSIP/interno-00000003", "") in new stack
            -- Executing [cell@phones:2] Progress("PJSIP/interno-00000003", "") in new stack
            -- Executing [cell@phones:3] Dial("PJSIP/interno-00000003", "PJSIP/cell@telecom,60,KT") in new stack
               > 0x7f2830ffb0 -- Strict RTP learning after remote address set to: 192.168.1.121:4008
            -- Called PJSIP/3246378810@telecom
               > 0x7f2830ffb0 -- Strict RTP switching to RTP target address 192.168.1.121:4008 as source
          == Everyone is busy/congested at this time (1:0/0/1)
            -- Executing [cell@phones:4] Dial("PJSIP/eugenio-00000003", "PJSIP/cell@telecom2,60,KTm") in new stack
            -- Called PJSIP/cell@telecom2
            -- Started music on hold, class 'default', on channel 'PJSIP/interno-00000003'
          == Everyone is busy/congested at this time (1:0/0/1)
            -- Stopped music on hold on PJSIP/interno-00000003
            -- Auto fallthrough, channel 'PJSIP/interno-00000003' status is 'CHANUNAVAIL'

        Marco25 ciò mi fa pensare che il centralino di TIM si aspetti una qualche risposta da Asterisk che non arriva sempre in tempo e quindi manda di nuovo l'INVITE.

        Provo con 100rel=yes in endpoint a vedere se cambia qualcosa

        Quella in giallo da problemi, quella in verde va

        • Marco25 ha risposto a questo messaggio

          Dopo Called PJSIP/NUMERO_CHIAMATO@telecom Asterisk mi dice

              -- PJSIP/telecom-00000001 is making progress passing it to PJSIP/bob-00000000
              -- PJSIP/telecom-00000001 is making progress passing it to PJSIP/bob-00000000
              -- PJSIP/telecom-00000001 answered PJSIP/bob-00000000
              -- Channel PJSIP/telecom-00000001 joined 'simple_bridge' basic-bridge <...>
              -- Channel PJSIP/bob-00000000 joined 'simple_bridge' basic-bridge <...>
              -- Channel PJSIP/bob-00000000 left 'simple_bridge' basic-bridge <...>
            == Spawn extension (internal, NUMERO_CHIAMATO, 5) exited non-zero on 'PJSIP/bob-00000000'
              -- Channel PJSIP/telecom-00000001 left 'simple_bridge' basic-bridge <...>

          Non c'è Strict RTP learning after remote address... che comunque dovrebbe essere abilitato di default secondo quanto scritto nel file rtp.conf. Altra differenza è che nel mio dialplan non ho aggiunto le opzioni KTm all'applicazione Dial.

          Inoltre ho disattivato il caricamento automatico dei moduli (autoload = no in modules.conf) e aggiunto di volta in volta i moduli strettamente necessari per le funzionalità. Oltre al file dei moduli, gli unici due file che ho riscritto sono quelli postati sopra.

            eutampieri Quella in giallo da problemi, quella in verde va

            Queste sono chiamate in entrata, no? Falliscono anche loro?

              Marco25 si, sono in entrata. Quella verde funziona, quella arancione arrivano troppi invite e la seconda volta che arriva i telefoni stanno già suonando e quindi parte la segreteria.

              Marco25 ho risolto aggiungendo:

                      from_user=+390XX
                      from_domain=telecomitalia.it

              nell'endpoint

              • Marco25 ha risposto a questo messaggio

                eutampieri ho risolto aggiungendo

                Strano, io non li avevo settati esplicitamente e difatti From: conteneva nome_endpoint@ip_privato, ma non ho riscontrato problemi con le chiamate in uscita. Hai provato anche in uscita verso TIM?

                eutampieri Quella verde funziona, quella arancione arrivano troppi invite e la seconda volta che arriva i telefoni stanno già suonando e quindi parte la segreteria.

                Devo capire se è mitigabile tramite dialplan, rifiutando le chiamate spurie.

                  Marco25 Hai provato anche in uscita verso TIM?

                  Si, funziona!

                  Per il problema degli invite duplicati a me magicamente ora funziona, forse 100rel=yes è servito a qualcosa

                  • Marco25 ha risposto a questo messaggio

                    eutampieri Per il problema degli invite duplicati a me magicamente ora funziona, forse 100rel=yes è servito a qualcosa

                    Effettivamente per il momento non ricevo invite duplicati ma non può essere per via di 100rel = yes, essendo questo predefinito su yes.

                      Ho notato che se riavvio Asterisk più volte a breve distanza di tempo (poche ore o anche un'ora), TIM aumenta il numero di INVITE. La butto lì, forse è una balla: può essere il loro centralino abbia qualche euristica per cui se rileva più REGISTER a breve distanza pensa che il centralino dell'utente non funzioni bene e quindi invii più INVITE nel tentativo che il centralino risponda a uno di questi?

                      9 mesi dopo

                      Aggiornamento: può verificarsi una race condition per cui all'avvio del sistema Asterisk parta prima che l'ora sia stata sincronizzata via NTP. Ciò fa sì che il centralino non sia effettivamente registrato rendendo impossibile ricevere chiamate (ma se si effettua una chiamata in uscita successivamente, tutto torna a funzionare).

                      Per risolvere è sufficiente avviare Asterisk dopo che l'ora sia sincronizzata. Per farlo, abilitare il servizio preposto allo scopo con systemctl enable systemd-time-wait-sync.service e modificare unità systemd di Asterisk in modo da richiedere la sincronizzazione dell'ora: systemctl edit asterisk.service, incollare le seguenti righe, salvare e chiudere l'editor di testo.

                      [Unit]
                      After=time-sync.target
                      Wants=time-sync.target
                      9 mesi dopo

                      Ciao a tutti, so che la discussione è molto vecchia, ma avevo anche io il problema degli INVITE multipli e l'ho risolto definitivamente con questa piccola modifica all'extensions.conf:

                      [internal]
                      exten => 001,1,Verbose(2, Chiamata in entrata da "${CALLERID(num)}")
                      same => n,Answer()
                      same => n,Dial(PJSIP/bob)
                      same => n,Hangup()

                      In pratica ho aggiunto l'azione di Answer() prima del Dial() e non ho più avuto nessun problema. Anche la history delle chiamate su Zoiper, dove prima ne vedevo decine per ogni singola chiamata, ora è pulitissima.

                      Spero possa essere utile a qualcuno.

                      Un saluto.

                        JediKngt il problema degli INVITE multipli

                        Sono in grado di riprodurre in maniera consistente il problema effettuando diverse registrazioni e deregistrazioni a breve distanza di tempo (minuti o ore), il che accadeva agli inizi quando cercavo di capire come configurare Asterisk tra un errore e l'altro.

                        Da quando ho raggiunto la configurazione definitiva non ricevo INVITE multipli fintanto che le registrazioni sono distanziate almeno di qualche giorno (in caso di interruzione della corrente oppure aggiornamento del kernel e quindi riavvio del sistema) ma forse è sufficiente un tempo appena maggiore di expiration.

                        JediKngt In pratica ho aggiunto l'azione di Answer() prima del Dial() e non ho più avuto nessun problema.

                        In questo modo stai rispondendo immediatamente a qualsiasi chiamata in ingresso, anche se non ti sembra visto che poi la inoltri a bob a cui squilla.

                        https://wiki.asterisk.org/wiki/display/AST/Answer%2C+Playback%2C+and+Hangup+Applications

                        If Asterisk is simply going to pass the call off to another device using the Dial() application, you probably don't want to answer the call first.

                          2 mesi dopo

                          Marco25

                          Si Marco, hai ragione. Alla fine funziona, me effettivamente non è la risoluzione del problema. Le ho provate quasi tutte, ma togliendo l'answer da lì sembra che la chiamata proveniente dal provider venga inoltrata più volte al Dial, in particolare quando la rifiuto sul telefono ricevente. Nei log si generano più righe per lo stesso evento e prendono tutte "BUSY". Devo studiare meglio la configurazione per capire come evitarlo.

                          Un saluto.

                          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