Nadaljevanje nadzora in upravljanja naprav na osnovi Linux/OpenWrt/Lede prek vrat 80

To je zadnji del članka, tukaj je začetek habr.com/en/post/445568
Nazadnje, ko sem pisal o tem, kako sem implementiral nadzor naprave, zdaj bomo govorili o upravljanju. V pogovorih s »tehniki« na strani naročnika pogosto naletim na omejeno dojemanje zmogljivosti tako majhnih naprav (z nizkimi pomnilniškimi sredstvi in ​​zmogljivostjo), mnogi menijo, da »največ, kar potrebujemo, je poslati ponovni zagon, za nekaj več. resno, poslali bomo ekipo” .
A praksa kaže, da to ne drži povsem. Tukaj je majhen seznam pogostih tipičnih opravil:

  1. Omrežna diagnostika in odpravljanje težav. Za ethernet vrati vašega usmerjevalnika je običajno drug kos strojne opreme, ki ima svoj notranji naslov IP. Včasih ga lahko (bi morali) "pingati". Ali upravljanje tunela - če se predor nenadoma ne dvigne na usmerjevalniku, ki deluje prek 3G modema, vendar lahko vidimo sam usmerjevalnik.
  2. Vzdrževanje sistema. Posodobitev vdelane programske opreme, nadgradnja servisnega skripta.
  3. Uravnoteženje. Temu bi lahko rekli »perverzija«, toda koncept »ekvilibrizma« kot, citiram, »sposobnost cirkuškega izvajalca, da ohrani ravnotežje v nestabilnem položaju telesa« - se bolje prilega. Do takšnih situacij pride zaradi omejenega proračuna stranke. Spodaj sem navedel nekaj primerov, vendar ... Niso neposredno povezani s temo zgodbe, dal sem jih v opombe

Nadzor Wi-FiModna tema zadnjih petih let, predvsem med zveznimi trgovskimi verigami. Ležerno se sprehajate po trgovskih prostorih in vaš mobilni telefon z vklopljenim Wi-Fi-jem, da bi se »prilepil« na neko nit omrežja, redno pošilja pakete Probe Request, ki jih je mogoče analizirati, da bi izračunali za vi: kako pogosto prihajate v to trgovino, iz katerih razlogov? hodite po trajektorijah in tako naprej. Nato se podatki zberejo, analizirajo, izrišejo toplotne karte, menedžerji pa za takšne slike »izsiljujejo« denar od uprave ali investitorjev. No, zaenkrat.... “denarja ni, a ti zdrži...”, rezultat (pravi) pa je že treba pokazati, se začne stara dobra pesem: “Ja, ja, potem pa seveda mi. bo namestil cis in vse, kar želite, zdaj pa moramo stranki pokazati rezultat! Mimogrede, pozabili smo povedati, da nam je stranka dovolila povezavo naše opreme z njegovo dostopno točko prek Wi-Fi-ja, vendar na splošni podlagi, tako kot če bi bili gostje.« In tako moramo narediti usmerjevalnike za uravnoteženje - dvigne se več podvmesnikov WiFi, od katerih se eden oklepa dostopne točke, drugi pa spremlja okolje, mrzlično nalaga rezultat tcpdump vase, nato pa vsebino datoteke zapakira v arhiv in tvega umiranje od “prenajedanja” poskuša izpljuniti vsebino na FTP strežnik. Ni presenetljivo, da se balansirni usmerjevalnik pogosto "pokvari" in ga je treba nekako "oživiti" na daljavo.

RadiusTukaj je situacijo lažje opisati s takole izjavo stranke: »Želimo decentralizirano mrežo vročih točk, ki bi delovala na opremi, katere model ni vnaprej znan, po kanalih, katerih pa še ne poznamo. Oh, pozabili smo povedati, ne želimo samo prikazovati oglaševanje strankam, ampak tudi analizirati vse okoli lokacije, kjer je nameščena dostopna točka. Ne, ne vemo še zakaj, ampak bomo ugotovili, ne dvomite o tem, lahko smo prišli do te ideje.”

In ne smemo pozabiti, da je treba zaradi kopice doslej neznanih okoliščin nadzor izvajati v nestandardnih pogojih, ko se na usmerjevalnik ne moremo povezati neposredno preko IP: vrat in smo prisiljeni preprosto čakati na aktivnost z njega. Če se abstrahiramo, lahko dialog med strežnikom in usmerjevalnikom predstavimo takole:

  • Usmerjevalnik: Zdravo. Sem tak in tak usmerjevalnik, ali obstajajo kakšne naloge zame?
  • Strežnik: router tak in tak sem te registriral, da si živ. Tukaj je izziv: mi pokažite rezultat ukaza ifconfig?
  • Usmerjevalnik: Zdravo. Jaz sem tak in tak usmerjevalnik, zadnjič, ko ste zahtevali prikaz rezultata ifconfig, tukaj je. Ali obstajajo kakšne naloge zame?
  • Strežnik: router tak in tak sem te registriral, da si živ. Za vas ni nalog.

Najbolj zanimivo vprašanje: kako lahko oddaljeni usmerjevalnik pošlje določeno količino informacij? V zadnjem delu sem opisal, da ima usmerjevalnik zaradi omejenih virov samo “slečen” wget, ki deluje samo preko GET in nič drugega, ni FTP odjemalca ali curla. Natančneje, potrebujemo univerzalno metodo, ne glede na značilnosti sestavljanja slike. Odločil sem se za uporabo wget. Natančneje, kako sem se "ustavil" - preprosto nisem imel izbire :)

Samo izjava o omejitvi odgovornostiMoja rešitev za upravljanje deluje, ni zelo omejena in prepričan sem, da je ukrivljena, čeprav ustreza večini mojih strank. Kako bi lahko to naredili pametno - napisali majhen pripomoček, ki pošilja binarne podatke POST prek vrat 80. Vključite ga (pripomoček) v vdelano programsko opremo usmerjevalnika in dostopajte do njega z uporabo bash. Toda resničnost je taka, da: a) moramo hitro b) verjetno moramo narediti vse na obstoječem "živalskem vrtu usmerjevalnikov" c) "ne škodovati!" — če usmerjevalnik deluje in opravlja druge naloge, poskusite izvesti spremembe, ki ne bodo vplivale na obstoječo funkcionalnost.

Pojdimo k izvedbi. Recimo, da vaša stranka želi enostavno in naravno znova zagnati usmerjevalnik iz zabbixa, s »klikom miške«. Danes bomo začeli opisovati izvedbo z Zabbixom.
V meniju “Administracija” -> “Skripti” dodajte nov skript. Temu pravimo »Ponovni zagon«, vnesite »php /usr/share/zabbix/reboot.php {HOST.HOST}« kot ukaz

Nadaljevanje nadzora in upravljanja naprav na osnovi Linux/OpenWrt/Lede prek vrat 80

Naprej: Meni “Spremljanje” -> “Najnovejši podatki” -> “Z desno miškino tipko kliknite želeno omrežno vozlišče.” Takole bo izgledal meni po dodajanju skripta.

Nadaljevanje nadzora in upravljanja naprav na osnovi Linux/OpenWrt/Lede prek vrat 80
V skladu s tem smo skripto reboot.php postavili v imenik /usr/share/zabbix (vaš je lahko drugačen, jaz uporabljam korenski imenik zabbixa).

Zavrnitev odgovornosti glede varnostiDa bi bila razlaga v skriptu jasnejša, uporabljam samo ID usmerjevalnika, ne pa gesla. V produkcijski različici tega ni priporočljivo! Zakaj sem to naredil: ker je veliko vprašanje, kje shraniti gesla za usmerjevalnike? V sami zabbixe v "inventory data"? Kontroverzna praksa. Druga možnost: omejite zunanji dostop do same datoteke reboot.php

Datoteka reboot.php

<?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();
?>

To je vse. Odprto ostaja vprašanje: "kako pridobiti rezultat izvajanja ukaza iz naprave." Oglejmo si nalogo na primeru ukaza ifconfig. Ta ukaz lahko pošljete napravi:

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

, kjer:
sporočilo=`ifconfig` — rezultat izhoda ukaza ifconfig dodelimo spremenljivki $message
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — naš skript a.php, ki registrira usmerjevalnike in od njih sprejema sporočila
u=uporabnik&p=geslo!&m=$sporočilo — poverilnice in vrednost spremenljivke zahteve m — dodeli vsebino spremenljivke $message
-O /tmp/out.txt — v tem primeru ne potrebujemo izhoda v datoteko /tmp/out.txt, vendar če ta parameter ni naveden, wget ne deluje

Zakaj to ne deluje?Ker je potencialna varnostna luknja. Najbolj neškodljiva napaka, ki se lahko zgodi, je, če je na primer v izhodu vašega ukaza znak »&«. Zato je treba filtrirati tako vse, kar je poslano z usmerjevalnikov, kot vse, kar pride na strežnik. Ja, res me je sram. V svojo obrambo lahko zapišem le to, da je celoten članek namenjen upravljanju usmerjevalnikov s preddefiniranim firmware-om in komunikacijskimi kanali, ki niso vnaprej definirani.

No, začetek za prihodnost: nisem še ugotovil, kako uporabiti standardna orodja zabbix za prikaz rezultatov (na primer rezultat izvajanja ukaza), ki pridejo na strežnik.

Opozarjam vas, da so vsi viri na voljo v repozitoriju Git na: github.com/BazDen/iotnet.online.git

Vir: www.habr.com

Dodaj komentar