Sonata: servidor de aprovisionamiento SIP

No sé con qué comparar el aprovisionamiento. ¿Quizás con un gato? Parece posible sin él, pero con él es un poco mejor. Especialmente si funciona))

Formulación del problema:

  1. Quiero configurar teléfonos SIP de forma rápida, sencilla y segura. Al instalar un teléfono, y más aún al reconfigurarlo.
  2. Muchos proveedores tienen sus propios formatos de configuración, sus propias utilidades para generar configuraciones y sus propias formas de protegerlas. Y realmente no quiero tratar con todos.
  3. Muchas soluciones de aprovisionamiento, a) se centran en un proveedor o un sistema telefónico, b) son bastante engorrosas de implementar, muchos scripts, parámetros, brrr...

Respecto al punto 3 haré un comentario que existen excelentes sistemas de aprovisionamiento para PBX Gratis, para FusionPBX, para Kazoo, donde las plantillas para teléfonos de varios proveedores están disponibles públicamente. Existen soluciones comerciales donde también se puede configurar el funcionamiento de teléfonos de diferentes fabricantes en el módulo de aprovisionamiento, por ejemplo, Yeastar PBX.

Habré también está lleno de recetas sobre cómo configurar dispositivos de varios proveedores: tiempo, два. Pero como suele decirse, todos los sistemas tienen un defecto fatal. Entonces haremos nuestra propia bicicleta.

tu propio formato

Como dicen en xkcd, si no quieres lidiar con 14 formatos - piensa en el 15. Por lo tanto, utilizamos la configuración general para cualquier teléfono y creamos nuestro propio formato de configuración json.

Algo como esto:

{
   "key": "sdgjdeu9443908",
   "token": "590sfdsf8u984",
   "model": "gxp1620",
   "vendor": "grandstream",
   "mac": "001565113af8",
   "timezone_offset": "GMT+03",
   "ntp_server": "pool.ntp.org",
   "status": true,
   "accounts": [
      {
         "name": "Мобилон",
         "line": 1,
         "sip_register": "sip.mobilonsip.ru",
         "sip_name": "sip102",
         "sip_user": "sip102",
         "sip_password": "4321",
         "sip_auth": "sip102"
      }
   ]
}

Entonces, en cualquier teléfono necesitas configurar la hora local y las líneas SIP. Aquí todo es sencillo. Puedes ver más ejemplos. aquí.

aprovisionamiento de su propio servidor

En los manuales del fabricante suele haber un punto donde dice: tome un csv, escriba su dirección-mac-contraseña de inicio de sesión, genere archivos usando nuestro script propietario, colóquelos en el servidor web Apache y todo estará bien.

El siguiente párrafo del manual generalmente le indica que también puede cifrar el archivo de configuración generado.

Pero todos estos son clásicos. El enfoque moderno con Smoothies y Twitter dice que es necesario crear un servidor web listo para usar que no sea tan poderoso como Apache, pero que solo haga una pequeña cosa. Genere y envíe configuraciones mediante un enlace.

Detengámonos aquí y recordemos que casi todos los teléfonos SIP ahora pueden recibir configuraciones a través de http/https, por lo que no estamos considerando otras implementaciones (ftp, tftp, ftps). Entonces, cada teléfono conoce su propia dirección MAC. Por lo tanto, crearemos dos enlaces: uno personal, basado en la clave del dispositivo, el segundo general, que funciona utilizando una combinación de un token común y una dirección MAC.

Además, no me detendré en la configuración cero, es decir. configurar el teléfono desde cero, es decir Lo conectaste a la red y comenzó a funcionar. No, en mi caso, lo conectas a la red, haces la configuración preliminar (lo configuras para recibir la configuración del servidor de aprovisionamiento) y luego bebes piña colada y reconfiguras el teléfono según sea necesario a través del aprovisionamiento. La distribución de la Opción 66 es responsabilidad del servidor DHCP.

Por cierto, estoy completamente cansado de decir "aprovisionamiento", así que la palabra se redujo a "aprovisionamiento", por favor no me pateen.

Y una cosa más: nuestro servidor de aprovisionamiento no tiene interfaz de usuario, es decir. interfaz de usuario. Quizás, por ahora, pero no estoy seguro, porque... No lo necesito. Pero hay una API para guardar/eliminar configuraciones, obtener una lista de proveedores y modelos compatibles, todo se describe de acuerdo con los cánones de la especificación swagger.

¿Por qué API y no UI? Porque Ya tengo mi propio sistema telefónico, luego tengo una fuente de credenciales, donde solo necesito tomar estos datos, compilar el json necesario y publicarlo en el servidor de aprovisionamiento. Y el servidor de aprovisionamiento, de acuerdo con las reglas especificadas en el archivo json, le dará al dispositivo requerido su configuración o no la dará si el dispositivo no es correcto o no cumple con los criterios también especificados en este json.

Sonata: servidor de aprovisionamiento SIP

Así resultó el microservicio de aprovisionamiento. Llamado sonata, el código fuente está disponible en GitHub, también hay imagen acoplable lista, ejemplo de uso de Docker aquí.

Características clave:

  • en cualquier caso, acceso limitado a la configuración por tiempo, por defecto 10 minutos. Si desea que la configuración vuelva a estar disponible, vuelva a publicarla.

  • un formato para todos los proveedores, todos los ajustes se eliminan en sonata, envía json estandarizado, configura cualquier equipo disponible.

  • todas las configuraciones emitidas a los dispositivos se registran, todas las áreas problemáticas se pueden ver en el registro y se pueden ver los errores

  • Es posible utilizar un enlace común con un token; cada teléfono recibe su propia configuración especificando la dirección mac. O un enlace personal mediante clave.

  • Las API para administración (administración) y aprovisionamiento de configuraciones a teléfonos (aprovisionamiento) están divididas por puertos

  • Pruebas. Para mí era muy importante corregir el formato de la configuración emitida y cubrir todas las situaciones habituales de emisión de una configuración con pruebas. Para que todo esto funcione claramente.

Contras:

Hasta ahora, el cifrado no se utiliza de ninguna manera en Sonata. Aquellos. Por supuesto, puedes empezar a usar https poniendo nginx delante de sonata, por ejemplo. Pero aún no se han utilizado métodos propietarios. ¿Por qué? El proyecto es aún joven y ha lanzado sus primeros cien dispositivos. Y, por supuesto, recopilo ideas y comentarios. Además, para que todo sea seguro, para que las configuraciones no se puedan rastrear en la red, probablemente valga la pena molestarse con las claves de cifrado, tls y el erizo con ellas, pero esto será una continuación.

Falta de interfaz de usuario. Quizás esto sea una desventaja importante para el usuario final, pero para un administrador del sistema, una utilidad de consola es más importante que una aplicación completa. Había planes para crear una utilidad de consola, pero no estoy seguro de si es necesaria.

¿El resultado?

Un servidor web pequeño y sencillo para aprovisionar varios modelos de teléfonos con una API para su gestión.

Una vez más, ¿cómo se supone que funciona esto?

  1. Instalación de sonata.
  2. Creamos una configuración json y la publicamos en sonata.
  3. Luego recibimos un enlace de aprovisionamiento de sonata.
  4. Luego le indicamos este enlace en el teléfono.
  5. El dispositivo está cargando la configuración.

Sólo hay dos pasos en la operación posterior:

  1. Creamos una configuración json y la publicamos en sonata.
  2. El dispositivo está cargando la configuración.

¿Qué teléfonos se promocionarán?

Proveedores Grandstream, Fanvil, Yealink. Las configuraciones del proveedor son más o menos iguales, pero pueden diferir según el firmware; puede que sea necesario realizar pruebas adicionales.

¿Qué reglas puedes establecer?

A tiempo. Puede especificar la hora hasta la cual la configuración estará disponible.
Por dirección mac. Al enviar la configuración a través del enlace personal del dispositivo, también se verificará la dirección mac.
Por IP. Por dirección IP desde donde se realizó la solicitud.

¿Cómo interactuar con Sonata?

Vía API, realizando solicitudes http. La API estará disponible en su instalación. Porque La API admite la especificación swagger, puede usar utilidad en línea para solicitudes de prueba a la API.

Vale genial. Cosas geniales, ¿qué tal si las pruebas?

La forma más sencilla es implementar una imagen de Docker basada en un repositorio. muestra-sonata. El repositorio contiene instrucciones de instalación.

¿Qué pasa si conozco node.js?

Si tiene experiencia en el uso de JavaScript, descubrirá rápidamente cómo funciona todo aquí.

¿Habrá un desarrollo de Sonata?

Logré parcialmente mis objetivos. Un mayor desarrollo depende de mis tareas sobre el tema de la automatización de la configuración del teléfono. También existe la oportunidad de expandir las configuraciones para configurar los botones del teléfono, agregar el aprovisionamiento de la libreta de direcciones, tal vez algo más, escriba en los comentarios.

Resumen y agradecimientos

Estaré encantado de recibir sugerencias/objeciones/comentarios y preguntas constructivas, porque... Es muy posible que haya descrito algo incomprensible.

También expreso mi gratitud a todos mis colegas que ayudaron, asesoraron, probaron y proporcionaron/donaron teléfonos para las pruebas. En realidad, muchas personas con las que me comuniqué en el trabajo están involucradas en el proyecto en diversos grados, AsterConf'e, en chats y correos electrónicos. Gracias por las ideas y pensamientos.

Fuente: habr.com

Compre alojamiento confiable para sitios con protección DDoS, servidores VPS VDS 🔥 Compra alojamiento web fiable con protección DDoS, servidores VPS VDS | ProHoster