Sonata — servidor de aprovisionamiento SIP

No sé con qué comparar el provisioning. ¿Quizás con un gato? Se puede hacer sin él, pero con él es un poco mejor. Especialmente si trabaja))

Planteamiento del problema:

  1. Quiero configurar teléfonos SIP de manera rápida, sencilla y segura. Al instalar el teléfono y, sobre todo, al reconfigurarlo.
  2. Muchos proveedores tienen sus propios formatos de configuración, sus herramientas para generar configuraciones, sus métodos de protección de configuraciones. Y no tengo muchas ganas de lidiar con cada uno.
  3. Muchas soluciones de provisioning a) están orientadas a un solo proveedor o a un solo sistema telefónico, b) se implementan de manera bastante engorrosa, con un montón de scripts, parámetros, br-r…

Sobre el punto 3, haré el comentario de que hay excelentes sistemas de provisioning para FreePBX, para FusionPBX, para Kazoo, donde hay plantillas de teléfonos de varios proveedores disponibles públicamente. Hay soluciones comerciales donde también se puede configurar en el módulo de provisioning el uso de teléfonos de diferentes fabricantes, como el PSTN Yeastar.

En Habr también hay muchas recetas sobre cómo configurar dispositivos de varios proveedores: uno, dos. Pero como se dice, todos los sistemas tienen un defecto fatal. Por eso vamos a crear nuestra propia bicicleta.

nuestro propio formato

Como dice xkcd, si no quieres lidiar con 14 formatos, inventa el 15º. Por eso utilizamos configuraciones generales para cualquier teléfono y crearemos nuestro formato de configuración en 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": "Mobilon",
         "line": 1,
         "sip_register": "sip.mobilonsip.ru",
         "sip_name": "sip102",
         "sip_user": "sip102",
         "sip_password": "4321",
         "sip_auth": "sip102"
      }
   ]
}

Así que, en cualquier teléfono es necesario configurar la hora local, las líneas SIP. Aquí es bastante simple. También se pueden ver más ejemplos aquí.

en nuestro servidor de provisioning

En los manuales del fabricante, generalmente hay un apartado que dice: tomen un csv, anoten allí el usuario-contraseña-dirección MAC, generen los archivos con nuestro script personalizado, colóquenlos en un servidor web Apache y estará todo bien.

En el siguiente apartado del manual, generalmente se explica que también se puede cifrar el archivo de configuración generado.

Pero todo esto es clásico. Un enfoque moderno con smoothies y Twitter dice que hay que hacer un servidor web que no sea tan potente como Apache, sino que haga una sola cosa pequeña: generar y entregar configuraciones a través de un enlace.

Aquí haremos una pausa y recordaremos que casi todos los teléfonos SIP ahora pueden obtener configuraciones a través de http/https, por lo que no consideramos otras implementaciones (ftp, tftp, ftps). Luego, cada teléfono conoce su dirección MAC. Por lo tanto, haremos dos enlaces: uno personal - por clave del dispositivo, y el segundo general, que funciona con la combinación de un token general y la dirección MAC.

Además, no me detendré en la configuración cero, es decir, la configuración del teléfono «desde cero», es decir, lo conectaste a la red y ¡pum! funcionó. No, en mi escenario, lo conectaste a la red, hiciste la configuración previa (configuraste para recibir la configuración del servidor de aprovisionamiento), y luego bebes una piña colada y reconfiguras el teléfono como debe ser a través del aprovisionamiento. Distribuir la Opción 66 es responsabilidad del servidor DHCP.

Por cierto, ya estoy cansado de decir «provisioning», por lo que la palabra se ha acortado a «aprovisionamiento», por favor, no me golpeen.

Y otra cosa: nuestro servidor de aprovisionamiento no tiene UI, es decir, interfaz de usuario. Posiblemente por ahora, pero no estoy seguro, ya que no lo necesito. Sin embargo, hay una API para guardar/eliminar configuraciones, obtener la lista de proveedores compatibles, modelos; todo está descrito según las especificaciones de Swagger.

¿Por qué API y no UI? Porque ya tengo mi propio sistema telefónico, así que tengo una fuente de credenciales de donde puedo tomar esos datos, componer el json necesario y publicarlo en el servidor de aprovisionamiento. Y el servidor de aprovisionamiento, según las reglas indicadas en el archivo json, proporcionará la configuración necesaria al dispositivo o no lo hará si el dispositivo no es el correcto o no cumple con los criterios también indicados en este json.

Sonata — servidor de aprovisionamiento SIP

Así que este es el microservicio de aprovisionamiento que surgió. Se llama sonata, el código fuente está disponible en GitHub, también hay un imagen de Docker lista, un ejemplo de uso de Docker. aquí.

Características clave:

  • de todas maneras, acceso limitado a la configuración por tiempo, por defecto 10 minutos. Si quieres hacer que la configuración esté disponible otra vez, vuelve a publicar la configuración.

  • un formato para todos los proveedores, toda la adaptación se maneja en sonata, se envía un json estandarizado, configurando cualquier equipo disponible.

  • Todos los configuraciones emitidas a los dispositivos se registran, se pueden revisar todos los puntos problemáticos en el registro y ver los errores.

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

  • La API para la gestión y la emisión de configuraciones a los teléfonos están separadas por puertos.

  • Pruebas. Para mí era muy importante fijar el formato de la configuración emitida y cubrir todas las situaciones normales de emisión de configuraciones con pruebas. Para que todo funcionara de manera clara.

Desventajas:

Por ahora no se está utilizando cifrado dentro de Sonata. Es decir, ciertamente puede comenzar a usar HTTPS, colocando por ejemplo Nginx, delante de Sonata. Pero los métodos propietarios aún no se han implementado. ¿Por qué? El proyecto todavía es joven, ha provisionado apenas su primera centena de dispositivos. Y, por supuesto, estoy recopilando ideas y retroalimentación. Además, para hacer todo seguro, para que las configuraciones no se puedan espiar en la red, probablemente valga la pena trabajar en claves de cifrado, TLS y cosas por el estilo, pero eso será un tema para más adelante.

Falta de UI. Puede que esta sea una desventaja significativa para el usuario final, pero para el administrador del sistema, es más importante una herramienta de consola que una aplicación completa. Se planeaba hacer una herramienta de consola, pero no estoy seguro de si es necesaria.

¿Cuál es el resultado?

Un pequeño y simple servidor web para el aprovisionamiento de varios modelos de teléfonos con API para la gestión.

Una vez más, ¿cómo debería funcionar esto?

  1. Instalamos Sonata.
  2. Generamos la configuración en JSON y la publicamos en Sonata.
  3. Luego, obtenemos de Sonata un enlace para el aprovisionamiento.
  4. Luego, indicamos este enlace en el teléfono.
  5. El aparato descarga la configuración.

En la explotación posterior, solo hay dos pasos:

  1. Generamos la configuración en JSON y la publicamos en Sonata.
  2. El aparato descarga la configuración.

¿Qué teléfonos se aprovisionan?

Los proveedores Grandstream, Fanvil, Yealink. Las configuraciones dentro del proveedor son más o menos idénticas, pero pueden diferir dependiendo del firmware; puede que sea necesario probar adicionalmente.

¿Qué reglas se pueden establecer?

Por tiempo. Puede especificar el tiempo hasta el cual la configuración estará disponible.
Por dirección MAC. Al emitir la configuración mediante un enlace personal, también se verificará la dirección MAC del dispositivo.
Por IP. Por la dirección IP desde la que se realizó la solicitud.

¿Cómo interactuar con Sonata?

A través de la API, haciendo solicitudes HTTP. La API estará disponible en su instalación. Como la API admite la especificación Swagger, puede utilizar una herramienta en línea para realizar pruebas de solicitudes a la API.

Bien, excelente. ¿Cómo puedo probarlo?

Lo más fácil es desplegar una imagen de Docker basada en el repositorio sonata-sample. En el repositorio hay instrucciones de instalación.

А если знаю node.js?

Si tiene experiencia usando JavaScript, rápidamente entenderá cómo funciona todo aquí.

¿Habrá desarrollo de Sonata?

He alcanzado parcialmente mis objetivos. El desarrollo futuro es una cuestión de mis tareas relacionadas con la automatización de la configuración de teléfonos. También hay posibilidad de ampliar las configuraciones para ajustar los botones del teléfono, agregar direcciones de provisión, y quizás algo más, escríbame en los comentarios.

Resumen y agradecimientos

Agradeceré las propuestas/contras/comentarios y preguntas constructivas, ya que puede que haya algo que no haya explicado claramente.

También agradezco a todos los colegas que ayudaron, asesoraron, probaron, proporcionaron/regalaron teléfonos para las pruebas. Realmente, muchas personas con las que interactué en el trabajo, en AsterConf, en chats y correos electrónicos están de alguna manera relacionadas con el proyecto. Gracias por las ideas y pensamientos. FlexiRemap® contra RAIDNo sé con qué comparar el aprovisionamiento. ¿Tal vez con un gato? Aparentemente se puede hacer sin él, pero con él es un poco mejor.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster