Posts tagged asterisk

callme

Una semplice casella vocale con Asterisk

0

Per motivi strettamente “politici” mi sono trovato a dover realizzare una veloce e semplice casella vocale dove le persone, chiamando un certo numero di telefono (CloudItalia Orchestra – ex EuteliaVoip), possono lasciare il loro messaggio.

Contemporaneamente alla registrazione del messaggio, viene inviata una mail ad un certo indirizzo di posta elettronica contenente il file wav della registrazione, grazie ad un semplice script Perl.

Entriamo adesso nel dettaglio della programmazione.

Dopo aver installato Asterisk ed essendosi assicurati che funzioni correttamente, ecco il dialplan relativo alla voicebox:

VBOX_PATH=[directory dove registrare i messaggi]
VBOX_DEST=[indirizzo e-mail dove inviare la notifica]

[voicebox]
exten => _X.,1,Answer
exten => _X.,2,Wait(2)
exten => _X.,1,Playback(welcome)
exten => _X.,n,Playback(beep)
exten => _X.,n,Set(VBOX_FILE=${VBOX_PATH}/rec-${CALLERID(num)}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.wav)
exten => _X.,n,Record(${VBOX_FILE}|10|600)
exten => _X.,n,Noop(Sending mail notice for ${VBOXFILE})
exten => _X.,n,System(/var/lib/asterisk/cb-voicebox.pl ${CALLERID(NUM)} ${EXTEN} ${VBOX_FILE} ${VBOX_DEST})
exten => _X.,n,Wait(1)
exten => _X.,n,Playback(thanks)
exten => _X.,n,Wait(2)
exten => _X.,n,Hangup

lo script Perl cb-voicebox.pl ha 4 argomenti: il numero del chiamante, il numero chiamato, il path al file .wav registrato e l’indirizzo e-mail dove spedire la notifica:

#!/usr/bin/perl
use MIME::Lite;
use Net::SMTP;

$caller = $ARGV[0];
$vbox = $ARGV[1];
$vboxfile = $ARGV[2];
$to_address = $ARGV[3];
$vboxtime = localtime;

### Mittente e server SMTP
my $from_address = 'vbox@[dominio]';
my $mail_host = 'localhost';

### Oggetto e corpo della mail
my $subject = "Nuovo messaggio vocale da $caller nella VBOX $vbox";
my $message_body = "Salve, questo messaggio automatico per segnalare che nella casella vocale del numero $vbox e stato lasciato un messaggio da $caller in data $vboxtime. In allegato il file audio.";

$msg = MIME::Lite->new(
 From => $from_address, 
 To => $to_address,
 Subject => $subject,
 Type =>'multipart/mixed'
) or die "Error creating multipart container: $!\n";

### Aggiungi il testo del messaggio
$msg->attach (
 Type => 'TEXT',
 Data => $message_body
) or die "Error adding the text message part: $!\n";

### Allega il file audio, con il corretto MIME Type (audio/wav)
$msg->attach (
 Type => 'audio/wav',
 Path => $vboxfile,
 Filename => 'messaggio.wav',
 Disposition => 'attachment'
) or die "Error adding $vboxfile: $!\n";

### Invia la mail
MIME::Lite->send('smtp', $mail_host, Timeout=>60);
$msg->send;

Semplice ed efficace !

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

hacked

Proteggere un centralino VoIP con IPTables

0

Francesco mi scrive:

Salve Dott. Pinassi
ho letto con attenzione il suo Blog per la parte di configurazione dell’Iptables.
Ho un problema con un cliente: ho installato e configurato un sistema Voip basato su asterisk (Centos) e per far connettere alcuni operatori dall’esterno al centralino hanno dovuto aprire un indirizzo pubblico. Ovviamente l’hanno bucato con conseguente consumo di chiamate !
 
Utilizzando iptables pensavo di bloccare i mac sconosciuti ma non ho capito se si può fare una regola cosi per connessioni esterne.
 
Ha qualche suggerimento?
 
Grazie
Francesco

Caro Francesco, aprire con un IP pubblico un centralino VoIP è sempre rischioso, come ben sanno coloro che hanno ricevuto fatture esorbitanti.

Come suggeriscono molti articoli tecnici (ad es. FreePBX Backdoor Passwords Pose Asterisk Security Threat), la prima cosa è utilizzare password sicure e cambiare sempre quelle di default. Oltre alle password, i centralini Asterisk devono essere sempre ben protetti anche a livello di rete. Alcuni buoni articoli per iniziare sono:

Come firewall l’ottimo IPTABLES che troviamo già presente nella maggioranza delle distribuzioni *nix è più che adeguato. Personalmente adoro usarlo con l’ausilio di Vuurmuur, che mi permette una configurazione più semplice dei servizi, delle zone, degli IP abilitati -o meno- a raggiungere la mia rete VoIP.

Pertanto, per rispondere alla tua domanda, è opportuno che il firewall sia configurato per lasciar passare solamente connessioni da e per gli IP degli operatori esterni, senza eccezioni, anche se questa pratica potrebbe non proteggerti da attacchi “IP spoofing“. Una soluzione sicura potrebbe essere l’uso di un tunnel (OpenVPN, IPSEC) anche se i tempi di latenza, sempre critici nelle trasmissioni RTP, potrebbero ridurre la qualità del traffico VoIP.

Eventualmente l’uso di strumenti di log analysis come fail2ban, anche se non specificatamente per Asterisk, può aiutare ad identificare e bloccare eventuali abusers.

Importante è anche attuare una serie di sistemi di controllo real-time e di reporting, magari giornaliera, sullo stato dei servizi e relativi consumi.

Spero di esserti stato di aiuto,

Michele

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

snom300_2

Snom 320 e Snom 300

0

Come i lettori assidui del mio blog già sanno, siamo in fase di ricerca e valutazione per gli apparecchi VoIP da utilizzare all’interno dell’Ateneo di Siena, dove lavoro.

Proprio qualche giorno fa ci hanno portato in prova un appliance T-Vox per una valutazione sul prodotto in merito alle necessità ed esigenze dell’ateneo.

Insieme al T-Vox hanno consegnato, sempre in prova, due apparecchi Snom: il 320, con i tasti laterali aggiuntivi, e il 300.

Direttamente dal sito web del produttore, troviamo:

Snom 300

Quale modello base della famiglia di telefoni aziendali, il telefono SIP snom 300 risponde alle esigenze primarie in termini di impiego della telefonia VoIP ed offre numerose funzioni irrinunciabili in ambito professionale.

Sempre dal sito web ecco alcune delle caratteristiche principali:

  • Display a due righe (2×16 caratteri)
  • 27 tasti, 7 LEDs
  • 6 tasti funzione liberamente configurabili
  • 4 account SIP (“linee”)
  • 2 porte Ethernet
  • SIP RFC3261
  • Sicurezza: SIPS/SRTP, TLS
  • STUN, ENUM, NAT, ICE
  • Compressione: G.711, G.729A, G.723.1,G.722, G.726, GSM 6.10 (Full rate)

Snom 320

Ideale per l’ufficio e per chi telefona molto: lo snom 320 é un telefono SIP professionale dall’ottimo rapporto qualità prezzo e dotato del vivavoce (full duplex) come della funzione di conferenza a tre.

Display grafico a due righeLe relative caratteristiche principali:

  • 47 Tasti, 13 LEDs
  • 12 account SIP (“linee”)
  • 12 tasti funzione liberamente configurabili
  • Vivavoce
  • Alimentazione ethernet (PoE)
  • Tastiera aggiuntiva con 42 tasti funzione programmabili
  • SIP RFC3261
  • Sicurezza: SIPS/SRTP, TLS
  • STUN, ENUM, NAT, UPnP, ICE
  • Codecs: G.711, G.729A, G.723.1, G.722, G.726, GSM 6.10 (Full rate)
  • Supporto della lingua locale

Dopo qualche prova di utilizzo, dei due apparecchi apprezzo particolarmente la chiarezza delle informazioni sul display, a caratteri grandi (a prova di “utonto”). La suoneria è facilmente personalizzabile ed anche l’interfaccia di configurazione via web è facile e intuitiva. L’aspetto esteriore è abbastanza solido e robusto, con plastiche nere opache e tasti con buon feedback tattile.

La documentazione su come fare l’autoprovisioning è disponibile sul Wiki della Snom all’indirizzo:http://wiki.snom.com/Features/Mass_Deployment

Configurazione degli apparati

 

Entrambi i modelli hanno un comodo server Web sulla porta 80 per la configurazione degli stessi. Basterà recuperare l’IP (nmap -sP può essere di grande aiuto) ed aprire il browser.

Unica accortezza per la configurazione è nella parte relativa agli account SIP. La schermata è chiara ma nel caso si inserisca un nome a dominio nella parte “Server:” è necessario aggiungere, nell’URI, anche la porta UDP. Ad esempio:
voip.server.it:5060

Altrimenti la registrazione al server fallirà in un antipatico 404:

Transport Error: Pending packet 1000251: generating fake
Registrar 2169@voip.server.it refused with code 404
Will try to reregister in 300 seconds
Registration Metrics failed

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

VoIP diagram

Primi esperimenti con il VoIP: Asterisk + OpenSIPS

0

Come avevo già scritto precedentemente, sono al lavoro per la progettazione e successiva realizzazione di un sistema VoIP piuttosto grande. Dopo aver realizzato diversi PBX Asterisk, con limitato numero di interni (10-20), indubbiamente la mia predisposizione era fortemente indirizzata verso software libero. Tuttavia Asterisk, come confermato anche da esperti del settore, non è adatto a sopportare un elevato numero di interni (si parla di 1000-2000 telefoni) perché offre tutta una serie di servizi avanzati e di transcoding non sempre necessari. Per la semplice gestione della registrazione e gestione del routing è sufficiente un SIP proxy, molto più snello di un completo sistema PBX come Asterisk. Moltissimi, compresi appliances commerciali, hanno scelto OpenSIPS:

OpenSIPS (Open SIP Server) is a mature Open Source implementation of a SIP server. OpenSIPS is more than a SIP proxy/router as it includes application-level functionalities. OpenSIPS, as a SIP server, is the core component of any SIP-based VoIP solution. With a very flexible and customizable routing engine, OpenSIPS ‘unifies voice, video, IM and presence services in a highly efficient way, thanks to its scalable (modular) design.
What OpenSIPS has to offer, comes in a reliable and high-performance flavour - OpenSIPS is one of the fastest SIP servers, with a throughput that confirms it as a solution up to enterprise or carrier-grade class.

Premetto che un forte supporto e aiuto nella comprensione del tutto mi è stata data dal libro “Building Telephony Systems with OpenSIPS 1.6“, disponibile anche su Amazon.it.

Senza voler ripetere le basi già descritte nel mio precedente post (OpenSIPS: l’Installazione), il contesto nel quale  lavoreremo in questo post è composto da:

Per quanto riguarda l’installazione di Asterisk ho scelto di NON mettere FreePBX e di configurare manualmente il tutto. Asterisk, soprattutto in questa prima fase, servirà esclusivamente come gateway con la rete telefonica tradizionale.

Vediamo velocemente la configurazione di Asterisk. In particolare ho dovuto modificare i files sip.conf:

[voip-trunk]
type=peer
fromdomain=voip.unisi.it
host=voip.unisi.it
insecure=invite
disallow=all
allow=alaw

e extensions.conf:

[macro-from-pstn-1]
exten => s,1,Noop(Entering macro-from-pstn-1 with DID = ${DID} and setting to: 2617)
exten => s,n,Set(DNID=2617)

[macro-from-pstn-2]
exten => s,1,Noop(Entering macro-from-pstn-2 with DID = ${DID} and setting to: 2650)
exten => s,n,Set(DNID=2650)

[from-pstn]
exten => _X.,1,Set(DID=${EXTEN})
exten => _X.,n,Goto(s,1)
exten => s,1,Noop(Entering from-dahdi with DID == ${DID})
exten => s,n,Ringing()
exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})})
exten => s,n,Noop(DID is now ${DID})
exten => s,n,Set(CHAN=${CHANNEL:6})
exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
exten => s,n,Macro(from-pstn-${CHAN},${DID},1)
exten => s,n,Noop(Returned from-pstn-${CHAN})
exten => s,n,Dial(SIP/${DNID}@voip-trunk,20);
exten => s,n,Hangup()

[from-voip]
exten=s,1,NooP("from-voip: ${EXTEN}")
exten=>_[0-9].,1,Dial(DAHDI/g0/${EXTEN})
exten=>_[0-9].,2,hangup()

Notare che in questo caso ho solamente 2 canali PSTN configurati all’interno del gruppo 0 (DAHDI/g0). Queste impostazioni si gestiscono nel file dahdi-channels.conf:

; Span 1: WCTDM/4 "Wildcard TDM400P REV I Board 5" (MASTER) 
;;; line="1 WCTDM/4/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1

...

Adesso passiamo al cuore del sistema: OpenSIPS. In questo caso deve occuparsi del routing, dell’accounting e della registrazione/autenticazione dei telefoni VoIP. Ho scelto di basare il tutto su database MySQL, creando le opportune tabelle.

Per semplificarne la gestione ho fatto configurare una VLAN sulla rete e ho messo un server DHPC che, oltre a fornire l’indirizzo IP e la configurare di rete, invia anche l’opzione 66, “tftp-server-name“, per la configurazione automatica dei telefoni (autoprovisioning). Nel nostro caso si tratta di telefoni Yealink SIP-T20P che supportano l’autoprovisioning: inviando tale opzione DHCP, i telefoni tentano di scaricare la configurazione attraverso il server TFTP indicato. Ovviamente la configurazione di ogni singolo apparecchio deve essere salvata in un file dal nome [mac-address].cfg ma anche questo dipende dal modello del telefono e dalle specifiche del produttore.

Tornando all’OpenSIPS, usato come SIP proxy, ecco la configurazione:

####### Global Parameters #########
debug=4
log_stderror=no
log_facility=LOG_LOCAL7
fork=yes
children=4
# default db_url to be used by modules requiring DB connection
db_default_url="mysql://opensips:xxx@localhost/opensips"
port=5060
listen=udp:172.20.0.1:5060

####### Modules Section ########
mpath="/usr/lib/opensips/modules/"
loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "acc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "alias_db.so"
loadmodule "domain.so"
loadmodule "presence.so"
loadmodule "permissions.so"
# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "append_fromtag", 1)
modparam("registrar", "max_contacts", 10)
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "db_url","mysql://opensips:xxxx@localhost/opensips")
modparam("uri", "use_uri_table", 0)
modparam("acc", "early_media", 1)
modparam("acc", "cdr_flag", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 1)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
modparam("acc", "db_table_acc", "acc")
modparam("acc", "db_url", "mysql://opensips:xxx@localhost/opensips")
modparam("acc", "db_extra", "from_uri=$fU; to_uri=$tU; ip=$si; ua=$hdr(User-Agent)")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", 1)
modparam("alias_db", "db_url","mysql://opensips:xxxx@localhost/opensips")
modparam("domain", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("domain", "db_mode", 1) # Use caching
modparam("auth_db|usrloc|uri", "use_domain", 1)
modparam("presence", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("presence", "presentity_table", "presentity")
modparam("presence", "active_watchers_table", "active_watchers")
modparam("presence", "watchers_table", "watchers")
modparam("presence", "db_update_period", 100)
modparam("presence", "notify_offline_body", 1)
modparam("permissions", "db_url", "mysql://opensips:xxxx@localhost/opensips")
modparam("permissions", "address_table", "address")
modparam("permissions", "grp_col", "grp")
modparam("permissions", "ip_col", "ip")
modparam("permissions", "mask_col", "mask")
modparam("permissions", "port_col", "port")
modparam("permissions", "proto_col", "proto")
modparam("permissions", "info_col", "context_info")

####### Routing Logic ########

route{
 if (!mf_process_maxfwd_header("10")) {
   sl_send_reply("483","Too Many Hops");
   exit;
 }
 if (has_totag()) {
  if (loose_route()) {
   if (is_method("BYE")) {
    setflag(1); # do accounting ...
    setflag(3); # ... even if the transaction fails
   } else if (is_method("INVITE")) {
    record_route();
   }
  route(1);
 } else {
  if (is_method("SUBSCRIBE") && $rd == "172.20.0.1") {
  # in-dialog subscribe requests
   route(2);
   exit;
  }
  if ( is_method("ACK") ) {
   if ( t_check_trans() ) {
    # non loose-route, but stateful ACK; must be an ACK after 
    # a 487 or e.g. 404 from upstream server
    t_relay();
    exit;
   } else {
    # ACK without matching transaction ->
    # ignore and discard
    exit;
   }
  }
  sl_send_reply("404","Not here");
  }
 exit;
}
# CANCEL processing
if (is_method("CANCEL")) {
 if (t_check_trans())
  t_relay();
 exit;
 }
 t_check_trans();

 if (!(method=="REGISTER") && is_from_local()) {
  if(!check_source_address("0")){
   if (!proxy_authorize("", "subscriber")) {
    proxy_challenge("", "0");
    exit;
   }
   if (!db_check_from()) {
    sl_send_reply("403","Forbidden auth ID");
    exit;
   }
   consume_credentials();
   # caller authenticated
  }
 }
 # preloaded route checking
 if (loose_route()) {
  xlog("L_ERR", "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
  if (!is_method("ACK"))
    sl_send_reply("403","Preload Route denied");
  exit;
 }
 # record routing
 if (!is_method("REGISTER|MESSAGE"))
  record_route();
 # account only INVITEs
  if (is_method("INVITE")) {
   setflag(1); # do accounting
  }
  if (!is_uri_host_local()) {
   append_hf("P-hint: outbound\r\n"); 
   route(1);
  }

 if( is_method("PUBLISH|SUBSCRIBE"))
  route(2);

 if (is_method("PUBLISH")) {
  sl_send_reply("503", "Service Unavailable");
  exit;
 }
 if (is_method("REGISTER")) {
  # authenticate the REGISTER requests
  if (!www_authorize("", "subscriber")) {
   www_challenge("", "0");
   exit;
  }
  if (!db_check_to()) {
   sl_send_reply("403","Forbidden auth ID");
   exit;
  }
  if (!save("location")) 
   sl_reply_error();
  exit;
 }
 if ($rU==NULL) {
  # request with no Username in RURI
  sl_send_reply("484","Address Incomplete");
  exit;
 }
 # apply DB based aliases 
 alias_db_lookup("dbaliases");
 # do lookup with method filtering
 if (!lookup("location","m")) {
  switch ($retcode) {
   case -1: # no contact - forward to the call to Asterisk PSTN gateway
   route(4);
   exit;
  case -3: # internal error
   t_newtran();
   t_reply("404", "Not Found");
   exit;
  case -2: # method not supported
   sl_send_reply("405", "Method Not Allowed");
   exit;
  }
 }

 # when routing via usrloc, log the missed calls also
 setflag(2);
 route(1);
}

route[1] {
 # for INVITEs enable some additional helper routes
 if (is_method("INVITE")) {
  t_on_branch("2");
  t_on_reply("2");
  t_on_failure("1");
 }
 if (!t_relay()) {
  sl_reply_error();
 };
 exit;
}

# Presence route
route[2]
{
 if (!t_newtran()) {
  sl_reply_error();
  exit;
 };
 if(is_method("PUBLISH")) {
  handle_publish();
 }
 else if( is_method("SUBSCRIBE")) {
  handle_subscribe();
 }
 exit;
}
route[4] {
 # Forward call to Asterisk 
 rewritehostport("172.20.0.5:5060");
 route(1);
}
branch_route[2] {
 xlog("new branch at $ru\n");
}
onreply_route[2] {
 xlog("incoming reply\n");
}
failure_route[1] {
 if (t_was_cancelled()) {
   exit;
 }
}

Utilizzando ngrep (ngrep -W byline -td any . port 5060) vediamo la fase di REGISTER all’accensione di un telefono (2617):

U 2012/06/08 12:18:23.083810 172.20.0.10:5062 -> 172.20.0.1:5060
REGISTER sip:voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1849514868.
From: "2617" <sip:2617@voip.unisi.it>;tag=1735972936.
To: "2617" <sip:2617@voip.unisi.it>.
U 2012/06/08 12:18:24.916666 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1844770290.

Alla registrazione di un telefono, OpenSIPS memorizza il relativo numero (oltre ad altri dati tecnici), nella tabella “location“:

Quando dall’interno 2617 chiamo un altro numero “interno” (ad es. 2650), inteso come registrato sul medesimo proxy, ecco il flusso delle segnalazioni:

U 2012/06/08 12:32:32.512136 172.20.0.10:5062 -> 172.20.0.1:5060
INVITE sip:2650@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1302839294.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>
U 2012/06/08 12:32:32.611392 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 100 Giving a try.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>.
U 2012/06/08 12:32:32.611712 172.20.0.1:5060 -> 172.20.0.12:5062
INVITE sip:2650@172.20.0.12:5062 SIP/2.0.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>.
U 2012/06/08 12:32:32.790067 172.20.0.12:5062 -> 172.20.0.1:5060
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=379428395.
U 2012/06/08 12:32:32.792249 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=379428395.

Se il 2650 non risponde e il chiamante decide di rinunciare, ecco che parte una segnalazione CANCEL e si chiude la chiamata:

U 2012/06/08 12:32:37.588802 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 200 canceling.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=643c56a457061490c918aea728c07866-83f3.
U 2012/06/08 12:32:37.589140 172.20.0.1:5060 -> 172.20.0.12:5062
CANCEL sip:2650@172.20.0.12:5062 SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
Call-ID: 1123041723@172.20.0.10.
To: <sip:2650@voip.unisi.it>.

Quando l’interno 2617 chiama un numero esterno, esempio 2169, ecco che OpenSIPS reindirizza la chiamata all’Asterisk:

U 2012/06/08 12:38:37.068478 172.20.0.10:5062 -> 172.20.0.1:5060
INVITE sip:2169@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
From: "2617" <sip:2617@voip.unisi.it>;tag=969196503.
To: <sip:2169@voip.unisi.it>.
U 2012/06/08 12:38:37.072909 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 100 Giving a try.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
From: "2617" <sip:2617@voip.unisi.it>;tag=969196503.
To: <sip:2169@voip.unisi.it>.
U 2012/06/08 12:38:37.074540 172.20.0.1:5060 -> 172.20.0.5:5060
INVITE sip:2169@172.20.0.5:5060 SIP/2.0.
Record-Route: <sip:172.20.0.1;lr;ftag=969196503>.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bKe413.748e1db.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
U 2012/06/08 12:38:37.077108 172.20.0.5:5060 -> 172.20.0.1:5060
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bKe413.748e1db.0;received=172.20.0.1.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.

Se accade l’opposto, ovvero dalla rete PSTN (es. numero 2169) chiamano un numero interno 2617:

U 2012/06/08 12:41:27.002715 172.20.0.5:5060 -> 172.20.0.1:5060
INVITE sip:2617@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.5:5060;branch=z9hG4bK1fce9b73;rport.
Max-Forwards: 70.
From: "asterisk" <sip:asterisk@voip.unisi.it>;tag=as49579a42.
To: <sip:2617@voip.unisi.it>.
Contact: <sip:asterisk@172.20.0.5>.

Su Asterisk ho:

-- Starting simple switch on 'DAHDI/1-1'
 -- Executing [s@from-pstn:1] NoOp("DAHDI/1-1", "Entering from-dahdi with DID == ") in new stack
 -- Executing [s@from-pstn:2] Ringing("DAHDI/1-1", "") in new stack
 -- Executing [s@from-pstn:3] Set("DAHDI/1-1", "DID=s") in new stack
 -- Executing [s@from-pstn:4] NoOp("DAHDI/1-1", "DID is now s") in new stack
 -- Executing [s@from-pstn:5] Set("DAHDI/1-1", "CHAN=1-1") in new stack
 -- Executing [s@from-pstn:6] Set("DAHDI/1-1", "CHAN=1") in new stack
 -- Executing [s@from-pstn:7] Macro("DAHDI/1-1", "from-pstn-1,s,1") in new stack
 -- Executing [s@macro-from-pstn-1:1] NoOp("DAHDI/1-1", "Entering macro-from-pstn-1 with DID = s and setting to: 2617") in new stack
 -- Executing [s@macro-from-pstn-1:2] Set("DAHDI/1-1", "DNID=2617") in new stack
 -- Executing [s@from-pstn:8] NoOp("DAHDI/1-1", "Returned from-pstn-1") in new stack
 -- Executing [s@from-pstn:9] Dial("DAHDI/1-1", "SIP/2617@voip-trunk,20") in new stack
 == Using SIP RTP CoS mark 5
 -- Called 2617@voip-trunk
 -- SIP/voip-trunk-0000006b is ringing

Ho ovviamente rimosso tutte le segnalazioni di ACK e di OK non necessarie alla comprensione del flusso di funzionamento. Credo comunque che sia piuttosto chiaro il flusso delle segnalazioni SIP. Importante citare che la voce viene inviata via RTP da telefono a telefono pertanto considerate che, a meno di prevedere proxy RTP, tutti gli apparecchi devono essere raggiungibili sulla rete.

Ovviamente queste sono da considerarsi note di lavoro e sono, pertanto, soggette a errori, imprecisioni e omissioni.

 

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

SIP-T20P

Yealink SIP-T20P VoIP Phone

0

Per motivi di lavoro mi occupo di VoIP, così ho iniziato ad aver a che fare anche con i telefoni VoIP che supportano protocollo SIP (Esistono anche altri protocolli VoIP, quali Skinny -Cisco- e H.323).

Ultimamente abbiamo acquistato una dozzina di Yealink SIP-T20P, che hanno un costo relativamente basso e sembrano possedere discrete qualità tecniche.

Direttamente dal sito web Yealink si possono vedere le caratteristiche. Di seguito riassumo le principali:

  • 2 VoIP accounts, hotline, emergency call
  • Multi-language (more than 20)
  • IP PBX System Integration
  • Codecs: G.722 G.711, G.723.1, G.726, G.729AB
  • VAD, CNG, AEC, PLC, AJB, AGC
  • SIP v1 (RFC2543), v2 (RFC3261)
  • NAT Traversal: STUN mode
  • DTMF: In-Band, RFC2833, SIP Info
  • TFTP/DHCP/PPPoE client
  • Telnet/HTTP/HTTPS server
  • FTP/TFTP/HTTP/PnP auto-provision
  • Security: HTTPS (server/client), SRTP (RFC3711), Transport Layer Security (TLS), VLAN (802.1 pq), QoS

Nella scatola, oltre al telefono e alla base, trovate l’alimentatore da rete 110/220V, il cavo ethernet cat. 5 e il CD con il manuale.

Ecco qualche foto del telefono e screenshots della configurazione:

La programmazione può essere fatta dal display del telefono oppure via web, assegnando un IP via DHCP. L’account di default per accedere all’interfaccia di amministrazione via web è: admin/admin.

Altra caratteristica interessante, oltre alle numerosissime opzioni offerte dal firmware, è la possibilità di esportare e importare la configurazione completa dell’apparecchio. Noi ne abbiamo presi due di scorta e, a seguito del guasto di un telefono, in 5 minuti ne avevo subito uno pronto con la stessa configurazione.

La qualità costruttiva è standard di un prodotto cinese, tuttavia la Yealink è una delle leader della produzione di questi telefoni e molte marche rivendono questi apparecchi semplicemente ribrandizzandoli.

L’audio è molto buono e nei 3 mesi di utilizzo non hanno dato problemi segni di nota (se non un apparecchio che ha avuto problemi con il display).

Alla fine sono un buon rapporto qualità/prezzo.

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

opensips

OpenSIPS: L’Installazione

1

Inizio oggi una serie di post che riguardano direttamente il mio lavoro, ovvero il VoIP. Sono stato infatti incaricato ufficialmente di traghettare l’Università di Siena dal vecchio mondo degli Ericcson MD110 alla tecnologia VoIP, essendo stato uno dei pochi ad aver realizzato qualcosa del genere all’interno dello stesso ateneo.

Una bella avventura su cui mi appresto a lavorare al meglio, sfruttando il più possibile software libero (per quanto mi riguarda, ESCLUSIVAMENTE software libero) e niente appliances commerciali.

Alla fine credo che ne usciremo con qualche OpenSIPS, qualche Asterisk per i servizi quali VoiceMail ed IVR, uno o più Patton SR 4960 per interfacciare la rete telefonica ed il centralino tradizionale con la nuova realtà VoIP.

La sfida più grande, infatti, è migrare nel modo più trasparente possibile mantenendo comunque la compatibilità tra i due mondi senza disservizi per l’utenza, ormai abituata ad un certo tipo di servizi e metodologie.

L’idea è di partire migrando piccole realtà, uffici di 10-15 persone, e vedere come si comporta il tutto. Prendiamo spunto da realtà che hanno già fatto, o stanno facendo, il grande passo, come il CNR di Pisa (di cui siamo stati ospiti):

  • OpenSIPS a gestire le registrazioni ed il flusso di messaggi SIP, basando le configurazioni su DB MySQL
  • Asterisk per i servizi IVR e VoiceMail
  • Patton come gateway tra PSTN e VoIP

Inizio quindi a provare OpenSIPS, installando i binari della 1.7.0 su una Debian ad-hoc, da http://opensips.org/pub/opensips/1.7.0/.

Dopo dpkg -i e svariate dipendenze da risolvere, si passa a creare il DB e popolare le tabelle che accoglieranno le configurazioni. Tutti gli schemi si trovano nella directory /usr/share/opensips/mysql e dopo aver importato lo script standard-create.sql (che si limita a creare la tabella “version”), ho scritto due righe in bash per semplificare il lavoro:

#!/bin/sh
for filename in *.sql
do
    mysql -u opensips --password=[password] opensips < $filename
done;

alla fine il vostro bel DB “opensips” sarà popolato da tutte le tabelle necessarie al funzionamento. Adesso si passa ad adattare /etc/opensips/opensips.conf per le proprie necessità. Per iniziare è stato sufficente abilitare i vari moduli ed impostare adeguatamente le credenziali per l’accesso al DB. Nello stesso file, però, c’è la sezione cruciale di OpenSIPS:

####### Routing Logic ########

Per iniziare a giocare, mi sono limitato ad attivare l’autenticazione scommentando questa parte:

if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/
    {
        if (!proxy_authorize("", "subscriber")) {
            proxy_challenge("", "0");
            exit;
        }
        if (!db_check_from()) {
            sl_send_reply("403","Forbidden auth ID");
            exit;
        }
        consume_credentials();
        # caller authenticated
    }

ho lanciato il demone OpenSIPS (/etc/init.d/opensips start) ed ho aggiunto una riga nella tabella subscriber:

id username domain password email_address ha1 ha1b rpid
1 2001 unisi.it 2001 michele.pinassi@unisi.it NUL

per provare se se almeno l’autenticazione funziona. Ho poi installato ngrep (apt-get install ngrep) per monitorare cosa succede sulla porta 5060:

ngrep -W byline -td any . port 5060

e questo è il primo risultato:

U 2011/10/06 15:43:33.258240 proxy-voip01:5060 -> mypc:5060
SIP/2.0 200 OK.
Via: SIP/2.0/UDP mypc:5060;rport=5060;branch=z9hG4bKPjc1eae852-b68a-4343-8b08-e875cf11899e.
From: <sip:2169@proxy-voip01>;tag=ca889e8a-13be-429d-ad28-50e1252b15e8.
To: <sip:2169@proxy-voip01>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.abf4.
Call-ID: cbfbc2aa-0cf2-4455-aacb-5650beb92f3d.
CSeq: 42858 REGISTER.
Contact: <sip:2169@mypc:5060>;expires=60.
Server: OpenSIPS (1.7.0-notls (i386/linux)).
Content-Length: 0.
.

Per oggi può bastare :-) alla prossima puntata !

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

Go to Top