Askozia. Funktionsweise von Autoprovisioning Plug & Play

Bei der Entwicklung der Askozia-Telefonanlage standen wir vor der Aufgabe, die Telefone automatisch einzurichten und auf unsere eigene Weise zu lösen.

Autoprovisioning Plug & Play (PnP), diese Technologie wird von vielen Herstellern unterstützt - Yealink, Snom, Fanvil.

Die Hauptvorteile der automatischen Telefoneinstellungen:

  • Erleichtert die Ersteinrichtung - Sie müssen nicht zur Weboberfläche jedes Geräts gehen. Es reicht aus, die Entsprechung der MAC-Adresse des Geräts und des Kontos auf dem Auto-Tuning-Server anzugeben.
  • Vereinfacht die Unterstützung - es wird wirklich einfacher, wenn Sie Geräteeinstellungen ändern müssen. Wir steuern die Einstellungen erneut auf dem Server
  • Es ist möglich, die Einstellung auf den Starcode-Satz „* 911 * <SIP_ACC>“ zu reduzieren - in einigen Fällen ist diese Funktion einfach nicht preislich. Nicht jeder Büroangestellte kann ein IP-Telefon konfigurieren, aber das Wählen einer Kombination von Nummern ist eine einfache Aufgabe.

Beschreiben wir, wie Autoprovisioning Plug & Play funktioniert. Am Ende des Artikels ein Link zum Quellcode eines kleinen PHP-Skripts, das die Funktionalität des PnP-Servers implementiert.

Fallstudie


Wir hatten einen interessanten Fall, als wir einem unserer Kunden die Telefonie vorstellten. Das Hauptproblem war, dass der Kunde in einer anderen Stadt war. Gleichzeitig bestand eine der Anforderungen darin, dass die Telefonie sofort funktionieren sollte, nachdem das Paket mit den Telefonen ausgepackt und an das Netzwerk angeschlossen wurde.

Das Problem wurde relativ einfach gelöst. Der Kunde hat eine Reihe von IP-Adressen für uns reserviert. Wir stellten die Ausrüstung in unserem Büro auf, packten sie in eine Schachtel und schickten sie per Kurier.

Bei Verwendung der automatischen Gerätekonfiguration würde die Aufgabe viel einfacher.

Vereinfachtes PnP-Schema


Das zu Beginn der Arbeit eingestellte Telefon sendet eine Broadcast- SIP- SUBSCRIBE- Anforderung an die Multicast-IP-Adresse 224.0.1.75 .
Lesen Sie mehr über 224.0.1.75
224.0.1.75 - Dies ist eine Multicast-IP (für Multicasting), die für SIP-Server "reserviert" ist.
Siehe Networksorcery.com/Enp/protocol/sip.htm
224.0.1.75 SIP, Session Initiation Protocol (alle Server).

Als Antwort erwartet er eine NOTIFY- Antwort mit Konfigurationsanweisungen.

Bild

Beispiel ABONNIEREN
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 


Die wichtigsten und interessantesten Schlagzeilen


  • Von - Die Mohnadresse des Geräts lautet 0015657322ff
  • Ereignis - beschreibt umfassend das Gerät, den Hersteller, das Modell und die Firmware-Version
  • Kontakt - Geräteadresse
  • Anruf-ID - Dieser Header ist interessant bei der Konfiguration von DECT-Geräten über Yealink. Er überträgt die Leitungskennung (Röhrenseriennummer) und das Trennzeichen " _ ".

Sobald der PnP-Server eine solche Anfrage erhalten hat, sollte er antworten

NOTIFY Beispiel
 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 


In einer NOTIFY-Nachricht befinden sich die wertvollsten Informationen im Nachrichtentext. In der Regel müssen Sie im Body einen Link übergeben, um die Konfigurationsdatei zu erhalten:

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

Wenn mehrere PnP-Server im Netzwerk ausgeführt werden, wird es von demjenigen konfiguriert, der als erster auf das Gerät reagiert.

Das Telefon versucht nach Erhalt von NOTIFY, die Anforderung an die angegebene Adresse zu erfüllen.

Beispiel für eine Serveranforderung und -antwort
 # 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) ... 


Eine Beispielimplementierung des Servers finden Sie unter github https://github.com/boffart/MikoServerPnP

Damit dieser PnP-Server funktioniert, müssen Sie:

  • PHP 7.1.9
  • PHP-Steckdosen
  • BusyBox v1.26.2
  • Broadcast-Anforderungen müssen im Netzwerk zulässig sein

PnP-Serverfunktionen


  • Hört Anfragen an, die an die Adresse ' 224.0.1.75:5060 ' gesendet wurden.
  • Wenn es startet, startet es den Webserver ( Busybox httpd )
  • Ermöglicht das Erstellen einer vereinfachten Telefonkonfiguration
  • Ermöglicht das Senden an Yealink NOTIFY zum Neustart

Durch die Verwendung eines PnP-Servers können Sie "Einmalige Links" verwenden.


Angenommen, wir geben die Datei über den Link an:

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

Der übliche direkte Link zur Datei. Offensichtlich ist dies NICHT sicher. Wenn Sie die MAC-Adresse des Telefons und die Serveradresse kennen, können Sie versuchen, eine Konfiguration mit Anmeldungen und Kennwörtern zu erhalten.

Bei der Arbeit mit einem PnP-Server kann für jede SUBSCRIBE-Anforderung ein eindeutiger Link angegeben werden:

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

Ein Beispiel für eine Formel zur Berechnung eines Hash:

 hash = md5(MAC + DATE + PID) 

PID ist die Prozess-ID des PnP-Servers. Nur root kann es erkennen.
Einen solchen Hash zu wählen ist praktisch unmöglich.

Wenn ein Einspruch über einen ungültigen Link erfolgt, verbieten wir den Schädling.

Yealink NOTIFY neu starten bedeutet ohne Autorisierung


Ja, ja, ohne Genehmigung .
Ich konnte das Gerät aus der aktuellen Version der Firmware von dieser Möglichkeit nicht schließen.

Führen Sie einfach den Befehl aus

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

Und das Telefon wird neu gestartet. Wenn Sie einen solchen Befehl in cron hängen, können Sie einen schrecklichen Effekt erzielen. Dies ist natürlich möglich, wenn wir die IP-Adresse und den SIP-Port des Telefons kennen.

Eine Beispiel-PHP-Funktion zum Senden von 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); } 


PnP-Serverkonfiguration


Befindet sich in 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": "**" } 

MAC-Whitelist


Kann in settings / mac_white.conf beschrieben werden . Separator - Zeilenvorschub.

MAC Blacklist


Kann in settings / mac_black.conf beschrieben werden . Separator - Zeilenvorschub.

Telefonkonfigurationsdateien


Muss im Konfigurationsverzeichnis abgelegt werden .
Mit dem PnP-Server können Sie die einfachsten Konfigurationen für Yeakink und Snom erstellen:

 php -f MikoServerPnP.php mk_config SIP_ACCAUNT SECRET MAC 

Nützliche Materialien


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


All Articles