Fjernovervågning og kontrol af Linux/OpenWrt/Lede-enheder via port 80, fortsat

Dette er den sidste del af artiklen, her er begyndelsen habr.com/en/post/445568
Sidste gang jeg skrev om, hvordan jeg implementerede enhedsovervågning, nu vil vi tale om ledelse. I diskussioner med "teknikere" fra kundens side, møder jeg ofte en begrænset opfattelse af mulighederne for så små enheder (med lave hukommelsesressourcer og ydeevne), mange mener, at "det maksimale, vi har brug for, er at sende en genstart, for noget mere seriøst - vi sender en brigade."
Men praksis viser, at det ikke er helt rigtigt. Her er en lille liste over almindelige typiske opgaver:

  1. Netværksdiagnostik og fejlfinding. Bag ethernet-porten på din router "bor der normalt et andet stykke jern", som har sin egen interne ip-adresse. Nogle gange kan den (bør) blive "pinget". Eller tunnelstyring - hvis tunnelen pludselig ikke rejser sig på routeren, der arbejder gennem 3G-modemet, men vi ser selve routeren.
  2. Systemservice. Firmwareopdatering, opgradering af servicescripts.
  3. Ligevægt. Dette kunne kaldes "perversioner", men begrebet "tightrope walker", som jeg citerer, "en cirkusartists evne til at opretholde balancen i en ustabil kropsposition" - passer bedre. Sådanne situationer opstår på grund af kundens begrænsede budget. Jeg gav et par eksempler nedenfor, men siden de er ikke direkte relateret til historiens emne, jeg lægger dem i noterne

wifi overvågningEt fashionabelt emne i de sidste fem år, hovedsageligt blandt føderale detailkæder. Du går langsomt rundt på handelsgulvene, og din mobiltelefon med Wi-Fi tændt, i et forsøg på at "holde" til en eller anden tråd i netværket, sender jævnligt Probe Request-pakker ud, som kan analyseres for at beregne dig: hvor ofte kommer du til denne butik, hvilke baner går du på, og så videre. Yderligere indsamles data, analyseres, varmekort tegnes, og ledere "slår penge ud" fra ledelsen eller investorer for sådanne billeder. I mellemtiden .... "der er ingen penge, men du holder fast ...", og resultatet (rigtigt) skulle allerede være vist, den gode gamle sang "Ja, ja, så leverer vi selvfølgelig cisco'er og hvad du vil, men nu skal vi vise Kunden resultatet! De glemte i øvrigt at sige, at Kunden lod vores udstyr forbindes til hans hotspot via Wi-Fi, men på generelt grundlag, ligesom hvis vi var gæstekunder. Og nu er du nødt til at lave ekvilibristiske routere - flere WiFi-undergrænseflader rejser sig, hvoraf den ene klamrer sig til hotspottet, og den anden overvåger miljøet, læsser febrilsk resultatet af tcpdump ind i sig selv, pakker derefter indholdet af filen ind i et arkiv og forsøger, med risiko for at dø af "overspisning", at spytte serverne ud på FTP. Det er ikke overraskende, at den ekvilibristiske router ofte "bryder sammen" og på en eller anden måde skal "reanimeres" eksternt.

RadiusHer er det nemmere at beskrive situationen med noget som denne erklæring fra kunden: "Vi ønsker et decentralt netværk af hotspots, der vil fungere på udstyr, hvis model ikke er kendt på forhånd, gennem kanaler, men hvilke vi endnu ikke kender. Åh, vi glemte at sige, vi ønsker ikke kun at vise annoncer til kunder, men også analysere alt omkring installationsstedet for hotspot. Nej, vi ved ikke hvorfor endnu, men vi finder på det, tøv ikke, vi var i stand til at komme med denne idé."

Og vi må ikke glemme, at på grund af en masse usikre omstændigheder i forvejen, skal styringen udføres under ikke-standardiserede forhold, når vi ikke kan oprette forbindelse til routeren direkte via ip: port og er tvunget til blot at vente på, at der kommer aktivitet fra den. Hvis vi abstraherer, så kan dialogen mellem serveren og routeren repræsenteres således:

  • Router: Hej. Jeg er sådan og sådan en router, er der nogle opgaver til mig?
  • Server: sådan og sådan en router, jeg registrerede dig, at du er i live. Her er udfordringen: vis mig outputtet af ifconfig-kommandoen?
  • Router: Hej. Jeg er sådan og sådan en router, sidste gang du bad om at vise resultatet af ifconfig, her er det. Er der opgaver til mig?
  • Server: sådan og sådan en router, jeg registrerede dig, at du er i live. Der er ingen opgaver til dig.

Det mest interessante spørgsmål er: hvordan kan en fjernrouter sende en vis mængde information? I sidste del beskrev jeg, at routeren, grundet begrænsede ressourcer, kun har en "strippet" wget, som kun virker gennem GET og intet andet, der er ingen ftp-klient eller curl. Mere præcist har vi brug for en universel måde, uanset funktionerne i billedsamlingen. Jeg valgte at bruge wget. Mere præcist, hvordan "stoppet" - jeg havde bare ikke noget valg 🙂

Umiddelbart reservationMin styringsløsning virker, ikke særlig begrænset, og jeg er sikker på, at den er skæv, selvom den passer til de fleste af mine kunder. Hvordan VILLE det være muligt at gøre det klogt - skriv et lille hjælpeprogram, der sender binære data via POST gennem den 80. port. Inkluder det (værktøj) i routerens firmware og brug bash til at få adgang til det. Men virkeligheden er, at: a) du skal hurtigt b) du sandsynligvis skal gøre alt på den eksisterende "zoo af routere" c) "gør ingen skade!" - hvis routeren fungerer og udfører andre opgaver, så prøv at lave ændringer, der ikke påvirker den eksisterende funktionalitet.

Lad os gå videre til implementeringen. Lad os sige, at din kunde ønsker fra zabbix at genstarte routeren nemt og naturligt med et "museklik". I dag vil vi begynde beskrivelsen af ​​implementeringen med zabbix.
Tilføj et nyt script i menuen "Administration" -> "Scripts". Vi kalder det "Genstart", som en kommando skriver vi "php /usr/share/zabbix/reboot.php {HOST.HOST}"

Fjernovervågning og kontrol af Linux/OpenWrt/Lede-enheder via port 80, fortsat

Næste: Menu "Overvågning" -> "Seneste data" -> "Højreklik på den ønskede vært". Sådan ser menuen ud efter tilføjelse af scriptet.

Fjernovervågning og kontrol af Linux/OpenWrt/Lede-enheder via port 80, fortsat
Derfor placerer vi reboot.php-scriptet i mappen /usr/share/zabbix (det kan være anderledes for dig, jeg bruger zabbixa-rodmappen).

SikkerhedsfraskrivelseFor klarheden af ​​forklaringen i scriptet bruger jeg kun id'et på routeren, men bruger ikke adgangskoden. I den fungerende version anbefales dette ikke! Hvorfor gjorde jeg dette: fordi det store spørgsmål er, hvor man gemmer adgangskoder til routere? I zabbixe sig selv i "inventar"? Modstridende praksis. Som en mulighed: begræns ekstern adgang til selve reboot.php-filen

genstart.php-fil

<?php
	// присваиваем параметры с консоли переменным
	$user = $argv[1];
	// ВНИМАНИЕ. Вот здесь в целях безопасности все-таки прописывать пароль устройства! Но для демонстрации мы будем обращаться к базе данных без использования пароля. 
	//$password = $argv[2];
		
	$conn=new mysqli("localhost","db_user","db_password","db_name");
	if (mysqli_connect_errno()) {
		exit();
	}
	$conn->set_charset("utf8");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$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();
?>

Faktisk alt. Spørgsmålet "hvordan man får resultatet af kommandoudførelsen fra enhedssiden" forbliver åbent. Lad os overveje opgaven ved at bruge ifconfig-kommandoen som eksempel. Følgende kommando kan sendes til enheden:

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

, Hvor:
message=`ifconfig` - vi tildeler resultatet af outputtet af ifconfig-kommandoen til $message-variablen
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - vores a.php script, der registrerer routere og modtager beskeder fra dem
u=bruger&p=adgangskode!&m=$meddelelse - legitimationsoplysninger og værdien af ​​forespørgselsvariablen m - tildeler indholdet af $message-variablen
-O /tmp/out.txt - vi behøver ikke output til filen /tmp/out.txt i dette tilfælde, men hvis denne parameter ikke er angivet, virker wget ikke

Hvorfor virker dette forkertFordi det er et potentielt sikkerhedshul. den mest ufarlige fejl, der kan ske, er, hvis outputtet af din kommando, for eksempel, indeholder symbolet "&". Derfor er det nødvendigt at filtrere alt, hvad der sendes fra routerne og alt, der kommer til serveren. Ja, jeg skammer mig virkelig. Til mit forsvar kan jeg kun skrive, at hele artiklen er helliget, hvordan man administrerer routere med udefineret firmware, med udefinerede kommunikationskanaler.

Nå, jeg har berørt fremtiden: Jeg har endnu ikke fundet ud af, hvordan jeg skal afspejle resultaterne (for eksempel resultatet af en kommandoudførelse), der kommer til serveren ved hjælp af standard zabbix-værktøjer.

Jeg minder dig om, at alle kilder kan hentes fra Git-depotet på: github.com/BazDen/iotnet.online.git

Kilde: www.habr.com

Tilføj en kommentar