Daljinsko praćenje i kontrola Linux/OpenWrt/Lede uređaja preko porta 80, nastavak

Ovo je završni dio članka, evo početka habr.com/en/post/445568
Prošli put kada sam pisao o tome kako sam implementirao nadzor uređaja, sada ćemo pričati o upravljanju. U razgovorima sa "tehničarima" sa strane korisnika, često se susrećem sa ograničenom percepcijom mogućnosti tako malih uređaja (sa niskim memorijskim resursima i performansama), mnogi veruju da je "maksimalno što nam treba da pošaljemo ponovno pokretanje , za nešto ozbiljnije - poslaćemo brigadu”.
Ali praksa pokazuje da to nije sasvim tačno. Evo male liste uobičajenih tipičnih zadataka:

  1. Mrežna dijagnostika i rješavanje problema. Iza eternet porta vašeg rutera obično „živi“ još jedan komad željeza koji ima svoju internu IP adresu. Ponekad se može (trebalo) “pingovati”. Ili upravljanje tunelom - ako se tunel iznenada ne podigne na ruteru koji radi preko 3G modema, ali vidimo sam ruter.
  2. Sistemska usluga. Ažuriranje firmvera, nadogradnja servisnih skripti.
  3. Ekvilibristike. Ovo bi se moglo nazvati "perverzijama", ali koncept "hodača po konopu" 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 budžeta kupca. U nastavku sam naveo nekoliko primjera, ali od tada nisu direktno vezane za temu priče, stavio sam ih u bilješke

wifi monitoringModerna tema posljednjih pet godina, uglavnom među saveznim trgovačkim lancima. Polako hodate po trgovačkim podovima, a vaš mobilni telefon sa 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 vam izračunali : koliko često dolazite u ovu radnju, po kojim putanjama hodate i tako dalje. Dalje, podaci se prikupljaju, analiziraju, iscrtavaju toplotne karte, a menadžeri za takve slike „nokauziraju“ novac od menadžmenta ili investitora. U međuvremenu .... "nema para, ali ti drži...", a rezultat (pravi) bi već trebao biti prikazan, stara dobra pjesma "Da, da, onda ćemo naravno isporučiti ciscos i šta god želite, ali sada moramo pokazati Kupcu rezultat! Uzgred, zaboravili su da kažu da je Kupac dozvolio da se naša oprema poveže na njegovu hotspot preko Wi-Fi mreže, ali generalno, kao da smo mi gosti. A sada morate napraviti ekvilibrističke rutere - nekoliko WiFi podsučelja se podiže, od kojih se jedno drži za hotspot, a drugo nadzire okolinu, bjesomučno iskrcava rezultat tcpdump u sebe, zatim pakira sadržaj datoteke u arhivu i rizikuje umiranje od "prejedanja" pokušavajući da ispljune sadržaj na ftp server. Nije iznenađujuće da se ekvilibristički ruter često "pokvari" i nekako mora biti "reanimiran" na daljinu.

poluprečnikOvdje je lakše opisati situaciju nečim poput ove izjave kupca: “Želimo decentraliziranu mrežu hotspotova koja bi radila na opremi čiji model nije poznat unaprijed, putem kanala, ali koje još ne znamo. Oh, zaboravili smo reći, ne samo da želimo da prikazujemo oglase kupcima, već i analiziramo sve oko mjesta za instaliranje pristupne tačke. Ne, još ne znamo zašto, ali smislićemo, ne oklijevajte, uspjeli smo doći na ovu ideju.”

I ne smijemo zaboraviti da se zbog mnogo neizvjesnih okolnosti unaprijed, upravljanje mora vršiti u nestandardnim uvjetima, kada se ne možemo direktno povezati na ruter preko ip: porta i primorani smo jednostavno čekati da se aktivnost pojavi sa to. Ako apstrahujemo, onda se dijalog između servera i rutera može predstaviti ovako:

  • Ruter: Zdravo. Ja sam takav i takav ruter, ima li zadataka za mene?
  • Server: takav i takav ruter, registrovao sam te da si živ. Evo izazova: pokažite mi izlaz naredbe ifconfig?
  • Ruter: Zdravo. Ja sam takav i takav ruter, zadnji put kada ste tražili da pokažete rezultat ifconfig-a, evo ga. Ima li zadataka za mene?
  • Server: takav i takav ruter, registrovao sam te da si živ. Za vas nema zadataka.

Najzanimljivije pitanje je: kako udaljeni ruter može poslati određenu količinu informacija? U zadnjem dijelu sam opisao da ruter, zbog ograničenih resursa, ima samo “skinuti” wget, koji radi samo preko GET-a i ništa više, nema ftp klijenta ili curl-a. Preciznije, potreban nam je univerzalni način, bez obzira na karakteristike sklopa slike. Odlučio sam da koristim wget. Tačnije, kako “zaustavljen” - jednostavno nisam imao izbora 🙂

Odmah rezervacijaMoje upravljačko rješenje funkcionira, nije baš ograničeno, i siguran sam da je krivo, čak i ako odgovara većini mojih kupaca. Kako BI to bilo moguće učiniti mudro - napišite mali uslužni program koji šalje binarne podatke putem POST-a kroz 80. port. Uključite ga (uslužni program) u firmver rutera i koristite bash da mu pristupite. Ali realnost je da: a) morate brzo b) vjerovatno trebate učiniti sve na postojećem "zoološkom vrtu rutera" c) "ne naškoditi!" - ako ruter radi i obavlja druge zadatke, pokušajte napraviti promjene koje neće utjecati na postojeću funkcionalnost.

Pređimo na implementaciju. Recimo da vaš korisnik želi od zabbixa da ponovo pokrene ruter lako i prirodno, uz "klik miša". Danas ćemo započeti opis implementacije sa zabbixom.
U meniju "Administracija" -> "Skripte" dodajte novu skriptu. Mi to zovemo "Reboot", kao naredbu pišemo "php /usr/share/zabbix/reboot.php {HOST.HOST}"

Daljinsko praćenje i kontrola Linux/OpenWrt/Lede uređaja preko porta 80, nastavak

Sljedeće: Meni "Monitoring" -> "Najnoviji podaci" -> "Kliknite desnim tasterom miša na željeni host". Ovako će meni izgledati nakon dodavanja skripte.

Daljinsko praćenje i kontrola Linux/OpenWrt/Lede uređaja preko porta 80, nastavak
U skladu s tim, reboot.php skriptu stavljamo u /usr/share/zabbix direktorij (može biti drugačije za vas, ja koristim zabbixa root direktorij).

Izjava o sigurnostiRadi jasnoće objašnjenja u skripti, koristim samo id rutera, ali ne koristim lozinku. U radnoj verziji to se ne preporučuje! Zašto sam ovo uradio: jer je veliko pitanje gde da pohranim lozinke za rutere? U samom zabbixeu u "inventaru"? Kontradiktorna praksa. Kao opcija: ograničite vanjski pristup samoj datoteci reboot.php

reboot.php fajl

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

Zapravo sve. Pitanje “kako dobiti rezultat izvršenja naredbe sa strane uređaja” ostaje otvoreno. Razmotrimo zadatak koristeći naredbu ifconfig kao primjer. Uređaju se može poslati sljedeća naredba:

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

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

Zašto ovo radi pogrešnoJer to je potencijalna sigurnosna rupa. najbezazlenija greška koja se može dogoditi je ako izlaz vaše naredbe, na primjer, sadrži simbol "&". Stoga je potrebno filtrirati sve što se šalje sa rutera i sve što dolazi na server. Da, stidim se, zaista. U svoju odbranu mogu samo da napišem da je ceo članak posvećen tome kako upravljati ruterima sa nedefinisanim firmverom, sa nedefinisanim kanalima komunikacije.

Pa, dotaknuo sam se budućnosti: još nisam shvatio kako da prikažem rezultate (na primjer, rezultat izvršenja naredbe) koji dolaze na server pomoću standardnih zabbix alata.

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

izvor: www.habr.com

Dodajte komentar