12.07.2015 Views

Asterisk & carriers PSTN - Asterisk-ES

Asterisk & carriers PSTN - Asterisk-ES

Asterisk & carriers PSTN - Asterisk-ES

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Asterisk</strong> & <strong>carriers</strong> <strong>PSTN</strong>“ ...because <strong>PSTN</strong> does exist ”Iñaki Baz Castillo


<strong>PSTN</strong>Carrier<strong>PSTN</strong>RDSI primarioRTPSIPInternet / DSL dedicadoCliente 1Cliente 2 Cliente 3


Crecemos...Aumenta el número de clientesNecesitamos más capacidad de llamadasUn único servidor se queda cortoNecesitamos más capacidad (líneas RDSI y servidores)Ponemos más <strong>Asterisk</strong> en paraleloMás conexiones de primario con nuevos <strong>carriers</strong>Cada <strong>Asterisk</strong> tiene sus propios usuarios y DID'sAñadimos un host para BDTodos los <strong>Asterisk</strong> usan esta BD (CDR centralizado)


Proveedor VoIP escalable (I)Un SIP proxy + registrar delanteTodos los usuarios se registran aquí y no en los <strong>Asterisk</strong>El proxy ruta llamadas outbound a cualquier gateway (<strong>Asterisk</strong>)Si un gateway falla ruta la llamada por otro (“dispatcher”)Podemos mostrar cualquier CallerID a través de cualquier gatewayEl proxy ruta las llamadas entrantes a los usuariosHace el accounting y lo guarda en BD (¿Radius?)Servidor DBMapeo DID usuario SIP (¿DNS ENUM?) ­> ¡centralizado!Guarda los registros de los usuarios ­> ¡centralizado!Guarda los CDR ­> ¡centralizado!


<strong>PSTN</strong>RDSI primarioBDRTPProxy&RegistrarSIPProxy RTPRTPSIP


“Y más mejor...”Redundancia en el proy/registrarUsamos, por ejemplo, HeartBeatSi el nodo 1 cae, el nodo 2 toma el control (incluso de la IP deservicio)“Aquí no ha pasado nada”Redundancia BDPodemos usar BD en clustering con replicación master­masterRedundancia en cada gateway (<strong>Asterisk</strong>)Redundancia de primarios (ej: RedPhone)Si su <strong>Asterisk</strong> cae el dispositivo encamina el primario a otro nodo


<strong>Asterisk</strong> como gateway SIP/<strong>PSTN</strong> (II)Control de llamadas salientes concurrentesCada <strong>Asterisk</strong> con tarjeta de 4 primarios: 120 canalesConectado a un carrier que nos entrega DID'sEl carrier nos ruta llamadas a esos DID's sólo por estos primariosHay que reservar algunos canales para entrantes (las llamadassalientes pueden hacerlo por cualquier otro primario)Creamos una lógica en <strong>Asterisk</strong> para limitar el número dellamadas salientes y reservar canales para entrantes


Macro para limitación de llamadas salientes[globals]MAX_OUTBOUND_CALLS = 15[macro-check-outbound]; ${ARG1} = ${EXTEN}exten => s,1,Set(GROUP()=outbound_calls)exten => s,n,GotoIf($[${GROUP_COUNT(outbound_calls)} >${MAX_OUTBOUND_CALLS}]?deny,1); ### Llamada permitida, que continúe el dialplanexten => s,n,MacroExit; ### Llamada no permitida por exceder MAX_OUTBOUND_CALLS ->; respondemos SIP 503exten => deny,1,Hangup(42) ; AST_CAUSE_SWITCH_CONG<strong>ES</strong>TION (SIP 503); http://www.voip-info.org/wiki/index.php?page=<strong>Asterisk</strong>+variable+hangupcauseCuando el proxy reciba este 503 intentará sacar la llamada por otrogateway


<strong>Asterisk</strong> como gateway SIP/<strong>PSTN</strong> (III)CallerID en llamadas outboundEl proxy añade la cabecera “P­Asserted­Identity” y <strong>Asterisk</strong> haráhonor a esa cabecera:INVITE sip:+34999000111@IP_ASTERISK;user=phone SIP/2.0Record-Route: Via: SIP/2.0/UDP ADDR<strong>ES</strong>S_PROXY;branch=z9hG4bK7817.9f2e1eb2.0Via: SIP/2.0/UDP ADDR<strong>ES</strong>S_CLIENT;branch=z9hG4bK0bd0861e;rport=10001From: "Amancio" ;tag=as2d2bf44eTo: Contact: Call-ID: 318448b03164e77873d8e21a311ee21P-Asserted-Identity: Si el cliente solicite privacidad (número oculto) el proxy añade:Privacy: id


Dialplan[from-proxy]; ### Comprobar llamadas outbound simultáneasexten => _XX.,1,Macro(check-outbound,${EXTEN}); ### Extraemos el PAI para crear el verdadero CallerID.exten => _XX.,n,GotoIf($["${SIP_HEADER(P-Asserted-Identity)}"!=""]?pai:end-pai)exten => _XX.,n(pai),NoOp(--- P-Asserted-Identity ---)exten => _XX.,n,Set(UCLID=${CUT(CUT(SIP_HEADER(P-Asserted-Identity),@,1),:,2)})exten => _XX.,n,Set(CALLERID(all)=${UCLID} )exten => _XX.,n(end-pai),NoOp; ### ¿Privacidad solicitada (número oculto)?exten => _XX.,n,GotoIf($["${SIP_HEADER(Privacy)}"="id"]?privacy:end-privacy)exten => _XX.,n(privacy),NoOp(--- Privacy: id ---)exten => _XX.,n,SetCallerPres(prohib_not_screened)exten => _XX.,n(end-privacy),NoOp; ### Dial vía PRIexten => s,n,Dial(Zap/g1/${ARG1})exten => s,n,Hangup ; ¡¡ IMPORTANTE para que dé un; código de error coherente !!Importante: No escondemos el CallerID al carrier, sino que se loentregamos solicitando que no le sea mostrado al destino final.


<strong>Asterisk</strong> como gateway SIP/<strong>PSTN</strong> (IV)CallerID en llamadas inboundEl CallerID lo obtenemos siempre con ${CALLERID(all)}(incluso aunque sea oculto).Debemos averiguar si viene con número oculto (un poco “ñapa”)Antes de enviar el INVITE al proxy, añadimos la cabecera “P­Asserted­Identity”Y en caso de CallerID oculto, también “Privacy: id”


Dialplan[from-pstn]; ### Añadimos P-Asserted-Identity: CallerID real. Muy útil si la llamada; viene con CallerID oculto.exten => _XX,1,SIPAddHeader(P-Asserted-Identity:); ### ¿Privacy? Si viene con número oculto <strong>Asterisk</strong> lo traduce a:; From: "Unknown" ; No muy SIP RFC, lo más correcto sería:; From: "Anonymous" ; Nosotros añadimos el "Privacy: id" y el proxy esconderá el Fromexten => _XX,n,GotoIf($[${MATH(${CALLINGPR<strong>ES</strong>}>30)}=TRUE]?privacy:end-privacy)exten => _XX,n(privacy),SIPAddHeader(Privacy: id)exten => _XX,n(end-privacy),NoOp; ### Llamada al proxyexten => _XX,n,Dial(SIP/proxy/${EXTEN})exten => _XX,n,Hangup()El proxy localizará al usuario SIP correspondiente a dicho DIDEl proxy quitará el P­Asserted­Identity antes de rutar el INVITE alusuario


Y ya

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!