voip2day 2013: construyendo una centralita virtual con freeswitch
DESCRIPTION
Presentación de la conferencia del VOIP2DAY de 2013 Construyendo una centralita virtual con FreeSWITCH, por José Francisco Irles Durá de SiptizeTRANSCRIPT
Construyendo una centralita virtualcon FreeSWITCH
7 de noviembre de 2013
José Francisco [email protected]
@josefu
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
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
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)
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
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
con FreeSWITCH se liga más,y lo sabes...
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Arquitectura Hosted PBX
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
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Ejemplo mod_xml_curl: REGISTER
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
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)
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
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
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>
….
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Alta Disponibilidad: cómo dormir más tranquilo
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
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”/>
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
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
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
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Visión global de plataforma de centralita virtual
www.siptize.com
¿Preguntas?