Configurazione del Nokia E60
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.
Configurazione di Asterisk
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.
Configurazione del telefono
Nota: in alcuni campi il telefono aggiunge da solo "sip:" in testa ai valori, e` normale.
Menu` Tools, Settings, Connection, SIP settings:
- Profile name: quello che volete
- Service profile: IETF
- Default Access Point: l' access point WLAN che volete usare (si sceglie dalla lista)
Public User Name: qui ci va lo username impostato in asterisk in sip.conf, poi "@" e poi l'indirizzo ip dell'asterisk. Apparentemente qualsiasi altra cosa provoca il fallimento della registrazione senza che passi nemmeno un pacchetto fra il telefono e l'asterisk (due ore per scoprirlo!). Quindi, per esempio, nel nostro caso ci va 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!
- Use compression: NO
- Registration: Always On (se volete ricevere le chiamate) altrimenti "When needed"
- Use Security: NO (se ci si mette YES la registrazione fallisce, anche se non capisco perche`. Tra parentesi, la sicurezza la usa anche se si mette "no", perche` si autentica sull' Asterisk.)
Poi, nel menu` "Proxy Server":
- Proxy Server Address: L'indirizzo IP (o hostname) del server Asterisk
- Realm: Il realm definito in Asterisk. Attenzione, che di default il telefono ti mette la prima lettera della parola maiuscola, il che e` MALE. Quindi, ricordate di premere il tasto "#" per passare in minuscolo.
- User Name: lo username SIP (nel nostro caso e` "13")
- Password: La password (nel nostro caso e` "password"
- Allow Loose Routing: con il default "yes" funziona, pero` devo capire a cosa serve. Immagino che sia una cosa simile al "reinvite", pero` non ne sono sicuro. Nel dubbio, ho negato il reinvite nell' Asterisk, il che dovrebbe rendere "nulla" questa configurazione.
- Transport Type: UDP
- Port: 5060
Quindi si risale di un livello e si va nel menu` "Registrar server"
- Registrar server Address: L'indirizzo IP (o hostname) del server Asterisk
- Realm: lasciare vuoto (none)
- Username: lasciare vuoto (none)
- Password: lasciare vuoto (none). Immagino che questi tre campi prendano il default dal proxy server...
- Transport Type: UDP
- Port: 5060
Nota importante sul NAT
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.
- In rtp.conf (Asterisk) impostare i limiti delle porte a qualcosa di molto piu` restrittivo del default da 10.000 a 20.000, dal momento che ho solo 5 telefoni, ho messo un range di 50 porte, che dovrebbero bastare abbondantemente. Credo che ne bastino due per ogni connessione stabilita contemporaneamente.
- Controllare con "netstat -nlu" che nessuno stia in ascolto sul range scelto (nota: asterisk non tiene le porte "impegnate", ma le impegna quando gli servono)
- Aprire nel firewall il traffico RTP entrante su quelle porte a chiunque.
- Ovviamente va aperta a tutti anche la 5060 per il SIP, altrimenti il telefono non puo` registrarsi, ma questo e` vero indipendentemente dal NAT.
Considerazioni varie da approfondire
- Mi sono accorto che spesso ci sono microinterruzioni nella conversazione, usando il voip. Capita anche che diventino significativamente fastidiose, veramente, sia per frequenza che per durata. Il fatto che Asterisk gestisca i flussi RTP in modo sincrono peggiora ulteriormente le cose. La mia idea e` che questo problema sia dovuto alla WLAN che ogni tanto perde pacchetti, ma non ho alcun modo di verificarlo non potendo usare il voip "via filo" con questo telefono. I problemi si presentano in modo simile sia sotto il mio AP di casa che quando sono connesso da fuori via internet, quindi sia con che senza NAT.
- Il telefono gestisce un solo access point per ogni configurazione SIP, il che significa che se si usano piu` access point (veramente, piu` ESSID) diversi per accedere allo stesso server SIP, occorre configurare un server SIP per ogni access point (per fortuna gli account si possono copiare) modificando solo l'access point di default. Tutti gli account SIP vanno poi inseriti nello stesso gruppo sotto "Settings, Internet Tel Settings".
- Non ho capito perche`, ma ogni tanto il telefono rifiuta le richieste SIP in ingresso dall' Asterisk.
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.