Configuración práctica de Asterisk (16): Diferencias entre usar type=friend y type=peer

Uno de los ficheros básicos de Asterisk es sip.conf, en el cual se definen tanto las extensiones SIP de la PBX como los enlaces SIP con otras centralitas o con proveedores de VoIP. En la definición de estas extensiones y enlaces se utiliza habitualmente las líneas type=friend para las extensiones y type=peer para los enlaces, pero la sorpresa viene cuando al buscar información sobre las características de uno y otro tipo, se encuentra en muchas de las fuentes consultadas y de forma casi literal una frase que no hace sino aumentar las dudas:  “las extensiones se declaran como type=friend porque así la PBX funcionará correctamente en la mayoría de las ocasiones ” 

Lógicamente la pregunta que surge de forma automática es: ¿Hay casos en los que una extensión declarada como type=friend hace que Asterisk no funcione correctamente? Y la respuesta es afirmativa, ya que hay al menos un caso claro en el que tal hecho se produce: cuando se establecen enlaces SIP entre dos o más sistemas Asterisk y en ambos extremos las extensiones tienen la misma numeración:

Enlace entre sistemas Asterisk con igual plan de numeración de extensiones

En un caso como estos, podemos utilizar un código de selección de línea externa para distinguir cuando nos dirigimos a una extensión interna o a una extensión situada en la otra centralita. En la configuración mostrada a continuación se ha elegido el código “0” para la función de selección de enlace externo, de tal manera que al marcar 101 0 102 se llama a una extensión de la misma centralita y al marcar 0101 o 0102, se llama a las extensiones 101 y 102 situadas en la otra centralita. Los ficheros extensions.conf tendrán en ambos casos la siguiente forma:

[contexto-extensiones]                                                                                                                     ; llamadas internas                                                                                                                                  exten => _10[12],1,Dial(SIP/${EXTEN})                                                                                          same => n,Hangup( )                                       

; llamadas salientes hacia el otro Asterisk                                                                                          exten => _010[12],1,Dial(SIP/enlace-asterisk/${EXTEN:1})                                                        same => n,Hangup( ) 

[contexto-llamadas-entrantes-por-el-enlace-SIP]                                                             ;llamadas entrantes desde el otro Asterisk                                                                                      exten => _10[12],1,Dial(SIP/${EXTEN})

Pero al comprobar la configuración anterior se verifica que no es posible establecer llamadas salientes por el enlace SIP en ninguno de los dos sentidos, obteniéndose en la consola de Asterisk un fallo de autentificación como el siguiente:

Fallo de autentificación en las llamadas a través del enlace SIP

Sin embargo, y he aquí la sorpresa, cuando las extensiones se declaran como type=peer, todo funciona correctamente, las llamadas internas y las llamadas a través del enlace SIP.

Llamada correcta a través del enlace cuando se declaran las extensiones como type=peer

La explicación a este hecho reside en la forma en que Asterisk identifica el contexto donde debe ser tratado cada mensaje INVITE que recibe. Cada vez que Asterisk recibe un INVITE, comprueba si el valor del campo From coincide con el nombre de algún dispositivo identificado como type=friend. Si se verifica esta coincidencia, el context indicado en dicho dispositivo es donde debe tratarse ese mensaje INVITE dentro del fichero extensions.conf. Si esa coincidencia no existe, se verifica si algún dispositivo identificado como type=peer contiene su valor host una dirección IP/puerto idénticos a los indicados como fuente en el mensaje INVITE. Si ninguno de estos valores coincide, el mensaje INVITE recibido se envía, si es que existe, al contexto default del fichero extensions.conf. 

Identificación del context para los mensajes INVITE recibidos

Llamada de la extensión 101 a la extensión 101, ambas type=peer

Campo “From” y “dirección IP” con los que se busca coincidencia en los mensajes INVITE

Cuando se realiza una llamada a través de un enlace SIP desde una extensión de un Asterisk a otra extensión que tiene el mismo número y que está situada en un segundo Asterisk, si esta ha sido definida como type=friend, se producirá una coincidencia entre el campo From del mensaje INVITE recibido respecto del número de la extensión, produciéndose un fallo de autentificación, siendo rechazada la llamada.

Llamada no permitida, servicio no disponible

Contenido del mensaje de servicio no disponible: “unrecognised SIP header”

Cabe señalar que si la extensión de destino situada en el segundo Asterisk ha sido definida como type=peer, la llamada se efectuará de forma correcta, ya que el mensaje INVITE recibido coincidirá únicamente con la dirección IP del enlace establecido con la centralita origen. 

El uso de type=friend, type=peer y el ya desaparecido type=user obedece a conseguir una mayor “granularidad” en la gestión de las llamadas entrantes y salientes de la centralita.

  • Type=user solo permite llamadas salientes desde una extensión hacia Asterisk y no es posible que Asterisk envíe una llamada hacia dichas extensiones. Esto es debido a que con type=user no es posible indicar la variable host, y las extensiones definidas así no se registran en ningún caso, por lo que Asterisk puede recibir llamadas desde ellas pero no puede enviarles llamadas porque no conoce la dirección IP donde se encuentran. 
  • Type=peer, si no se indica ningún contexto para las llamadas entrantes, puede ser utilizado para enviar llamadas hacia un operador de VoIP o hacia otra PBX Asterisk. Si se desea recibir llamadas por un enlace declarado como type=peer, será necesario definir un contexto para las llamadas entrantes.
  • Type=friend es una combinación de type=user y type=peer.  Las extensiones definidas de esta manera pueden hacer llamadas hacia Asterisk y recibir llamadas desde este. 

Vemos pues que, al margen de consideraciones más avanzadas, es más correcto declarar las extensiones como type=friend y los enlaces como type=peer, aunque otras combinaciones puedan funcionar igualmente de forma correcta. En casos como el visto en el ejemplo anterior, números idénticos de extensiones en ambos lados del enlace SIP, será necesario que, al menos en uno de los extremos, las extensiones sean declaradas como type=peer. 

Nota: Si se declara un enlace SIP como type=friend, al ser este una combinación de type=user y type=peer, funcionará correctamente en ambos sentidos. 

Esta entrada fue publicada en Telefonía IP. Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada.