Askozia. Fonctionnement de l'autoprovisioning Plug & Play

Lors du développement du PBX Askozia, nous avons été confrontés à la tâche de configurer automatiquement les téléphones et de le résoudre à notre manière.

Autoprovisioning Plug & Play (PnP), cette technologie est prise en charge par de nombreux fabricants - Yealink, Snom, Fanvil.

Les principaux avantages des paramètres automatiques du téléphone:

  • Facilite la configuration initiale - pas besoin d'aller à l'interface Web de chaque appareil. Il suffit d'indiquer la correspondance de l'adresse MAC de l'appareil et du compte sur le serveur de réglage automatique.
  • Simplifie la prise en charge - cela devient vraiment plus facile si vous devez modifier les paramètres de l'appareil. Nous contrôlons à nouveau les paramètres sur le serveur
  • Il est possible de réduire le réglage à l'ensemble du code étoile «* 911 * <SIP_ACC>» - dans certains cas, cette fonction n'a tout simplement pas de prix. Tous les employés de bureau ne pourront pas configurer un téléphone IP, mais composer une combinaison de numéros est une tâche simple.

Décrivons comment fonctionne Autoprovisioning Plug & Play. À la fin de l'article, un lien vers le code source d'un petit script PHP qui implémente les fonctionnalités du serveur PnP.

Étude de cas


Nous avons eu un cas intéressant lors de l'introduction de la téléphonie à l'un de nos clients. Le principal problème était que le client se trouvait dans une autre ville. En même temps, l'une des exigences était qu'après avoir déballé le colis avec les téléphones et les avoir connectés au réseau, la téléphonie devrait fonctionner immédiatement.

Le problème a été résolu relativement simplement. Le client nous a réservé un certain nombre d'adresses IP. Nous avons installé l'équipement dans notre bureau et l'avons emballé dans une boîte et envoyé par courrier.

En utilisant la configuration automatique des appareils, la tâche deviendrait beaucoup plus simple.

Schéma PnP simplifié


Le poste téléphonique en début d'opération envoie une requête de diffusion SIP SUBSCRIBE à l'adresse 224.0.1.75 IP multidiffusion.
En savoir plus sur 224.0.1.75
224.0.1.75 - il s'agit de la multidiffusion IP (pour la multidiffusion) "réservée" aux serveurs SIP.
voir networksorcery.com/Enp/protocol/sip.htm
224.0.1.75 SIP, Session Initiation Protocol (tous les serveurs).

En réponse, il s'attend à recevoir une réponse NOTIFY avec des instructions de configuration.

image

ABONNEZ-VOUS Exemple
2019/09/02 09:26:41.543856 172.16.32.148:5059 -> 224.0.1.75:5060 SUBSCRIBE sip:MAC0015657322ff@224.0.1.75 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 1 SUBSCRIBE Contact: <sip:MAC0015657322ff@172.16.32.148:5059> Max-Forwards: 70 User-Agent: Yealink SIP-T21P 34.72.14.6 Expires: 0 Event: ua-profile;profile-type="device";vendor="Yealink";model="T21D";version="34.72.14.6" Accept: application/url Content-Length: 0 


Les titres les plus importants et les plus intéressants


  • De - l'adresse du pavot de l'appareil est 0015657322ff
  • Événement - décrit de manière complète l'appareil, le fabricant, le modèle, la version du micrologiciel
  • Contact - adresse de l'appareil
  • Call-ID - cet en-tête est intéressant lors de la configuration des appareils DECT à partir de Yealink, il transfère l'identifiant de ligne (numéro de série du tube), le délimiteur " _ "

Une fois que le serveur PnP a reçu une telle demande, il doit répondre

Exemple NOTIFY
 2019/09/02 09:26:41.550125 172.16.32.153:57593 -> 172.16.32.148:5059 NOTIFY sip:172.16.32.148:5059 SIP/2.0 Via: SIP/2.0/UDP 172.16.32.148:5059;branch=z9hG4bK42032775 Max-Forwards: 20 Contact: <sip:172.16.32.148:5059;transport=UDP;handler=dum> From: <sip:MAC0015657322ff@224.0.1.75>;tag=42032772 To: <sip:MAC0015657322ff@224.0.1.75> Call-ID: 42032772@172.16.32.148 CSeq: 3 NOTIFY Content-Type: application/url Subscription-State: terminated;reason=timeout Event: ua-profile;profile-type="device";vendor="MIKO";model="MikoServerPnP";version="1.8" Content-Length: 40 http://172.16.32.153:84/0015657322ff.cfg 


Dans un message NOTIFY, les informations les plus précieuses se trouvent dans le corps du message. En règle générale, dans le corps, vous devez transmettre un lien pour obtenir le fichier de configuration:

 http://172.16.32.153:84/0015657322ff.cfg 

Si plusieurs serveurs PnP s'exécutent sur le réseau, alors qui est le premier à répondre au périphérique le configurera.

Le téléphone, à réception de NOTIFY, tente de répondre à la demande à l'adresse indiquée.

Exemple de demande et de réponse du serveur
 # curl -i http://172.16.32.153:84/0015657322ff.cfg HTTP/1.0 200 OK Content-type: text/plain Date: Mon, 02 Sep 2019 06:52:23 GMT Connection: close Accept-Ranges: bytes Last-Modified: Mon, 02 Sep 2019 06:25:02 GMT Content-length: 769 #!version:1.0.0.1 account.1.enable = 1 account.1.label = PnP (203) ... 


Un exemple d'implémentation du serveur est disponible sur github https://github.com/boffart/MikoServerPnP

Pour que ce serveur PnP fonctionne, vous devez:

  • PHP 7.1.9
  • Prises php
  • BusyBox v1.26.2
  • Les demandes de diffusion doivent être autorisées sur le réseau

Caractéristiques du serveur PnP


  • Écoute les demandes envoyées à l'adresse ' 224.0.1.75:5060 '
  • Quand il démarre, il démarre le serveur web ( busybox httpd )
  • Vous permet de créer une configuration téléphonique simplifiée
  • Vous permet d'envoyer à Yealink NOTIFY pour redémarrer

L'utilisation d'un serveur PnP vous permet d'utiliser des "liens à usage unique".


Supposons que nous donnions le fichier par le lien:

 http://172.16.32.153:84/0015657322ff.cfg 

Le lien direct habituel vers le fichier. De toute évidence, ce n'est PAS sûr. Connaissant l'adresse MAC du téléphone et l'adresse du serveur, vous pouvez essayer d'obtenir une configuration avec des identifiants et des mots de passe.

Lorsque vous travaillez avec un serveur PnP, il est possible de donner un lien unique pour chaque demande SUBSCRIBE:

 http://172.16.32.153:84/?mac=0015657322ff&hash=0a67f5290 

Un exemple de formule pour calculer un hachage:

 hash = md5(MAC + DATE + PID) 

PID est l'ID de processus du serveur PnP. Seul root peut le reconnaître.
Choisir un tel hachage est pratiquement impossible.

Si un appel se produit via un lien invalide, nous interdisons le ravageur.

Redémarrer Yealink NOTIFY signifie sans autorisation


Oui, oui, sans autorisation .
Je n'ai pas pu fermer l'appareil de la version actuelle du firmware de cette possibilité.

Exécutez simplement la commande

 php -f MikoServerPnP.php socket_client_notify <IP_PBX> <PORT_SIP_PBX> <IP_PHONE> <PORT_PHONE> 

Et le téléphone redémarrera. En suspendant une telle commande dans cron, vous pouvez obtenir un effet terrifiant. Bien sûr, cela est possible si nous connaissons l'adresse IP et le port SIP du téléphone.

Un exemple de fonction PHP pour envoyer NOTIFY
  public static function socket_client_notify($ip_pbx, $port_pbx, $ip_phone, $port_phone):void { $phone_user = 'autoprovision_user'; $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $msg = "NOTIFY sip:{$phone_user}@{$ip_phone}:{$port_phone};ob SIP/2.0\r\n". "Via: SIP/2.0/UDP {$ip_pbx}:{$port_pbx};branch=z9hG4bK12fd4e5c;rport\r\n". "Max-Forwards: 70\r\n". "From: \"asterisk\" <sip:asterisk@{$ip_pbx}>;tag=as54cd2be9\r\n". "To: <sip:{$phone_user}@{$ip_phone}:{$port_phone};ob>\r\n". "Contact: <sip:asterisk@{$ip_pbx}:{$port_pbx}>\r\n". "Call-ID: 4afab6ce2bff0be11a4af41064340242@{$ip_pbx}:{$port_pbx}\r\n". "CSeq: 102 NOTIFY\r\n". "User-Agent: mikopbx\r\n". "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE\r\n". "Supported: replaces, timer\r\n". "Subscription-State: terminated\r\n". "Event: check-sync;reboot=true\r\n". "Content-Length: 0\r\n\n"; $len = strlen($msg); socket_sendto($sock, $msg, $len, 0, $ip_phone, $port_phone); socket_close($sock); } 


Configuration du serveur PnP


Situé dans settings / settings.json

 { "url": "http://<pbx_host>:<http_port>/", "http_port": 84, "pbx_host": "172.16.32.153", "pbx_sip_port": "5060", "vm_extension": "*001", "feature_transfer": "**" } 

Liste blanche MAC


Peut être décrit dans settings / mac_white.conf . Séparateur - saut de ligne.

Liste noire MAC


Peut être décrit dans settings / mac_black.conf . Séparateur - saut de ligne.

Fichiers de configuration du téléphone


Doit être placé dans le répertoire configs .
En utilisant le serveur PnP, vous pouvez créer les configurations les plus simples pour Yeakink et Snom:

 php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC 

Matériaux utiles


Source: https://habr.com/ru/post/fr471522/


All Articles