Crear una Sala de conferencias en mi centralita Asterisk - Problemas: Detección de colgado/Seguridad

1,440 views
Skip to first unread message

Miguel Alberto Sanz Pardo

unread,
Mar 13, 2015, 12:06:52 PM3/13/15
to aster...@googlegroups.com
Hola buenas tardes,



Estoy tratando de crear una sala de conferencias pero estoy teniendo algunos problemas/dudas.


En primer lugar:

-Si trato de invitar a la sala de conferencias a alguien que se esté registrado contra mi centralita no hay ningún problema. El otro usuario entra a la sala de conferencias y si cuelga el teléfono o pulsa 2 (tengo puesto en los controles del menú usado en la conferencia que pulsar 2 es abandonar la sala) se detecta el colgado y sale de la sala de conferencias.
- Si trato de invitar a la sala de conferencias a alguien que no esté registrado a mi centralita(un cliente por ejemplo) saliendo por cualquier proveedor de VOIP surge un gran problema. Por mucho que cuelgue el cliente sigue estando en la sala de conferencias y tengo que acabar haciendo un "confbridge kick".


Éste es el código que tengo en extensions.conf:

[ConferenceRooms]
exten => 969,1,NoOp()
same => n,Goto(conference,1)


exten => conference,1,NoOp()
same => n,Set(thisBridge=primary)
same => n,ConfBridge(${thisBridge},default_bridge,default_user,fancymenu)

#----------------------------------------------------------------------------------------------------
# Invitamos a alguien a la sala de conferencias
#----------------------------------------------------------------------------------------------------
exten => conference_joiner,1,NoOp()
same => n,Read(numberToDial,vm-enter-num-to-call)

# Si la extensión a la que invitamos tiene 3 dígitos será una extensión interna de nuestra centralita.
# Si tiene más de 3 dígitos estaremos invitando a alguien del exterior. Para ello saldremos a través 
# de uno de nuestros proveedores de VOIP
same => n,Set(longitud=${LEN(${numberToDial})})
same => n,Noop(Longitud extension: ${longitud} )
same => n,GotoIf($["${longitud}" = "3"]?extinterna:extexterna)


# Invitamos a la sala de conferencias a alguien de la red interna
same => n(extinterna),Originate(SIP/${numberToDial},exten,ConferenceRooms,969,1)
same => n,Goto(ConferenceRooms,969,1)


# Invitamos a la sala de conferencias a alguien del exterior
same => n(extexterna),Set(codigollamadamanual=${numberToDial:0:3})
same => n,Noop(Codigo Llamada Manual: ${codigollamadamanual} )
same => n,GotoIf($["${codigollamadamanual}" = "301"]?codproveedorvoip1:proveedorvoip2)
same => n(proveedorvoip2),GotoIf($["${codigollamadamanual}" = "302"]?codproveedorvoip2:proveedorvoip3)
same => n(proveedorvoip3),GotoIf($["${codigollamadamanual}" = "303"]?codproveedorvoip3:errorcodproveedor)


same => n(codproveedorvoip1),Originate(SIP/voipdiscount-alaw/${numberToDial:3},exten,ConferenceRooms,969,1)
same => n,Goto(ConferenceRooms,969,1)

same => n(codproveedorvoip2),Originate(SIP/netelip-alaw/${numberToDial:3},exten,ConferenceRooms,969,1)
same => n,Goto(ConferenceRooms,969,1)

same => n(codproveedorvoip3),Originate(SIP/serlink-alaw/${numberToDial:3},exten,ConferenceRooms,969,1)
same => n,Goto(ConferenceRooms,969,1)

same => n(errorcodproveedor),NoOp()
same => n,Goto(ConferenceRooms,969,1)


Mediante este código, si el numero al que llamo tiene 3 dígitos la llamada se realiza hacia usuarios registrados en mi centralita, si dispone de más dígitos sale por un proveedor de VOIP (el cual dependiendo de los 3 primeros dígitos sale por uno u otro) hacia un usuario que está conectado a una línea analógica. ¿Alguna idea de por qué no se detecta el colgado de la persona a la que invito, la cuál no está registrada en mi centralita?
Después de hacer el Originate para invitar al otro usuario ¿Qué debería de haber en mi código para volver a la sala de conferencias sin crear un usuario adicional de mi mismo?



Mi confbridge.conf dispone de todos los valores por default excepto:

[fancymenu]
type=menu
1=toggle_mute
2=leave_conference
3=dialplan_exec(ConferenceRooms,conference_joiner,1)
4=decrease_listening_volume
5=reset_listening_volume
6=increase_listening_volume
7=decrease_talking_volume
8=reset_talking_volume
9=increase_talking_volume
0=no_op




En segundo lugar:

En la empresa me han comentado que podría ser interesante el hecho de poder entrar en la sala de conferencias desde el contexto de las llamadas entrantes, lo cuál me da un poco de miedo, ya que podría entrar un usuario malicioso y hacer llamadas indeseadas. ¿Algún consejo de cómo implementar esta parte sin que haya problemas de seguridad? Se podría pedir un pin para entrar en la sala, pero el pin a fin de cuentas se podría acabar sacando ¿Alguna otra idea? 





un saludo y gracias por vuestras respuestas

Miguel Sanz
Message has been deleted

Miguel Alberto Sanz Pardo

unread,
Mar 16, 2015, 11:51:15 AM3/16/15
to aster...@googlegroups.com
¿Alguna idea de por qué no hay detección de colgado de manera correcta?

He probado a invitar a la sala de conferencias a través de distintos proveedores y el resultado es el mismo.

Si invito a la sala a alguna persona que esté registrada en la centralita se detecta el colgado de manera correcta si ésta cuelga.

Si alguien llega a la sala de conferencias a través del menú de llamadas entrantes también se detecta el colgado del usuario externo de manera correcta.

Miguel Alberto Sanz Pardo

unread,
Mar 16, 2015, 1:39:10 PM3/16/15
to aster...@googlegroups.com
Bueno, dándole vueltas se me ha ocurrido una solución alternativa:


He creado dos tipos de accesos a la sala de conferencias:

- Acceso tipo ADMIN
- Acceso tipo USER

De manera que si el admin se va de la sala automáticamente desconecta al resto. Aunque con esta solución me vale seguiré investigando por qué el llamado remoto no detecta colgado al ser llamado desde VOIP.

Os dejo mi dialplan por si a alguien le puede servir:

[ConferenceRooms]
; ----------------------------------------------------------------------------------------------------
; Extensión de entrada a Sala de conferencias (USER)
; ----------------------------------------------------------------------------------------------------
exten => 950,1,NoOp()
same => n,Goto(conference_user,1)

exten => conference_user,1,NoOp()
same => n,Set(thisBridge=primary)
same => n,ConfBridge(${thisBridge},bridge_IPC,user_IPC,user_menu_IPC)

; ----------------------------------------------------------------------------------------------------
; Extensión de entrada a Sala de conferencias (ADMIN)
; ----------------------------------------------------------------------------------------------------
exten => 951,1,NoOp()
same => n,Goto(conference_admin,1)

exten => conference_admin,1,NoOp()
same => n,Set(thisBridge=primary)
same => n,ConfBridge(${thisBridge},bridge_IPC,admin_IPC,admin_menu_IPC)

; ----------------------------------------------------------------------------------------------------
; Invitamos a un usuario a la sala de conferencias
; ----------------------------------------------------------------------------------------------------
exten => conference_joiner,1,NoOp()
same => n,Read(numberToDial,vm-enter-num-to-call)
; Si la extensión a la que invitamos tiene 3 dígitos será una extensión interna de nuestra centralita.
; Si tiene más de 3 dígitos estaremos invitando a alguien del exterior. Para ello saldremos a través 
; de uno de nuestros proveedores de VOIP
same => n,Set(longitud=${LEN(${numberToDial})})
same => n,Noop(Longitud extension: ${longitud} )
; same => n,GotoIf($["${longitud}" = "3"]?extinterna:extexterna)
same => n,GotoIf($["${longitud}" = "3"]?ConferenceRooms,llamadainterna,1:ConferenceRooms,llamadaexterna,1)


; Invitamos a la sala de conferencias a alguien de la red interna
exten => llamadainterna,1,NoOp() 
same  => n,Originate(SIP/${numberToDial},exten,ConferenceRooms,951,1)

; Invitamos a la sala de conferencias a alguien del exterior
exten => llamadaexterna,1,NoOp()
same  => n,Set(codigollamadamanual=${numberToDial:0:3})
same => n,GotoIf($["${codigollamadamanual}" = "901"]?ConferenceRooms,codproveedor1,1)
same => n,GotoIf($["${codigollamadamanual}" = "902"]?ConferenceRooms,codproveedor2,1)
same => n,GotoIf($["${codigollamadamanual}" = "903"]?ConferenceRooms,codproveedor3,1)

exten => codproveedor1,1,NoOp()
same =>  n,Originate(SIP/proveedor1/${numberToDial:3},exten,ConferenceRooms,951,1)

exten => codproveedor2,1,NoOp()
same =>  n,Originate(SIP/proveedor2/${numberToDial:3},exten,ConferenceRooms,951,1)

exten => codproveedor3,1,NoOp()
same =>  n,Originate(SIP/proveedor3/${numberToDial:3},exten,ConferenceRooms,951,1)



Y en el confbridge.conf:

[bridge_IPC]
type=bridge
max_members=5

[admin_IPC]
type=user
admin=yes
marked=yes
pin=XXXXXXX

[user_IPC]
type=user
end_marked=yes

[admin_menu_IPC]
type=menu
1=toggle_mute
2=leave_conference
3=dialplan_exec(ConferenceRooms,conference_joiner,1)
5=admin_kick_last
8=admin_toggle_conference_lock
4=decrease_listening_volume
6=increase_listening_volume
7=decrease_talking_volume
9=increase_talking_volume
0=no_op

[user_menu_IPC]
type=menu
1=toggle_mute
2=leave_conference

Miguel Alberto Sanz Pardo

unread,
Mar 17, 2015, 1:03:33 PM3/17/15
to aster...@googlegroups.com
Por cierto, en una sala de conferencias, por mucho que todos mis teléfonos tengan codec g729, la centralita me va a pedir una licencia por cada cliente que entre en la sala ¿No? Aquí no hay ninguna forma de decirle a Asterisk que nuestros terminales ya disponen todos de la licencia g729 y que no tiene que hacer ningún transcoding ni nada por el estilo ¿Cierto?

He entrado a la sala y al tratar de invitar a un segundo usuario me dice:

[2015-03-17 17:57:20] WARNING[10293][C-0000057b]: chan_sip.c:6370 sip_call: No audio format found to offer. Cancelling call to XXX
[2015-03-17 17:57:20] NOTICE[10293][C-0000057b]: channel.c:5694 __ast_request_and_dial: Unable to call channel SIP/XXX

Raúl Alexis Betancor Santana

unread,
Mar 17, 2015, 1:12:11 PM3/17/15
to aster...@googlegroups.com
El Asterisk te va a consumir una licencia por cada participante ... ¿el motivo? ... que tiene que hacer transcoding de G729 a SLIN para hacer el mix y luego otra vez a G729 para enviar.


--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
Normas de la lista Asterisk-ES: http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
---
Has recibido este mensaje porque estás suscrito al grupo "asterisk-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asterisk-es...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a aster...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/asterisk-es.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Miguel Alberto Sanz Pardo

unread,
Mar 18, 2015, 4:30:25 AM3/18/15
to aster...@googlegroups.com
Gracias por tu respuesta Raúl,


Entonces o muero al palo y compro 3-4 licencias más (no creo que en las conferencias de mi empresa haya más de 3-4 participantes, lo normal es que la gente se reuna en la sala de reuniones y contacten con hasta 2 personas que estén en otros lugares) o uso el g711 teniendo en cuenta que el ancho de banda de subida que hay en la empresa (el cual es de 800Kb en el mejor de los casos y más bien se aproxima a 600kbps).


Además de las aplicaciones de conferencias (Confbridge, Meetme) entiendo que la aplicación de Page seguirá el mismo sistema, es decir que se consumirá una licencia g729 por cada persona que entre en el page.

¿Se te ocurre alguna otra aplicación de uso común en el que haya que tirar de más de una licencia g729 sí o sí?


Por cierto, aunque ya solucioné el tema de las detecciones de colgado haciendo que si se va el admin se desconecten el resto de los usuarios de la sala, sabes qué podría hacer para tratar de analizar qué está pasando con los usuarios que invito a través de VOIP los cuáles si cuelgan no se detecta el colgado y se quedan enganchados hasta que les hago un kick o hasta que me desconecto haciendo la función de admin.



un saludo y gracias por todo

Miguel Sanz

Miguel Alberto Sanz Pardo

unread,
Mar 18, 2015, 7:52:06 AM3/18/15
to aster...@googlegroups.com
Acabo de ver que si en el fichero sip.conf los terminales que entran en la conversación están configurados de esta manera:

Ejemplo:
[pepito]
disallow=all
allow=g729
allow=alaw


Cuando me conecto a la sala de conferencias habiendo modificado previamente el código:

[ConferenceRooms]
; ----------------------------------------------------------------------------------------------------
Extensión de entrada a Sala de conferencias (USER)
; ----------------------------------------------------------------------------------------------------
exten => 950,1,NoOp()
same => n,Goto(conference_user,1)

exten => conference_user,1,NoOp()
same => n,Set(thisBridge=primary)
same => n, Set(SIP_CODEC=alaw)
same => n,ConfBridge(${thisBridge},bridge_IPC,user_IPC,user_menu_IPC)

; ----------------------------------------------------------------------------------------------------
Extensión de entrada a Sala de conferencias (ADMIN)
; ----------------------------------------------------------------------------------------------------
exten => 951,1,NoOp()
same => n,Goto(conference_admin,1)

exten => conference_admin,1,NoOp()
same => n,Set(thisBridge=primary)
same => n, Set(SIP_CODEC=alaw)
same => n,ConfBridge(${thisBridge},bridge_IPC,admin_IPC,admin_menu_IPC)


Uso el codec alaw sin que haya problemas de transcoding.



Pero si trato de invitar a alguien al parecer ignora el Set(SIP_CODEC=alaw) 

; Invitamos a la sala de conferencias a alguien de la red interna
exten => llamadainterna,1,NoOp() 
same => n, Set(SIP_CODEC=alaw)
same  => n,Originate(SIP/${numberToDial},exten,ConferenceRooms,951,1)



¿Existe alguna solución ante esto o acaso el comando Originate() no lo interpreta de forma parecida al comando Dial()?

Miguel Alberto Sanz Pardo

unread,
Mar 25, 2015, 12:03:04 PM3/25/15
to aster...@googlegroups.com
Me surge otra duda:


Si trato de invitar a alguien a la sala de conferencias mediante un gateway RDSI (en mi caso tengo un acceso 2xBRI(4 canales)) :

...
exten => prefijo_valido_rdsi,1,NoOp()
same  => n,Originate(SIP/vegaRDSI/1111${numberToDial:3},exten,ConferenceRooms,968,1)
same  => n,Originate(SIP/vegaRDSI/3333${numberToDial:3},exten,ConferenceRooms,968,1)
same  => n,Originate(SIP/vegaRDSI/2222${numberToDial:3},exten,ConferenceRooms,968,1)
same  => n,Originate(SIP/vegaRDSI/4444${numberToDial:3},exten,ConferenceRooms,968,1)

En caso de que el primer canal esté ocupado ¿Puedo capturar alguna variable que me diga si el primer canal de mi contexto esta libre u ocupado? Sino puedo realizar hasta 4 invitaciones simultáneas a mi sala de conferencias al mismo número, lo cuál  no me interesa.


un saludo

Miguel Sanz

Reply all
Reply to author
Forward
0 new messages