Il Nokia E60 ha un client voip SIP a bordo. A parte che la configurazione sembra oscenamente complessa, e che ovviamente qualche bug del software aiuta a rendere le cose piu` interessanti, piu` o meno in prima battuta devo dire che funziona.
La configurazione di Asterisk (sip.conf) che sto usando ora e`:
[13] type=friend context=interni username=13 secret=password dtmfmode=rfc2833 host=dynamic nat = yes callerid= "Kurgan Cell VOIP" <13> canreinvite=no pickupgroup=1 callgroup=1 maxexpirey=30 defaultexpirey=25 qualify=yes
Una nota a riguardo del file extensions.conf: se sul cellulare si hanno numeri memorizzati nel formato "+39xxxx", ovvero con il prefisso internazionale, e` possibile aggiungere un paio di righe all'extensions.conf in modo da fare funzionare le chiamate con il +39 davanti via internet. Supponendo che normalmente per uscire dal centralino si usi lo zero, ci sara` una riga tipo:
exten => _0.,1,Dial(SIP/ehiweb/${EXTEN:1})
Bene, aggiungendone una cosi`:
exten => _+39.,1,Dial(SIP/ehiweb/${EXTEN:3})
Si fa in modo che le chiamate ai numeri che iniziano con il +39 vengano mandate fuori previa l'eliminazione del "+39" davanti.
Dovrebbe essere semplice anche aggiungere un sistema generico per le internazionali, ma non l'ho provato. Qualcosa tipo:
exten => _+39.,1,Dial(SIP/ehiweb/${EXTEN:3}) exten => _+.,1,Dial(SIP/ehiweb/00${EXTEN:1})
Questo dovrebbe intercettare le chiamate al +39 (italia) e togliere il "+39", mentre qualsiasi altra chiamata a "+qualcosa" viene modificata togliendo il "+" e mettendo "00" in testa. Quindi, per dire, una chiamata a "+44xxxx" diventa "0044xxxxx", che e` la sintassi corretta per fare una internazionale con il voip.
E` importante notare che il telefono non supporta la notifica di messaggi in attesa in segreteria, per cui non posso usare il comando "mailbox=xx". Se ci provo, tendenzialmente il telefono non riceve piu` chiamate, o meglio (fa piu` ridere) inizia a suonare quando l'asterisk e` andato in timeout e rinuncia alla chiamata.
Nota: in alcuni campi il telefono aggiunge da solo "sip:" in testa ai valori, e` normale.
Menu` Tools, Settings, Connection, SIP settings:
13@10.1.42.254
. La cosa curiosa e` che pare che l'indirizzo IP qui indicato non venga mai usato di fatto nelle connessioni... ah, mistero!Poi, nel menu` "Proxy Server":
Quindi si risale di un livello e si va nel menu` "Registrar server"
Il telefono non supporta alcun protocollo per aggirare i problemi del NAT, quindi per farlo funzionare attraverso un NAT (Asterisk su ip pubblico, telefono dietro un NAT) occorre fare un po` di modifiche alla configurazione di Asterisk, pero` alla fine funziona.
Mettendo "nat=yes" nella configurazione di Asterisk, questo riesce a fare passare correttamente i pacchetti SIP, ignorando l'indirizzo ip proposto dal telefono, che propone sempre il proprio IP privato, ed usando come destinatario del traffico SIP l'indirizzo IP dal quale arriva il traffico SIP generato dal telefono, ovvero l'indirizzo pubblico del router che lo sta nattando.
Il problema e` che lo stesso deve essere fatto anche per i pacchetti RTP. In pratica, Asterisk inizia a mandare i propri pacchetti RTP all'indirizzo fornitogli dal telefono (quindi quello privato) e questi vanno ovviamente persi. Nel momento in cui, pero`, un pacchetto RTP che e` partito dal telefono arriva all' Asterisk, questo provvede a correggersi ed inizia a mandare i propri pacchetti all'indirizzo (ip e porta) dal quale ha ricevuto quelli del telfono. Questo pero` comporta che Asterisk abbia il firewall sfondato, ed accetti pacchetti UDP da chiunque, non avendo modo di sapere a priori da chi aspettarsi traffico RTP e da chi no. Il fatto che attualmente nel kernel di Linux manchi un helper per il SIP (che potrebbe mettere in relazione i flussi RTP con quelli SIP) o che manchi un modulo che fa il match del solo protocollo RTP fa si` che la soluzione non sia proprio sicurissima.
In pratica, occorre aprire il firewall della macchina Asterisk per accettare da chiunque connessioni sulle porte UDP usate per l'RTP. Il rischio e` che qualche altro demone si metta in ascolto su una delle porte "aperte" e quindi venga esposto al pubblico involontariamente. Per limitare i danni, ho ridotto il numero delle porte valide per l' RTP in Asterisk, in modo che questa probabilita` sia minore. Occorre ovviamente anche fare attenzione alla configurazione del sistema per cercare di evitare che una cosa del genere possa succedere.
4578.715141 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4578.721117 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable) 4579.577444 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4579.740908 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable) 4580.578160 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4580.768819 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable) 4581.577890 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4581.997366 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable) 4582.578600 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4582.910968 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable) 4583.578332 10.1.42.254 -> 10.1.42.200 SIP/SDP Request: INVITE sip:13@10.1.42.200, with session description 4583.730873 10.1.42.200 -> 10.1.42.254 ICMP Destination unreachable (Port unreachable)
In questo caso succede una cosa ridicola: dopo che l' asterisk e` andato in timeout, il telefono suona!
Ho fatto prove con "qualify=yes" in asterisk, e ho visto che il telefono, seppure risponda al ping, in determinate condizioni ignora qualsiasi pacchetto SIP. A naso, mi viene da dire che il client SIP si addormenta in qualche modo. Sul display del telefono risulto ancora registrato, ma di fatto non sono raggiungibile... e quando chiamo, il telefono si impalla e non accetta piu` comandi escluso il tasto "vivavoce" che funziona ancora. Devo spegnerlo per farlo riprendere.