Nastavak daljinskog nadzora i upravljanja Linux/OpenWrt/Lede uređajima putem porta 80

Ovo je završni dio članka, ovdje je početak habr.com/en/post/445568
Prošli put sam pisao o tome kako sam implementirao nadzor uređaja, sada ćemo govoriti o upravljanju. U razgovorima s “tehničarima” na strani Kupca, često se susrećem s ograničenom percepcijom mogućnosti takvih malih uređaja (s malim memorijskim resursima i performansama), mnogi vjeruju da je “najviše što trebamo poslati reboot, za nešto više ozbiljno, poslat ćemo tim” .
Ali praksa pokazuje da to nije sasvim točno. Evo malog popisa uobičajenih tipičnih zadataka:

  1. Mrežna dijagnostika i rješavanje problema. Iza ethernet priključka vašeg usmjerivača obično se nalazi još jedan hardverski dio koji ima vlastitu internu IP adresu. Ponekad ga možete (trebali) "pingati". Ili upravljanje tunelom - ako se tunel iznenada ne diže na usmjerivaču koji radi putem 3G modema, ali možemo vidjeti sam usmjerivač.
  2. Održavanje sustava. Ažuriranje firmvera, nadogradnja servisne skripte.
  3. Djelovanje ravnoteže. To bi se moglo nazvati “perverzijom”, ali koncept “ekvilibrizma” kao, citiram, “sposobnost cirkuskog izvođača da održi ravnotežu u nestabilnom položaju tijela” - bolje pristaje. Takve situacije nastaju zbog ograničenog proračuna kupca. U nastavku sam naveo par primjera, ali... Nisu izravno vezane uz temu priče, stavio sam ih u bilješke

Wi-Fi nadzorPomodna tema zadnjih pet godina, uglavnom među federalnim trgovačkim lancima. Ležerno šetate trgovištima, a vaš mobitel s uključenim Wi-Fi-jem, u pokušaju da se “zalijepi” za neku nit mreže, redovno šalje pakete Probe Request, koji se mogu analizirati kako bi se izračunalo za vi: koliko često dolazite u ovu trgovinu, iz kojih razloga? hodate po putanjama i tako dalje. Zatim se podaci prikupljaju, analiziraju, crtaju toplinske karte, a menadžeri za takve slike “iznuđuju” novac od uprave ili investitora. Eto, za sada.... “nema para, ali izdrži...”, a rezultat (pravi) već treba pokazati, počinje dobra stara pjesma: “Da, da, onda naravno mi instalirat će cis i sve što želite, ali sada moramo pokazati Kupcu rezultat! Usput, zaboravili smo reći da nam je kupac dopustio da svoju opremu povežemo s njegovom hotspotom putem Wi-Fi-ja, ali na općoj osnovi, baš kao da smo gosti klijenti.” I tako moramo napraviti usmjerivače za balansiranje - podiže se nekoliko WiFi podsučelja, od kojih se jedno drži žarišne točke, a drugo nadzire okolinu, bjesomučno učitava rezultat tcpdumpa u sebe, zatim pakira sadržaj datoteke u arhivu i riskira umirući od “prejedanja” pokušava ispljunuti sadržaj na FTP poslužitelju. Nije iznenađujuće da se usmjerivač za balansiranje često "pokvari" i mora se nekako "reanimirati" na daljinu.

RadiusLakše je opisati situaciju ovdje s nečim poput ove izjave kupca: “Želimo decentraliziranu mrežu hotspotova koja bi radila na opremi čiji model nije unaprijed poznat, kroz kanale, ali koje još ne znamo. Oh, zaboravili smo reći, ne samo da želimo prikazivati ​​reklame klijentima, već i analizirati sve oko lokacije na kojoj je hotspot instaliran. Ne, još ne znamo zašto, ali ćemo to shvatiti, nemojte sumnjati, uspjeli smo doći na ovu ideju.”

I ne smijemo zaboraviti da se zbog puno dosad nepoznatih okolnosti kontrola mora provoditi u nestandardnim uvjetima, kada se ne možemo spojiti na router izravno preko IP: porta i prisiljeni smo jednostavno čekati aktivnost s njega. Ako se apstrahiramo, dijalog između poslužitelja i usmjerivača može se prikazati ovako:

  • usmjerivač: Zdravo. Ja sam takav i takav router, ima li zadataka za mene?
  • Server: router takav i takav registrirao sam te da si živ. Evo izazova: pokazati mi rezultat naredbe ifconfig?
  • usmjerivač: Zdravo. Ja sam takav i takav router, prošli put si tražio da pokažeš rezultat ifconfiga, evo ga. Ima li zadataka za mene?
  • Server: router takav i takav registrirao sam te da si živ. Za vas nema zadataka.

Najzanimljivije pitanje: kako udaljeni usmjerivač može poslati određenu količinu informacija? U prošlom dijelu sam opisao da usmjerivač zbog ograničenih resursa ima samo “ogoljeni” wget, koji radi samo preko GET-a i ništa više, nema FTP klijenta niti curla. Točnije, potrebna nam je univerzalna metoda, bez obzira na značajke sastavljanja slike. Odlučio sam se koristiti wget. Točnije, kako sam “stala” - jednostavno nisam imala izbora :)

Samo odricanje od odgovornostiMoje rješenje za upravljanje funkcionira, nije jako ograničeno i siguran sam da je krivo, čak i ako odgovara većini mojih kupaca. Kako biste to mogli učiniti mudro - napisati mali uslužni program koji šalje POST binarne podatke kroz port 80. Uključite ga (uslužni program) u firmware usmjerivača i pristupite mu koristeći bash. Ali stvarnost je da: a) moramo brzo b) vjerojatno moramo učiniti sve na postojećem "zoološkom vrtu usmjerivača" c) "nemoj naštetiti!" — ako usmjerivač radi i obavlja druge zadatke, pokušajte napraviti promjene koje neće utjecati na postojeću funkcionalnost.

Prijeđimo na implementaciju. Recimo da vaš kupac želi jednostavno i prirodno ponovno pokrenuti usmjerivač sa zabbixa, "klikom miša". Danas ćemo početi opisivati ​​implementaciju sa Zabbixom.
U izborniku “Administracija” -> “Skripte” dodajte novu skriptu. Mi to zovemo “Ponovno pokretanje”, unesite “php /usr/share/zabbix/reboot.php {HOST.HOST}” kao naredbu

Nastavak daljinskog nadzora i upravljanja Linux/OpenWrt/Lede uređajima putem porta 80

Sljedeće: Izbornik “Monitoring” -> “Najnoviji podaci” -> “Desnom tipkom miša kliknite na željeni mrežni čvor.” Ovako će izgledati izbornik nakon dodavanja skripte.

Nastavak daljinskog nadzora i upravljanja Linux/OpenWrt/Lede uređajima putem porta 80
U skladu s tim, reboot.php skriptu stavljamo u /usr/share/zabbix direktorij (vaš može biti drugačiji, ja koristim zabbixa root direktorij).

Sigurnosno odricanje od odgovornostiKako bi objašnjenje bilo jasnije u skripti, koristim samo ID usmjerivača, ali ne koristim lozinku. Ne preporučuje se to raditi u proizvodnoj verziji! Zašto sam to učinio: zato što je veliko pitanje gdje pohraniti lozinke za usmjerivače? U samoj zabbixe u “inventory data”? Kontroverzna praksa. Alternativno: ograničite vanjski pristup samoj datoteci 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 sve. Ostaje otvoreno pitanje: "kako dobiti rezultat izvršavanja naredbe s uređaja." Pogledajmo zadatak koristeći ifconfig naredbu kao primjer. Ova se naredba može poslati uređaju:

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

, gdje:
poruka=`ifconfig` — dodjeljujemo rezultat izlaza naredbe ifconfig varijabli $message
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — naša a.php skripta koja registrira usmjerivače i prima poruke od njih
u=korisnik&p=lozinka!&m=$poruka — vjerodajnice i vrijednost varijable zahtjeva m — dodjeljuje sadržaj varijable $message
-O /tmp/out.txt — u ovom slučaju ne trebamo izlaz u datoteku /tmp/out.txt, ali ako ovaj parametar nije naveden, wget ne radi

Zašto ovo ne radi?Zato što je to potencijalna sigurnosna rupa. Najbezazlenija pogreška koja se može dogoditi je ako, na primjer, postoji znak “&” u izlazu vaše naredbe. Stoga je potrebno filtrirati i sve što se šalje s routera i sve što dolazi na poslužitelj. Da, sramim se, stvarno. U svoju obranu mogu samo napisati da je cijeli članak posvećen upravljanju ruterima s unaprijed definiranim firmwareom i komunikacijskim kanalima koji nisu unaprijed definirani.

Pa, početak za budućnost: još nisam shvatio kako koristiti standardne zabbix alate za odražavanje rezultata (na primjer, rezultat izvršavanja naredbe) koji dolaze na poslužitelj.

Podsjećam vas da se svi izvori mogu dobiti iz Git repozitorija na: github.com/BazDen/iotnet.online.git

Izvor: www.habr.com

Dodajte komentar