PBX virtual. Parte 3: Traducimos Asterisk a PjSIP sin gestos innecesarios





En la primera y segunda parte de una serie de artículos, descubrimos cómo instalar una IP-PBX (IP-PBX) en un VPS de RuVDS que ejecuta Ubuntu y configurar funciones básicas usando el controlador de canal chan_sip. Este enfoque está en desuso y la compatibilidad con chan_sip se interrumpirá en futuras versiones de Asterisk. En su lugar, es mejor utilizar la biblioteca multimedia de código abierto PjSIP. A pesar de las dramáticas diferencias en los archivos de configuración, la transición no es tan difícil como podría parecer a primera vista.



¿Qué es PjSIP?



Es importante comprender que PjSIP no es un protocolo nuevo, sino una biblioteca completa para trabajar con una pila de protocolos que brindan comunicación de voz: SIP, RTP, SDP, STUN, etc. Es un montón de módulos, que se refleja en el archivo de configuración pjsip.conf (reemplaza al tradicional sip.conf). El archivo está dividido en secciones, y el módulo res_pjsip trabaja con él principalmente, definiendo cada sección la configuración de algún objeto. Los nombres de las secciones se incluyen tradicionalmente entre corchetes, y una sección debe contener la construcción "type =" que define su tipo.



Los tipos de secciones pueden ser los siguientes:



ENDPOINT - analógico del par en sip.conf, que define las opciones para el protocolo SIP y las interacciones con AOR, AUTH y TRANSPORT. Necesariamente vinculado a al menos una sección AOR;

AOR- describe cómo ponerse en contacto con ENDPOINT;

TRANSPORTE : esta sección describe la configuración del protocolo de la capa de transporte, los websockets y los métodos de cifrado (como el general en sip.conf). Puede ser uno para diferentes ENDPOINT o único para un punto;

REGISTRO : responsable de los registros salientes, por ejemplo, troncales a proveedores;

AUTH : contiene opciones y autorizaciones para registros entrantes y salientes. Asociados a él se encuentran ENDPOINT y REGISTROS;

IDENTIFICAR : aquí puede configurar la IP de origen para ENDPOINT;

ACL : utilizado por res_pjsip para controlar las conexiones entrantes, no vinculado a ENDPOINT;

DOMAIN_ALIAS - alias de dominio;

CONTACTO- necesario no especificar explícitamente el SIP URI en Dialplan;

Sistema - opciones del sistema;

Global - opciones globales;



Los nombres de las secciones pueden ser arbitrarios en la mayoría de los casos, pero, por ejemplo, ENDPOINT y AOR deben tener el mismo nombre que el encabezado SIP URI.



Nuestra ayuda difícilmente puede llamarse exhaustiva, ya que muchos chips interesantes permanecen detrás de escena, como el Asistente de configuración de PjSIP: mientras hablamos de migración a una nueva biblioteca con poca sangre. Puedes lidiar con los matices y sutilezas más tarde.



Convierta sip.conf a pjsip.conf



Debido a la modularidad, la estructura del archivo de configuración pjsip.conf se distribuye en una capa delgada sobre muchas secciones; es mucho más complejo que el viejo sip.conf. Los desarrolladores de Asterisk pensaron en administradores simples y crearon un script para convertir. Está escrito en Python, y si crea software desde la fuente, ya está en la distribución: en el directorio contrib / scripts / sip_to_pjsip / . Instalamos Asterisk desde un paquete binario incluido en el repositorio de Ubuntu, por lo que los scripts debían descargarse de GitHub.



Aunque el formato de los archivos de configuración para diferentes versiones de IP-PBX no ha cambiado mucho, es mejor elegir scripts de la versión de Asterisk que ha instalado en lugar del último predeterminado, en nuestro caso 16.2.





La versión de Asterisk se puede ver en la consola IP-PBX usando el comando core show version



Necesitará todos los archivos de Python del directorio ontrib / scripts / sip_to_pjsip / en el repositorio de GitHub. Deben agregarse a un directorio local, ir al directorio con las configuraciones de Asterisk (generalmente / etc / asterisk) y ejecutar el script sip_to_pjsip.py con privilegios de superusuario. Su tarea principal es leer el archivo sip.conf de entrada y crear un nuevo pjsip.conf (consulte la wiki de Asterisk para obtener más detalles).





El script creará pjsip.conf, y luego tendrá que pulirlo manualmente. Si instaló Asterisk según nuestros artículos, también tendrá que configurar la carga de módulos en /etc/asterisk/modules.conf y cambiar la llamada a la aplicación Dial en Dialplan ( /etc/asterisk/extensions.conf ).



El archivo /etc/asterisk/pjsip.conf creado por el convertidor resultó ser inoperante en la práctica:



pjsip.conf
;--
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[general]
allowoverlap = no

[office]
call-limit = 2

[sipnet]
remotesecret = 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--;


[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0

[sipnet]
type = aor
contact = sip:@sipnet.ru

[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru

[sipnet]
type = endpoint
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user = 
from_domain = sipnet.ru
aors = sipnet

[1001]
type = aor
max_contacts = 1

[1001]
type = auth
username = 1001
password = 

[1001]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid =  <1001>
auth = 1001
outbound_auth = 1001
aors = 1001

[acl]
type = acl
permit = XXX.XXX.XXX.XXX
deny = 0.0.0.0/0.0.0.0

[1002]
type = aor
max_contacts = 1

[1002]
type = auth
username = 1002
password = 

[1002]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid =  <1002>
auth = 1002
outbound_auth = 1002
aors = 1002




Su sintaxis es sencilla, los detalles se pueden encontrar en la wiki de Asterisk . Se necesitará una edición manual para limpiar el archivo de configuración. /Etc/asterisk/pjsip.conf



corregido (como en sip.conf, se pueden usar plantillas en él):



/Etc/asterisk/pjsip.conf corregido
;===============TRANSPORT

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0

;===============ACL

[acl]
type = acl
deny = 0.0.0.0/0.0.0.0
permit = XXX.XXX.XXX.XXX

;===============SIPNET TRUNK

[sipnet]
type = registration
transport = transport-udp
outbound_auth = sipnet
server_uri = sip:sipnet.ru
client_uri = sip:@sipnet.ru
retry_interval = 60

[sipnet]
type = auth
auth_type = userpass
password = 
username = 

[sipnet]
type = aor
contact = sip:@sipnet.ru

[sipnet]
type = endpoint
transport = transport-udp
;      Dialplan
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user = 
from_domain = sipnet.ru
outbound_auth=sipnet
aors = sipnet
 
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru

;===============USER TEMPLATES
 
[endpoint-template](!)
type = endpoint
transport = transport-udp
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
 
[auth-template-userpass](!)
type = auth
auth_type = userpass
 
[aor-template-single-reg](!)
type = aor
; PjSIP       
max_contacts = 1

;===============User 1001

[1001](endpoint-template)
auth = auth1001
aors = 1001
callerid =  <1001>

[auth1001](auth-template-userpass)
username = 1001
password = 
 
[1001](aor-template-single-reg)

;===============User 1002

[1002](endpoint-template)
auth = auth1002
aors= 1002
callerid =  <1002>

[auth1002](auth-template-userpass)
username = 1002
password = 
 
[1002](aor-template-single-reg)




Con las plantillas, hay menos papeleo, pero también hay una forma más interesante de simplificar la vida del administrador: el Asistente de configuración. Quizás este sea uno de los trucos de PjSIP más convenientes, del que trataremos en el próximo artículo.



Reescritura del plan de marcado



La parte más sencilla: basta con sustituir SIP por PJSIP en la llamada a la aplicación Dial. Si bien hemos modificado ligeramente el Dialplan de prueba más simple del artículo anterior , nos ocuparemos de cosas más complejas más adelante.



Archivo de configuración /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
clearglobalvars=no

;         
[default]
exten => _X.,1,NoOp()
same => n,Busy()
same => n,HangUp()

;   homeoffice
[homeoffice]
;   
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
;      SIPNET
exten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet)

;   sipnet-trunk,     SIPNET
[sipnet-trunk]
;      


La transición de chan_sip a PjSIP resultó no ser particularmente difícil, pero requiere una buena cantidad de trabajo manual. No pudimos convertir la configuración automáticamente: el script produjo una versión inoperable, que tuvo que ser reescrita manualmente. En el próximo artículo, veremos el Asistente de configuración y finalmente ampliaremos el plan de marcado para recibir llamadas entrantes, organizar conferencias y resolver otras tareas de enrutamiento de llamadas.










All Articles