FernĂŒberwachung und Verwaltung von GerĂ€ten auf Basis von Linux/OpenWrt/Lede ĂŒber den Port 80, Fortsetzung

Dies ist der letzte Teil des Artikels, hier ist der Anfang habr.com/ru/post/445568
Im letzten Mal habe ich darĂŒber geschrieben, wie ich die Überwachung von GerĂ€ten umgesetzt habe, jetzt geht es um die Verwaltung. In Diskussionen mit den "Technikern" auf der Kundenseite stoße ich hĂ€ufig auf ein begrenztes VerstĂ€ndnis der Möglichkeiten solcher kleinen GerĂ€te (mit geringen Ressourcen an Speicher und Leistung); viele glauben, dass „das Maximum, was wir benötigen, ein Neustart ist, fĂŒr etwas Ernsteres – schicken wir ein Team.“
Aber die Praxis zeigt, dass es nicht ganz so ist. Hier ist eine kleine Liste typischer Aufgaben:

  1. Netzwerkdiagnose und -behebung. Hinter dem Ethernet-Port Ihres Routers lebt in der Regel ein anderes GerĂ€t mit einer eigenen internen IP-Adresse. Manchmal kann man (oder sollte man) es „pingen“. Oder die Verwaltung eines Tunnels – wenn auf dem Router, der ĂŒber ein 3G-Modem arbeitet, plötzlich der Tunnel nicht hochgeht, aber wir den Router sehen.
  2. Systemwartung. Firmware-Updates, Upgrade von Dienstskripten.
  3. Akrobatik. Das könnte man als „Pervertierungen“ bezeichnen, aber der Begriff „Akrobatik“ wie, zitiere, „die FĂ€higkeit eines Zirkusartisten, im Gleichgewicht zu bleiben, wenn der Körper sich in einer instabilen Position befindet“ — passt besser. Solche Situationen entstehen aufgrund des begrenzten Budgets des Auftraggebers. Ich habe ein paar Beispiele angefĂŒhrt, aber da sie keinen direkten Bezug zum Thema der ErzĂ€hlung haben, habe ich sie in die Anmerkungen verschoben.

Wi-Fi-ÜberwachungDas modische Thema der letzten fĂŒnf Jahre vor allem unter den großen Einzelhandelsketten. Man schlendert gemĂ€chlich durch die Verkaufsbereiche, wĂ€hrend das Mobiltelefon mit aktiviertem WLAN in dem Versuch, sich mit einem Netzwerk zu verbinden, regelmĂ€ĂŸig Probeanfragen versendet, die analysiert werden können, um zu zĂ€hlen, wie oft man diesen Laden besucht, auf welchen Wegen man sich bewegt usw. Die gesammelten Daten werden analysiert, WĂ€rmebilder erstellt, und die Manager nutzen solche Grafiken, um Geld von den FĂŒhrungskrĂ€ften oder Investoren zu bekommen. Aber wĂ€hrenddessen... "Es gibt kein Geld, aber haltet durch...", und das echte Ergebnis muss bereits vorgelegt werden, es ertönt das alte gute Lied: "Ja, ja, spĂ€ter stellen wir natĂŒrlich die Chips und alles, was Sie wĂŒnschen, bereit, aber jetzt mĂŒssen wir dem Auftraggeber das Ergebnis zeigen! Übrigens haben wir vergessen zu sagen, dass der Auftraggeber uns erlaubt hat, unsere GerĂ€te ĂŒber WLAN mit seinem Hotspot zu verbinden, aber unter allgemeinen Bedingungen, einfach als ob wir GĂ€ste wĂ€ren." Und so mĂŒssen wir Router-Akrobaten bauen – es werden mehrere WLAN-Schnittstellen aktiviert, einer davon verbindet sich mit dem Hotspot, der andere ĂŒberwacht die Umgebung, speichert das Ergebnis des tcpdump und versucht dann, den Inhalt der Datei in ein Archiv zu packen und, aus Angst zu "ĂŒberessen", versucht er, den Inhalt auf einen FTP-Server zu ĂŒbermitteln. Es ist nicht verwunderlich, dass der Router-Akrobat oft "ausbricht" und es notwendig ist, ihn irgendwie aus der Ferne zu "reanimieren".

RadiusHier lĂ€sst sich die Situation einfacher mit der folgenden Aussage des Auftraggebers beschreiben: "Wir wollen ein dezentrales Netzwerk von Hotspots, die auf GerĂ€ten funktionieren, deren Modell im Voraus nicht bekannt ist, ĂŒber KanĂ€le, deren Art wir noch nicht wissen. Ach, wir haben vergessen zu sagen, dass wir nicht nur Werbung fĂŒr die Kunden zeigen, sondern auch alles rund um den Standort des Hotspots analysieren wollen. Nein, wir wissen noch nicht warum, aber wir werden es uns ausdenken, keine Sorge, wir konnten diese Idee ja auch erfinden."

Und man darf nicht vergessen, dass aufgrund vieler unvorhersehbarer UmstĂ€nde das Management unter ungewöhnlichen Bedingungen durchgefĂŒhrt werden muss, wenn wir uns nicht direkt ĂŒber IP: Port mit dem Router verbinden können und gezwungen sind, einfach auf Anzeichen von AktivitĂ€t zu warten. Wenn man abstrahiert, kann der Dialog zwischen dem Server und dem Router so dargestellt werden:

  • Router: Hallo. Ich bin Router so und so, gibt es Aufgaben fĂŒr mich?
  • Server: Router so und so, ich habe dich registriert, dass du aktiv bist. Hier ist die Aufgabe: Zeig mir das Ergebnis des Befehls ifconfig?
  • Router: Hallo. Ich bin Router so und so, beim letzten Mal hast du mich gebeten, das Ergebnis von ifconfig zu zeigen, hier ist es. Gibt es Aufgaben fĂŒr mich?
  • Server: Router so und so, ich habe dich registriert, dass du aktiv bist. Es gibt keine Aufgaben fĂŒr dich.

Die interessanteste Frage: Wie kann der entfernte Router ein bestimmtes Datenvolumen senden? In der vorherigen Ausgabe habe ich beschrieben, dass auf dem Router wegen eingeschrĂ€nkter Ressourcen nur eine „eingeschrĂ€nkte“ wget-Version vorhanden ist, die nur ĂŒber GET funktioniert und nicht mehr. Genauer gesagt, wir brauchen eine universelle Methode, unabhĂ€ngig von den Besonderheiten des Bildaufbaus. Ich habe mich fĂŒr die Verwendung von wget entschieden. Genauer gesagt, nun ja, wie soll ich sagen — ich hatte einfach keine Wahl 🙂

ZunĂ€chst eine VorbemerkungMeine Lösung fĂŒr die Verwaltung ist funktional, nicht stark eingeschrĂ€nkt, und ich bin mir sicher — fehlerhaft, auch wenn sie die meisten meiner Kunden zufriedenstellt. Wie man es richtig machen könnte — eine kleine Dienstprogramm schreiben, das ĂŒber Port 80 BinĂ€rdaten per POST sendet. Es in die Firmware des Routers integrieren und dann mit Hilfe von Bash darauf zugreifen. Aber die RealitĂ€t ist so, dass: a) man schnell handeln muss b) alles möglicherweise auf dem bestehenden „Zoo von Routern“ erledigt werden muss c) „nicht schaden!“ — wenn der Router funktioniert und andere Aufgaben erfĂŒllt, versuche, Änderungen einzufĂŒhren, die die bestehende FunktionalitĂ€t nicht beeintrĂ€chtigen.

Kommen wir zur Umsetzung. Angenommen, Ihr Kunde möchte den Router von Zabbix aus einfach und unkompliziert, mit einem „Mausklick“ neu starten. Heute beginnen wir mit der Beschreibung der Umsetzung in Zabbix.
Im MenĂŒ „Verwaltung“ -> „Skripte“ fĂŒgen wir ein neues Skript hinzu. Wir nennen es „Neustart“ und als Befehl schreiben wir „php /usr/share/zabbix/reboot.php {HOST.HOST}“

FernĂŒberwachung und Verwaltung von GerĂ€ten auf Basis von Linux/OpenWrt/Lede ĂŒber den Port 80, Fortsetzung

Dann: MenĂŒ „Überwachung“ -> „Letzte Daten“ -> „Rechtsklick auf den gewĂŒnschten Netzwerk-Knoten“. So wird das MenĂŒ nach dem HinzufĂŒgen des Skripts aussehen.

FernĂŒberwachung und Verwaltung von GerĂ€ten auf Basis von Linux/OpenWrt/Lede ĂŒber den Port 80, Fortsetzung
Das Skript reboot.php legen wir im Verzeichnis /usr/share/zabbix ab (bei Ihnen könnte es anders sein, ich benutze das Wurzelverzeichnis von Zabbix).

VorankĂŒndigung zur SicherheitZur Veranschaulichung im Skript verwende ich nur die ID des Routers, aber kein Passwort. In der Produktionsversion wird das nicht empfohlen! Warum ich das gemacht habe: Weil die große Frage ist – wo sollten die Passwörter fĂŒr die Router gespeichert werden? In den „Inventardaten“ von Zabbix? Eine widersprĂŒchliche Praxis. Eine Möglichkeit: den Zugang von außen zu der Datei reboot.php beschrĂ€nken.

Die Datei reboot.php

set_charset("utf8");
		
	// "Senden" Sie den Befehl reboot durch Ändern des Feldes task in der Tabelle users. Im Feld task kann jede beliebige Befehle gesendet werden.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

Das ist alles. Die offene Frage bleibt: „Wie erhĂ€lt man das Ergebnis der AusfĂŒhrung des Kommandos vom GerĂ€t?“ Schauen wir uns die Aufgabe anhand des Kommandos ifconfig an. Ein solches Kommando kann an das GerĂ€t gesendet werden:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

, wo:
message=`ifconfig` — wir weisen der Variablen $message das Ergebnis der Ausgabe des Kommandos ifconfig zu.
wget „xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — unser Skript a.php, das die Router registriert und Nachrichten von ihnen annimmt.
u=user&p=password!&m=$message — die Zugangsdaten und der Variable m wird der Inhalt der Variablen $message zugewiesen.
-O /tmp/out.txt — die Ausgabe in die Datei /tmp/out.txt brauchen wir in diesem Fall nicht, aber wenn man diesen Parameter nicht angibt, funktioniert wget nicht.

Warum das nicht richtig funktioniertWeil es ein potenzielles Sicherheitsrisiko darstellt. Der harmloseste Fehler, der auftreten kann, ist, wenn in der Ausgabe Ihres Kommandos zum Beispiel das Zeichen „&“ vorhanden ist. Daher mĂŒssen alle Daten, die von den Routern gesendet werden und die auf dem Server eingehen, gefiltert werden. Ja, ich schĂ€me mich, ehrlich. Zu meiner Verteidigung kann ich nur sagen, dass der ganze Artikel darauf abzielt, wie Router mit einer im Voraus nicht definierten Firmware und unbestimmten KommunikationskanĂ€len verwaltet werden können.

Nun habe ich eine Grundlage fĂŒr die Zukunft gelegt: Ich habe noch nicht herausgefunden, wie ich mit den Standardmitteln von Zabbix Ergebnisse (zum Beispiel das Ergebnis der AusfĂŒhrung eines Kommandos), die auf den Server kommen, darstelle.

Ich erinnere daran, dass alle Quellcodes vom Git-Repository unter folgender Adresse heruntergeladen werden können: github.com/BazDen/iotnet.online.git

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster