VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

23

Click here to load reader

description

Presentación de la conferencia del VOIP2DAY de 2013 Construyendo una centralita virtual con FreeSWITCH, por José Francisco Irles Durá de Siptize

Transcript of VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

Page 1: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

Construyendo una centralita virtualcon FreeSWITCH

7 de noviembre de 2013

José Francisco [email protected]

@josefu

Page 2: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Sobre Siptize

● Operador VoIP● Satmak: Soft-Switch 4/5● Plataforma Hosted PBX● Consultoría VoIP

Page 3: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

¿Qué es FreeSWITCH? (I)

● Plataforma Open Source de comunicaciones● Puede usarse como:

– Biblioteca (libfreeswitch)– Softphone– PBX– Soft-switch– Etc

● Licencia MPL 1.1 ● B2BUA

Page 4: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

¿Qué es FreeSWITCH? (y II)

● Configuración en XML (hay alternativas)● Soporte para diferentes protocolos

– SIP (udp, tcp, websockets)– H323– XMPP-Jingle– SCCP– Skype– TDM (FreeTDM)

Page 5: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

¿Por qué elegir FreeSWITCH? (I)

● Máxima de FreeSWITCH: no reinventar la rueda– Sofia SIP– cURL– PostgreSQL y SQLite para el core

● Multiplataforma● Escalabilidad● Flexibilidad● Multi dominio● Sofia Profiles

Page 6: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

¿Por qué elegir FreeSWITCH? (y II)

● Modelo de datos no prefijado● Tecnologías estándar para “realtime”:

– HTTP– XML– JSON

● Lenguaje de programación:– El que tú decidas

● Facilidad para clusterizar el backend: HTTP

Page 7: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

con FreeSWITCH se liga más,y lo sabes...

Page 8: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Arquitectura Hosted PBX

Page 9: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Configuración de FreeSWITCH

● Módulo mod_xml_curl– Configuración mínima en local (fichero xml)– Resto de configuración cargada mediante servicio

web– RESTful

● POST a url configurada

Page 10: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Ejemplo mod_xml_curl: REGISTER

Page 11: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Request/Response de FreeSWITCH al servidor web

<document type="freeswitch/xml"> <section name="directory"> <domain name="domain1.awesomevoipdomain.faketld"> <params> <param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/> </params> <groups> <group name="default"> <users> <user id="1004"> <params> <param name="password" value="some_password"/> </params> </user> </users> </group> </groups> </domain> </section></document>

[hostname] => testmachine[section] => directory[tag_name] => domain[key_name] => name[key_value] => domain1.awesomevoipdomain.faketld[Event-Name] => REQUEST_PARAMS[Core-UUID] => c5c8cbf4-60c3-45a2-b110-933da620cfd2[FreeSWITCH-Hostname] => 25515_1_36308_177178[FreeSWITCH-IPv4] => 192.168.1.10[FreeSWITCH-IPv6] => ::1[Event-Date-Local] => 2009-10-27 00:47:10[Event-Date-GMT] => Tue, 27 Oct 2009 07:47:10 GMT[Event-Date-Timestamp] => 1256629630733916[Event-Calling-File] => sofia_reg.c[Event-Calling-Function] => sofia_reg_parse_auth[Event-Calling-Line-Number] => 1671[action] => sip_auth[sip_profile] => internal[sip_user_agent] => PolycomSoundPointIP-SPIP_320-UA/3.1.0.0084[sip_auth_username] => 1004[sip_auth_realm] => domain1.awesomevoipdomain.faketld[sip_auth_nonce] => 533c5264-12cb-4f8b-bcdb-5ecabe5e540f[sip_auth_uri] => sip:domain1.awesomevoipdomain.faketld:5060[sip_contact_user] => 1004[sip_contact_host] => 192.168.1.100[sip_to_user] => 1004[sip_to_host] => domain1.awesomevoipdomain.faketld[sip_from_user] => 1004[sip_from_host] => domain1.awesomevoipdomain.faketld[sip_request_host] => domain1.awesomevoipdomain.faketld[sip_request_port] => 5060[sip_auth_qop] => auth[sip_auth_cnonce] => hSVnPb32nA/OtkY[sip_auth_nc] => 00000001[sip_auth_response] => 6e4e611d7593d52e02451b70900071d8[sip_auth_method] => REGISTER[key] => id[user] => 1004[domain] => domain1.awesomevoipdomain.faketld[ip] => 192.168.1.100

Request Response

Page 12: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Interactuar con FreeSWITCH

● Módulo mod_event_socket– Modo inbound/outbound– Enviar comandos y recibir la respuestas– Escucha de eventos– Conexión “statefull”: Socket TCP– “Equivalente” en asterisk: manager + FastAGI

● Módulo mod_xml_rpc: RESTful– Sólo para enviar comandos (y recibir su respuesta)– Conexión “stateless”: HTTP (request/response)

Page 13: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Eventos en FreeSWITCH

● mod_event_socket (visto antes)● mod_event_multicast

– Permite replicar registros y presencia sin compartir base de datos

● mod_erlang_event● mod_event_zmq

– Formato JSON– Escalable– Bindings para múltiples lenguajes

Page 14: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

CDR

● mod_cdr_xm l (recomendado)● mod_cdr_csv● mod_cdr_mongodb● mod_cdr_pg_csv● mod_cdr_sqlite● mod_json_cdr● mod_radius_cdr

Page 15: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Ejemplo de CDR en XML

<?xml version="1.0"?><cdr core-uuid="5d80b2bf-7ae1-4fed-803e-7edf94468be0"> <channel_data> <state>CS_REPORTING</state> <direction>inbound</direction> <state_number>11</state_number> <flags>0=1;3=1;19=1;36=1;37=1;39=1;52=1;73=1</flags> <caps>1=1;2=1;3=1;4=1;5=1;6=1</caps> </channel_data> <variables> <direction>inbound</direction> <uuid>897211c5-2f67-4c77-9928-c8c0b9e49972</uuid> <session_id>56</session_id> <sip_from_user>100</sip_from_user> <sip_from_uri>100%40testsip.com</sip_from_uri> <sip_from_host>testsip.com</sip_from_host> <channel_name>sofia/internal/100%40testsip.com</channel_name> <sip_received_port>5060</sip_received_port> <sip_via_protocol>udp</sip_via_protocol> <sip_authorized>true</sip_authorized> <accountcode>100%40testsip.com</accountcode> <user_context>default</user_context>

…. <app_log> <application app_name="export" app_data="domain_name=testsip.com" app_stamp="1378365023484959"></application> <application app_name="export" app_data="domain=testsip.com" app_stamp="1378365023485712"></application> <application app_name="export" app_data="pbx_id=4028818b40e7e3830140e7e38512002f" app_stamp="1378365023486343"></application>

…. </app_log> <callflow dialplan="XML" unique-id="0ff824e3-80c0-495e-9292-4f09c787e942" profile_index="1"> <extension name="default_extension" number="*60600" current_app="transfer"> <application app_name="export" app_data="domain_name=testsip.com"></application> <application app_name="export" app_data="domain=testsip.com"></application> ….. </callflow>

….

Page 16: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Alta Disponibilidad: cómo dormir más tranquilo

Page 17: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Estrategia alta disponibilidad

● Base de datos en cluster HA● Replicar en “n” datacenters:

– Base de datos (sólo elementos necesarios)● Datos “read-only”

– Los CDR's se envían a la db principal● Usar los DNS

– Repartir carga (granularidad: centralita)– Ante un fallo en datacenter:

● Failover automático → SRV● Failover manual → Cambio en DNS

Page 18: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

sofia recover

● “Magia” en FreeSWITCH● Se mueve todo (media incluido) de un servidor

a otro● El usuario sólo detecta una pérdida momentánea

de audio● Requerimientos:

– Base de datos del core compartida● <param name="odbc-dsn" value="odbc://dsn:username:password"/>● <param name="core-recovery-db-dsn" value="odbc://dsn:username:password"/>

– Parámetro en configuración de sofia:● <param name=”track-calls” value=”true”/>

Page 19: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

sofia recover: situación normal

● Nodo activo:– “n” llamadas con media a través de él– “m” llamadas sin media a través de él

● Nodo pasivo, dos alternativas:– FreeSWITCH apagado– FreeSWITCH en marcha

● net.ipv4.ip_nonlocal_b ind=1

Page 20: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

sofia recover: fallo en nodo activo

● Parar nodo activo● Nodo pasivo adquiere la IP flotante● Forzar update en tabla arp en el router

(arping)● Ejecutar “sofia recover” en nodo pasivo

Page 21: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

sofia recover: nodo pasivo pasa a activo

● Se recuperan las llamadas activas● Pequeño lapsus (~2 segundos) sin audio

entre las extensiones

Page 22: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

José Francisco Irles

www.siptize.com

Construyendo una centralita virtual con FreeSWITCH @josefu

Visión global de plataforma de centralita virtual

Page 23: VOIP2DAY 2013: Construyendo una centralita virtual con FreeSWITCH

www.siptize.com

¿Preguntas?