Asterisk 1.6.X y el protocolo DUNDi

Cuando hay que conectar un numero considerable de servidores Asterisk y compartir las rutas y las extensiones configuradas en cada uno de ellos, la solución más funcional es el protocolo DUNDi. DUNDi (Distributed Universal Number Discovery) es un protocolo que permite buscar y compartir plan de llamadas entre servidores Asterisk. Esto por medio de una red Peer-to-peer (punto-a-punto) en la cual no existen roles fijos de clientes y servidores, sino que los servidores pueden asumir uno u otro rol.

A lo largo de la configuración se puede decidir si compartir contextos ya configurados en el Dialplan (plan de llamadas) o crear contextos nuevos donde se indican la rutas que se quieren compartir. Aunque la configuración y puesta en marcha pueda parecer algo complicado, con un poco de practica se irán aclarando las ideas y los conceptos claves.

En el escenario que se presenta en este articulo hay dos servidores Asterisk con estas características:

Servidor A:
Version Asterisk: 1.6.0.17
IP: 192.168.142.248
usuario: vozcom
Extensiones: 2000-2999

Servidor B:
Version Asterisk: 1.4.26.2
IP: 192.168.142.246
usuario: vozorg
Extensiones: 6000-6099

Los dos servidores están en la misma LAN pero pueden estar ubicados en cualquier parte del mundo.

Con la configuración del archivo dundi.conf se definen los parámetros de conexión entre los servidores Asterisk y los contextos que se van a compartir. En el mismo archivo se define el tipo de protocolo que los dos servidores usarán para efectuar y recibir llamadas una vez que se haya encontrado la ruta (puede ser IAX2, SIP o H323). Por ultimo se modifica el Dialplan (plan de llamadas) para definir en los contextos configurados en dundi.conf, cuales son las rutas o contextos que se quiere compartir.

Servidor A

nano /etc/asterisk/dundi.conf

[general]
; desde esta etiqueta empieza la configuración general de DUNDi

department=VozCom
organization=VozCom
locality=Santa Marta
stateprov=Magdalena
country=Colombia
email=admin@servidorA.com
phone=+57XXXXXXXXXX

; se indican los datos de la empresa y de contacto

bindaddr=0.0.0.0
; dirección IP del servidor Asterisk o si se deja en 0.0.0.0 todos los IP disponibles en el servidor

port=4520
; puerto predefinido usado por el protocolo DUNDi. Hay que abrirlo en el cortafuegos (4520 UDP)

entityid=FE:FD:45:A4:C5:68
; el MAC address de la tarjeta de red que se va a usar para la conexión

cachetime=3600
; cuando se envía un solicitud para conocer la disponibilidad de una ruta y se encuentra una disponible, el resultado se guardará por el tiempo definido en este parámetro (en segundos) en la base de datos interna de Asterisk.

ttl=32
;Time to Live es un numero que representa cuanto lejos hay que ir para recibir una respuesta a la solicitud que se hizo para buscar una ruta.

autokill=yes
; si no se recibe una respuesta dentro de 2000 ms de un servidor conectado a la red DUNDi se   anulará la solicitud. Esto permite evitar que las solicitudes queden colgadas en algún punto de la red.

secretpath=dundi
; el modulo pbx_dundi crea una clave que rotará de manera automática y que se guarda en la base de datos interna de Asterisk.

storehistory=yes
; mantiene un registro de las ultimas solicitudes efectuadas con los tiempos de respuesta por cada una. De esta forma es posible averiguar cuales son los nodos lentos dentro de la red DUNDi

[mappings]
; desde esta etiqueta empieza el mapeo de los contextos DUNDi con los contextos presentes en el servidor Asterisk. Las sintaxis para definir los contextos es:

; dundi_context => local_context,weight,tech,dest[,options]]

  • dundi_context: el contexto DUNDi que se quiere compartir con los demás nodos de la red DUNDi
  • local_context: el contexto local definido en el plan de llamadas donde se configuran las rutas o extensiones que se quieren compartir
  • weight: el peso que damos a las rutas que compartimos. Si son extensiones locales se pone 0, si son rutas por la cuales no tenemos una conexión directa o de alta calidad ponemos un numero más alto. Al momento de hacer una solicitud si para el mismo numero requerido existen distintas rutas, se escogerá la ruta con menor peso
  • tech: protocolo usado para la conexión entre servidores Asterisk (se usará IAX2)
  • dest: cuando se hace una solicitud desde el servidor B y se encuentra una ruta en el Servidor A, el Servidor A usará esta destinación para recibir la llamada. Simplificando: se crea un user en el iax.conf del servidor Asterisk A y dest representa los paramentos para conectarse a ese user y a través de la conexión recibir las llamadas del servidor B
  • options: son las distintas opciones que se pueden añadir por cada contexto DUNDi:
    • nounsolicited – llamadas de cualquier tipo que no sean solicitadas no son permitidas en esta ruta
    • nocomunsolicit – llamadas comerciales no solicitadas no son permitidas en esta ruta
    • residential – el numero es de una residencia
    • commercial – el numero es de una empresa
    • mobile – el numero es un celular
    • nopartial – no se harán búsquedas por números que no sean completos

la ruta definida para el servidor A será:

vozcom => vozcom-local,0,IAX2,vozcom:${SECRET}@192.168.142.248/${NUMBER}

  • vozcom: el contexto DUNDi que se va a compartir
  • dundi-local: el contexto definido en el plan de llamadas que contendrá todas las rutas que se van a compartir
  • IAX2: la tecnología usada (protocolo) para las llamadas
  • vozcom: usuario que se configurará en el el archivo iax.conf
  • ${SECRET}: es la variable que contiene la clave que el modulo DUNDi crea en automático y que se usará para autenticar el usuario vozcom
  • 192.168.142.248:  dirección IP del Servidor A
  • ${NUMBER}: la variable que contendrá el numero que ha sido solicitado.

Para terminar con la configuración del archivo dundi.conf se definen los servidores Asterisk con los se va a tener una conexión directa:

[FE:FD:45:A4:C4:49]
model = symmetric
host = 192.168.142.246
inkey = vozorg
outkey = vozcom
include = all
permit = vozcom
qualify = yes

  • FE:FD:45:A4:C4:48: MAC address de la tarjeta de red de Servidor Asterisk B con el que se crea la conexión
  • model: puede ser:
    • inbound: recibe solamente solicitudes
    • outbound: solo efectúa solicitudes pero no las recibe
    • symmetric: recibe y efectúa solicitudes
  • host: direccion IP o nombre de dominio del servidor Asterisk B
  • inkey: clave RSA usada para autenticarse con el servidor Asterisk B
  • outkey: clave RSA usada por el Servidor Asterisk B para autenticarse con el Servidor Asterisk A
  • include: incluye esta conexión para todas las solicitudes efectuadas en el Servidor Asterisk A
  • permit: se definen los contextos DUNDi a los que tendrá acceso este nodo
  • qualify: se controlará periódicamente que la conexión con el nodo esté activa

Se guardan los cambios y se crea la clave RSA para autenticar el Servidor Asterisk B. Para crear la clave se usará una utilidad que viene con la instalación de asterisk. Primero entramos en la carpeta donde se guardan las claves:

cd /var/lib/asterisk/keys

Se crea la clave:

astgenkey -n vozcom

This script generates an RSA private and public key pair
in PEM format for use by Asterisk.  You will be asked to
enter a passcode for your key multiple times.  Please
enter the same code each time.  The resulting files will
need to be moved to /var/lib/asterisk/keys if you want
to use them, and any private keys (.key files) will
need to be initialized at runtime either by running
Asterisk with the '-i' option, or with the 'init keys'
command once Asterisk is running.

Press ENTER to continue or ^C to cancel.

Presionamos la tecla envío:

Generating SSL key 'vozcom':
Generating RSA private key, 1024 bit long modulus
.....................................++++++
.............++++++
e is 65537 (0x10001)
writing RSA key
Key creation successful.
Public key:  vozcom.pub
Private key: vozcom.key

Se crearán dos claves, una publica y una privada. La publica se copia en el Servidor Asterisk B:

scp vozcom.pub root@192.168.142.246:/var/lib/asterisk/keys

Ahora se puede añadir el usuario vozcom al archivo iax.conf

nano /etc/asterisk/iax.conf

Se añaden las siguientes lineas en el bloque dedicado a la configuración de las extensiones:

[vozcom]
type=user
dbsecret=dundi/secret
context=vozcom-local
qualify=yes
disallow=all
allow=ulaw
allow=alaw

Importante definir el parámetro context con el valor del contexto que hemos definido en nuestra ruta (vozcom-local)

El ultimo archivo que hay que modificar es el plan de llamadas:

nano /etc/asterisk/extensions.conf

Se crea el contexto vozcom-local y se incluyen en él las rutas que se quieren compartir (las extensiones locales y una ruta para las llamadas a Colombia)

[vozcom-local]
exten => _0057.,1,Dial(SIP/justvoip/${EXTEN})
exten => _2XXX,1,Dial(SIP/${EXTEN},15)
exten => _2XXX,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => _2XXX,n(busy),Voicemail(${EXTEN}@default,b)
exten => _2XXX,n,Hangup
exten => _2XXX,n(unavail),Voicemail(${EXTEN}@default,u)
exten => _2XXX,n,Hangup

Para las solicitudes remotas creamos otro contexto:

[dundi-remoto]
switch => DUNDi/vozorg

el nombre vozorg es el contexto DUNDi que luego se creará en el Servidor Asterisk B

Añadimos el contexto dundi-remoto a la lista de contextos disponibles para la extensiones configuradas en el Servidor Asterisk A:

[phones]
include => internas
include => externas
include => subscribe
include => parkedcalls
include => conferencias
include => dundi-remoto

Se guardan los cambios y se continúa con la configuración del Servidor Asterisk B

Servidor B

nano /etc/asterisk/dundi.conf

[general]

department=VozOrg
organization=VozOrg
locality=Santa Marta
stateprov=Magdalena
country=Colombia
email=admin@servidorB.com
phone=+57XXXXXXXX
bindaddr=0.0.0.0
port=4520
entityid=FE:FD:45:A4:C4:48
cachetime=3600
ttl=32
autokill=yes
secretpath=dundi
storehistory=yes

[mappings]
vozorg => vozorg-local,0,IAX2,vozorg:${SECRET}@192.168.142.246/${NUMBER}

[FE:FD:45:A4:C5:68]
model = symmetric
host = 192.168.142.248
inkey = vozcom
outkey = vozorg
include = all
permit = vozorg
qualify = yes

Se crea la clave RSA:

cd /var/lib/asterisk/keys

astgenkey -n vozorg

This script generates an RSA private and public key pair
in PEM format for use by Asterisk.  You will be asked to
enter a passcode for your key multiple times.  Please
enter the same code each time.  The resulting files will
need to be moved to /var/lib/asterisk/keys if you want
to use them, and any private keys (.key files) will
need to be initialized at runtime either by running
Asterisk with the '-i' option, or with the 'init keys'
command once Asterisk is running.

Press ENTER to continue or ^C to cancel.

Presionamos la tecla envío:

Generating SSL key 'vozorg':
Generating RSA private key, 1024 bit long modulus
.....................................++++++
.............++++++
e is 65537 (0x10001)
writing RSA key
Key creation successful.
Public key:  vozorg.pub
Private key: vozorg.key

Se copia en el Servidor Asterisk A

scp vozorg.pub root@192.168.142.248:/var/lib/asterisk/keys

nano /etc/asterisk/iax.conf

[vozorg]
type=user
qualify=yes
dbsecret=dundi/secret
context=vozorg-local
disallow=all
allow=ulaw
allow=alaw

Para terminar se modifica el plan de llamadas:

nano /etc/asterisk/extensions.conf

[vozorg-local]
exten => _60XX,1,Dial(SIP/${EXTEN})

[dundi-remoto]
switch => DUNDi/vozcom

Se incluye el contexto dundi-remoto de forma que sea accesible a las extensiones

Una vez terminada la configuración del Servidor Asterisk B en ambos se reinicia la PBX:

/etc/init.d/asterisk restart

Se entra en la consola del servidor Asterisk A:

asterisk -rvvvvvvvvvvvv

para ver la lista de comandos disponibles para DUNDi

CLI> help dundi

dundi flush [stats] Flush DUNDi cache
                  dundi lookup Lookup a number in DUNDi
                dundi precache Precache a number in DUNDi
                   dundi query Query a DUNDi EID
      dundi set debug {on|off} Enable/Disable DUNDi debugging
           dundi show entityid Display Global Entity ID
           dundi show mappings Show DUNDi mappings
dundi show peers [registered|i Show defined DUNDi peers
               dundi show peer Show info on a specific DUNDi peer
           dundi show precache Show DUNDi precache
           dundi show requests Show DUNDi requests
              dundi show trans Show active DUNDi transactions
  dundi store history {on|off} Enable/Disable DUNDi historic records


Primero se controla que haya conexión entre los dos servidores:

CLI> dundi show peers

EID                           Host                         Model         AvgTime  Status
fe:fd:45:a4:c4:48    192.168.142.246 (S) Symmetric  Unavail  OK (1 ms)

Con el comando:

CLI> database show

/dundi/secret                   : qotQe+Vp1B2G7S9yoizlPA==;3obGb1QtvkUeciZs7rH5CA==
/dundi/secretexpiry         : 1259212403

aparecerá la clave creada por el modulo pbx_dundi y el tiempo que falta para que caduque.

Ahora se puede hacer la primera consulta para controlar que efectivamente las rutas se están compartiendo:

CLI> dundi lookup 6099@vozorg

1. 0 IAX2/vozorg:c0vuYb1EYDRo2QVnM8D3Fg==@192.168.142.246/6099 (EXISTS|CANMATCH)
     from fe:fd:45:a4:c4:49, expires in 2982 s
DUNDi lookup completed in 0 ms

En el servidor Asterisk B las extensiones compartidas van de 6000 a 6099 y efectivamente enviando la solicitud la respuesta es que la extensión existe. En el comando además de la extensión va indicado el contexto como e ha definido en el bloque mappings del dundi.conf del servidor Asterisk B.

Si se envía una solicitud para una ruta que no existe la respuesta será:

CLI> dundi lookup 6100@vozorg

DUNDi lookup returned no results.
DUNDi lookup completed in 2 ms

Se hace otra solicitud de prueba desde el Servidor Asterisk B

CLI> dundi lookup 2100@vozcom

  1.     0 IAX2/vozcom:3obGb1QtvkUeciZs7rH5CA==@192.168.142.248/2100 (EXISTS)
     from fe:fd:45:a4:c5:69, expires in 2624 s
DUNDi lookup completed in 0 ms

Solicitud para un numero colombiano:

CLI> dundi lookup 0057123456789@vozcom
 1.     0 IAX2/vozcom:3obGb1QtvkUeciZs7rH5CA==@192.168.142.248/0057123456789 (EXISTS|MATCHMORE|CANMATCH)
     from fe:fd:45:a4:c5:69, expires in 3600 s
DUNDi lookup completed in 39 ms

Para terminar las pruebas se conecta un softphone al servidor Asterisk B y se intenta llamar la extensión 2100 (que es presente en el servidor Asterisk A)

Esto es lo que aparece en la consola de Asterisk del servidor A:

Accepting AUTHENTICATED call from 192.168.142.246:
       > requested format = ulaw,
       > requested prefs = (ulaw|alaw),
       > actual format = ulaw,
       > host prefs = (ulaw|alaw),
       > priority = mine
    -- Executing [2100@vozcom-local:1] Dial("IAX2/vozcom-1213", "SIP/2100,15") in new stack
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
  == Using SIP VRTP TOS bits 136
  == Using SIP VRTP CoS mark 4
  == Using UDPTL TOS bits 184
  == Using UDPTL CoS mark 5
[Nov 26 00:06:39] WARNING[6087]: app_dial.c:1499 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Unknown)
  == Everyone is busy/congested at this time (1:0/0/1)
    -- Executing [2100@vozcom-local:2] GotoIf("IAX2/vozcom-1213", "0?busy:unavail") in new stack
    -- Goto (vozcom-local,2100,5)
    -- Executing [2100@vozcom-local:5] VoiceMail("IAX2/vozcom-1213", "2100@default,u") in new stack

La llamada llega desde la IP del servidor Asterisk B y va al contexto vozcom-local (las rutas compartidas). Como la extensión 2100 no está disponible la llamada entra el contestador.

Las potencialidades del protocolo DUNDi son prácticamente infinitas y este párrafo se han presentado la herramientas básicas para empezar a utilizarlo.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

5 comentarios

Duda

Buenas.. Muy bueno tu tutorial…. me ayudo bastante pero tengo un problema…. segui detalladamente todo, pero al hacer las pruebas de llamada a la extension del otro sitio me sale con tono ocupado y no entra la llamada, he modificado de diferentes formas el contexto pero aun asi no puedo sacar la llamada, en todas las pruebas me sale todo ok, hasta en esta:
dundi lookup 1008@extensiones-locales bypass
1. 0 IAX2/dundi:swFZKGo0M1dWO5OudRQ==/192.168.2.101/1008 (EXISTS|CANMATCH)
from 00:0f:30:2c:1c:a8, expires in 5 s
DUNDi lookup completed in 69 ms

Cual puede ser el problema que tengo?? Espero que me pueda dar una mano con este problema q tengo hace dias, Gracias!

Re: Duda

Si cuando haces el dundi lookup la extension existe, el problema debe estar en el dialplan del otro servidor. Cuando intentas llamar esa extension desde un softphone que te aparece en la consola de Asterisk de los dos servidores?

Mira bien si hay algun error y me cuentas.
Saludos

Re: Duda

Buenas....

Gracias por responder!
Esto es lo que me sale por consola verificando en el /var/log/asterisk/full :

[Jan 29 17:56:27] DEBUG[32359] pbx_dundi.c: Found cache expiring in 1 seconds!
[Jan 29 17:56:27] DEBUG[32359] pbx_dundi.c: Found cached answer 'IAX2/dundi:rICQUns00Wd2ZFkJshr4Ag==/192.168.2.101/1008' originally from '000F202C0CA6' with flags 'EXISTS|CANMATCH' on behalf of '00:0f:20:2c:0c:a6'
[Jan 29 17:56:27] DEBUG[32359] pbx_dundi.c: Found cache expiring in 1 seconds!
[Jan 29 17:56:27] DEBUG[32359] pbx_dundi.c: Found cached answer 'IAX2/dundi:rICQUns00Wd2ZFkJshr4Ag==/192.168.2.101/1008' originally from '000F202C0CA6' with flags 'EXISTS|CANMATCH' on behalf of '00:0f:20:2c:0c:a6'
[Jan 29 17:56:32] WARNING[32359] chan_iax2.c: No such host: dundi
[Jan 29 17:56:32] WARNING[32359] app_dial.c: Unable to create channel of type 'IAX2' (cause 20 - Unknown)
[Jan 29 17:56:32] VERBOSE[32359] logger.c: == Everyone is busy/congested at this time (1:0/0/1)
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Registering request for '1008@extensiones-locales' on behalf of '00:00:00:00:00:00' crc '00000000'
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Will query peer '00:0f:20:2c:0c:a6' for '1008@extensiones-locales'
[Jan 29 17:56:32] DEBUG[31617] pbx_dundi.c: Got canonical message 13 (0), 98 bytes data
[Jan 29 17:56:32] DEBUG[31617] pbx_dundi.c: Got canonical message 66 (0), 70 bytes data (Final)
[Jan 29 17:56:32] DEBUG[31617] pbx_dundi.c: Looks like success of some sort (-1), 1 answers
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Registering request for '1008@extensiones-locales' on behalf of '00:00:00:00:00:00' crc '00000000'
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cache expiring in 1 seconds!
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cached answer 'IAX2/dundi:rICQUns00Wd2ZFkJshr4Ag==/192.168.2.101/1008' originally from '000F202C0CA6' with flags 'EXISTS|CANMATCH' on behalf of '00:0f:20:2c:0c:a6'
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cache expiring in 1 seconds!
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cached answer 'IAX2/dundi:rICQUns00Wd2ZFkJshr4Ag==/192.168.2.101/1008' originally from '000F202C0CA6' with flags 'EXISTS|CANMATCH' on behalf of '00:0f:20:2c:0c:a6'
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cache expiring in 1 seconds!
[Jan 29 17:56:32] DEBUG[32359] pbx_dundi.c: Found cached answer 'IAX2/dundi:rICQUns00Wd2ZFkJshr4Ag==/192.168.2.101/1008' originally from '000F202C0CA6' with flags 'EXISTS|CANMATCH' on behalf of '00:0f:20:2c:0c:a6'
[Jan 29 17:56:32] VERBOSE[32359] logger.c: == Auto fallthrough, channel 'SIP/3017-b7c04b40' status is 'CHANUNAVAIL'
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Executing [h@from-internal:1] Macro("SIP/3017-b7c04b40", "hangupcall") in new stack
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Executing [s@macro-hangupcall:1] GotoIf("SIP/3017-b7c04b40", "1?skiprg") in new stack
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Goto (macro-hangupcall,s,4)
[Jan 29 17:56:32] DEBUG[32359] app_macro.c: Executed application: GotoIf
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Executing [s@macro-hangupcall:4] GotoIf("SIP/3017-b7c04b40", "1?skipblkvm") in new stack
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Goto (macro-hangupcall,s,7)
[Jan 29 17:56:32] DEBUG[32359] app_macro.c: Executed application: GotoIf
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Executing [s@macro-hangupcall:7] GotoIf("SIP/3017-b7c04b40", "1?theend") in new stack
[Jan 29 17:56:32] VERBOSE[32359] logger.c: -- Goto (macro-hangupcall,s,9)
[Jan 29 17:56:32] DEBUG[32359] app_macro.c: Executed application: GotoIf

estoy revisando por tooodos lados pero no encuentro cual puede ser el problema he hecho la misma configuracion en los dos server claro q cambiando las extensiones de cada uno porq el del Server A es con 3XXX y el del Server B es con 1XXX.
Espero tus comentarios...

Re: Re: Duda

parece que el problema es este:

[Jan 29 17:56:32] WARNING[32359] chan_iax2.c: No such host: dundi
[Jan 29 17:56:32] WARNING[32359] app_dial.c: Unable to create channel of type 'IAX2' (cause 20 - Unknown)

No puede crear la llamada porque no encuentra la configuración del usuario dundi en el iax2.conf.

He notado que en la guía tenia invertidas las direcciones ip de los dos servidores. Mira si puede depender de esto:

Servidor A:
Version Asterisk: 1.6.0.17
IP: 192.168.142.248
usuario: vozcom
Extensiones: 2000-2999

Servidor B:
Version Asterisk: 1.4.26.2
IP: 192.168.142.246
usuario: vozorg
Extensiones: 6000-6099

Esta es la versión corregida... que ya actualicé en la guía.

Si así no se soluciona y te sale otra vez error, postea el log como lo hiciste ahora.

Saludos

Caller ID

buenas amigo primeramente permitame felicitarte por tan buena explicación, se que es un tema algo viejo, pero me estoy incursionando en el tema de asterisk, y bueno, ya logre realizar la configuración que explicas anteriormente, pero he notado que al realizar una llamada desde un servidor a otro, en la pantalla de los teléfonos no sale el nombre de la extensión desde la cual se realiza la llamada, simplemente dice . Estuve leyendo comunicaciones unificadas con elastix pero no he logrado dar con una solución. Agradecería tu ayuda! saludos.

Suscribirse a Comentarios de "Asterisk 1.6.X y el protocolo DUNDi" Suscribirse a VozToVoice - Todos los comentarios