ConfigurazioneDiSER
SER (Sip Express Router) e' un server SIP opensource. Funge da Sip registar,proxy e redirect server. In Sapientel si e' scelto di usare la versione 0.9.6, per la sua compatibilità con SEMS. Per sfruttare SEMS (Sip express Media Server), SER deve essere configurato in maniera tale da redirigere alcuni tipi di chiamate verso SEMS.
Prerequisiti
SER non richiede particolari requisiti. Bisogna solo prestare attenzione ad avere le librerie mysql se si desidera il supporto mysql.
Installazione
Dal momento che Sapientel utilizza il supporto mysql per le registrazioni, in fase di compilazione bisogna usare il comando
make include_modules="mysql" modules
per far compilare il modulo mysql.
Configurazione
I file di configurazione di SER hanno estensione .cfg
. Per essere usato in abbinamento a SEMS, SER richiede di essere lanciato 2 volte con 2 diversi file di configurazione: sermain.cfg
e sersems.cfg
. Nel primo,in ascolto sulla porta 5060, si caricano tutti i moduli necessari anche per l'autenticazione, e si crea poi il forward di tutti i numeri comincianti con 1 verso la seconda istanza di SER in ascolto sulla porta 5070. Qui poi si smistano verso SEMS, i vari tipi di chiamata (annuncio,voicemail,conferenza,echo...). La prima istanza di SER e' quella principale che gestisce tutte le chiamate,registrazioni ecc. La seconda istanza serve per interfacciarsi con SEMS. Il lancio di entrambe si rende necessario, se si vuole che il telefono del client squilli prima di essere messo in contatto con un applicativo SEMS.
MySql
Innanzitutto SER fornisce lo script ser_mysql.sh
per la creazione del database. Per abilitare il supporto mysql,e quindi mantenere in memoria fisica le registrazioni, bisogna inserire nel file sermain.cfg
le seguenti righe:
- per l'accesso al database:
fifo_db_url="mysql://utente:password@localhost/ser"
- per caricare i moduli per l'autenticazione:
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
modparam("auth_db|uri_db|usrloc", "db_url", "mysql://utente:password@localhost/ser")
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
- per la gestione delle registrazioni, nel blocco "REGISTER Message Handler", si inserisce il controllo
if (!www_authorize("","subscriber")) {
www_challenge("","0");
break;
};
if (!check_to()) {
sl_send_reply("401", "Unauthorized");
break;
};
consume_credentials();
- per permettere le chiamate a chi si autentica con successo, nel blocco "INVITE Message Handler" si inserisce
if (!proxy_authorize("","subscriber")) {
proxy_challenge("","0");
break;
} else if (!check_from()) {
sl_send_reply("403", "Use From=ID");
break;
};
consume_credentials();
Alias
Abbiamo individuato che per gestire i RR SRV per il domininio ing.uniroma1.it
, occorre ricorrerre alla direttiva alias
. La si inserisce quindi nel file sermain.cfg
nel seguente modo:
alias=ing.uniroma1.it
Mediaproxy
Gli utenti dietro NAT/router possono avere problemi di comunicazione se non configurano appropriatamente uno STUN server. SER mette a disposizione due alternative : mediaproxy e RtpProxy. Un primo confronto a livello di features rivela che: Mediaproxy
- Scritto in python
- Permette l'uso di DNS srv records, per distribuire il carico su piu' server
- E' dotato di una piccola interfaccia grafica,che fornisce statistiche sul server,i flussi audio,e i clients. (vedi lo screenshot,che mostra i flussi media, creati con l'utility fakeconversation.py)
RtpProxy
- Scritto in C
- Non permette di distribuire il carico
- Non fornisce strumenti di monitoraggio
In questa fase iniziale, per agevolare la configurazione del proprio User Agent agli utenti dietro NAT/router, si e' scelto di utilizzare il modulo mediaproxy. In questo modo SER riconosce se si e' dietro NAT e reindirizza i pacchetti al mediaproxy per la gestione dei media.
Si e' proceduto nel seguente modo: installato il pacchetto mediaproxy, e nel file di configurazione mediaproxy.ini
si sono modificati i seguenti parametri nella sezione [MediaProxy]
:
;start = yes
;socket = /var/run/mediaproxy.sock
;group = ser
;listen = 151.100.122.144
;allow = 151.100.122.144
;proxyIP = 151.100.122.144
Nel file di configurazione di SER, per abilitare il mediaproxy si e' proceduto nel seguente modo:
- Caricamento dei moduli:
loadmodule "/usr/local/lib/ser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/ser/modules/nathelper.so"
nathelper
,in genere puo' far intendere che stiamo usando RtpProxy. Invece in questo caso,la usiamo perche' fornisce le funzioni per determinare se un client e' dietro NAT o meno.
- Modifica dei parametri:
modparam("nathelper", "rtpproxy_disable", 1)
modparam("nathelper", "natping_interval", 0)
modparam("mediaproxy","natping_interval", 30)
nathelper
che non stiamo usando RtpProxy, disabilitato il natping di nathelper,e settato il ping di mediaproxy a 30 secondi.
Creazione del socket di comunicazione tra SER e Mediaproxy
modparam("mediaproxy","mediaproxy_socket", "/var/run/mediaproxy.sock")
Individuazione dei clients simmetrici (inviano e ricevono sulla stessa porta) e asimmetrici:
modparam("mediaproxy","sip_asymmetrics","/usr/local/etc/ser/sip-clients")
modparam("mediaproxy","rtp_asymmetrics","/usr/local/etc/ser/rtp-clients")
Si setta un flag (il 6, in questo caso) per immagazzinare e mantenere le informazioni sui clients NATtati.
modparam("registrar", "nat_flag", 6)
- Nella seziona
Record Route Section
:
if (method=="INVITE" && client_nat_test("3")) {
# INSERT YOUR IP ADDRESS HERE
record_route_preset("151.100.122.144:5060;nat=yes");
} else if (method!="REGISTER") {
record_route();
};
- Nella sezione
Loose Route Section
:
if (client_nat_test("3") || search("^Route:.*;nat=yes")) {
setflag(6);
use_media_proxy();
};
nat=yes
. In caso affermativo viene settato il flag 6,per referenze successive,e imposto l'uso di mediaproxy.
- Nella sezione
REGISTER Message Handler
:
if (!search("^Contact:[ ]*\*") && client_nat_test("7")) {
setflag(6);
fix_nated_register();
force_rport();
};
- Nella sezione
INVITE Message Handler
:
if (client_nat_test("3")) {
setflag(7);
force_rport();
fix_nated_contact();
};
- Una nuova sezione
route[4]
:
if (isflagset(6) || isflagset(7)) {
if (!isflagset(8)) {
setflag(8);
use_media_proxy();
};
};
ENUM
E' stato abilitato il supporto ad ENUM per le chiamate uscenti, interrogando la radice e164.org.
Per abilitare il modulo ENUM in SER si e' inserito:
loadmodule "/usr/local/lib/ser/modules/enum.so"
e poi nella sezione di route :
if (uri=~ "sip:\+[0-9]+@" ){
if (!enum_query("e164.org."))
{enum_query("e164.arpa.");
};
};
Routing verso SEMS
Nella prima istanza di SER,nel file semain.cfg
, per redirigere le chiamate comincianti con 1 si inserisce, nel blocco "INVITE Message Handler":
if (uri =~ "sip:1.*@") {
log("Forwarding to 5070");
rewritehostport("localhost:5070");
t_relay_to_udp("localhost","5070");
break;
}
Nella seconda istanza, nel file sersems.cfg
si apre il socket per la comunicazione con SEMS
unix_sock="/tmp/ser_sock"
Si aggiungono poi, nel blocco principale di route
, le chiamate alle varie applicazioni nella forma:
if (uri =~ "sip:1xx.*@") {
if (!t_write_unix("/tmp/sems_sock","nome_applicazione")){
log("could not contact nome_applicazione\n");
t_reply("500","impossibile not contact media server");
break;
}
break;
}
Link alla documentazione
- SER Getting Started (versione PDF)
- AboutSER una guida abbastanza esauriente, anche se un pò datata, alla manipolazione del file di configurazione di SER.
- Assieme al sorgente, sono distribuiti anche dei files di documentazione, mentre presso IpTel, si dichiara che la documentazione è in fase di intensa revisione.
Pagine che puntano a questa: