Linux/OpenWrt/Lede-laitteiden etävalvonta ja ohjaus portin 80 kautta, jatkuu

Tämä on artikkelin viimeinen osa, tässä on alku habr.com/en/post/445568
Viimeksi kun kirjoitin kuinka toteutin laitevalvonnan, nyt puhutaan hallinnasta. Keskustellessani asiakkaan "teknikon" kanssa tapaan usein rajallisen käsityksen tällaisten pienten laitteiden ominaisuuksista (joilla on vähän muistiresursseja ja suorituskykyä), monet uskovat, että "enintään mitä tarvitsemme on lähettää uudelleenkäynnistys , johonkin vakavampaan - lähetämme prikaatin".
Mutta käytäntö osoittaa, että tämä ei ole täysin totta. Tässä on pieni luettelo yleisistä tyypillisistä tehtävistä:

  1. Verkkodiagnostiikka ja vianmääritys. Reitittimesi ethernet-portin takana yleensä "elää" toinen raudanpala, jolla on oma sisäinen ip-osoite. Joskus se voidaan (pitäisi) "pingata". Tai tunnelinhallinta - jos tunneli ei yhtäkkiä nouse 3G-modeemin kautta toimivaan reitittimeen, mutta näemme itse reitittimen.
  2. Järjestelmäpalvelu. Laiteohjelmistopäivitys, palveluskriptien päivitys.
  3. Ekvilibristiikka. Tätä voitaisiin kutsua "perversioiksi", mutta "köysikävelijan" käsite, lainaan "sirkustaiteilijan kyky säilyttää tasapaino epävakaassa kehon asennossa" - istuu paremmin. Tällaiset tilanteet syntyvät asiakkaan rajallisen budjetin vuoksi. Annoin alla pari esimerkkiä, mutta siitä lähtien ne eivät liity suoraan tarinan aiheeseen, laitoin ne muistiinpanoihin

wifi-valvontaMuodikas aihe viimeisen viiden vuoden aikana, pääasiassa liittovaltion vähittäiskauppaketjujen keskuudessa. Kävelet hitaasti kaupankäyntikerroksilla ja matkapuhelimesi, jossa Wi-Fi on päällä, yrittää "kiintyä" johonkin verkon säikeeseen, lähettää säännöllisesti Probe Request -paketteja, jotka voidaan analysoida ja laskea puolestasi. : kuinka usein tulet tähän kauppaan, mitä polkuja kävelet ja niin edelleen. Lisäksi dataa kerätään, analysoidaan, lämpökartat piirretään ja johtajat "poistavat" rahaa johdolta tai sijoittajilta tällaisista kuvista. Sillä välin .... ”ei ole rahaa, mutta pidät kiinni...”, ja tuloksen (todellinen) pitäisi jo näkyä, vanha kunnon biisi ”Kyllä, kyllä, sitten tietysti toimitamme ciscoja ja mitä haluat, mutta nyt meidän on näytettävä asiakkaalle tulos! Muuten unohtuivat kertoa, että Asiakas antoi laitteistomme yhdistää hotspot-pisteeseensä Wi-Fi:n kautta, mutta yleisellä tasolla, aivan kuin olisimme vierailevia asiakkaita. Ja nyt sinun on tehtävä ekvilibristireitittimet - useita WiFi-aliliittymiä nousee, joista yksi se takertuu hotspotiin ja toinen tarkkailee ympäristöä, purkaa kiihkeästi tcpdumpin tuloksen itseensä, pakkaa sitten tiedoston sisällön arkistoon ja on vaarassa kuolla "ylensyömiseen" yrittäessään sylkeä sisältöä ftp-palvelimelle. Ei ole yllättävää, että ekvilibristinen reititin usein "hajoaa" ja se on jotenkin "reanimoitava" etänä.

SädeTässä on helpompi kuvailla tilannetta jollain tavalla, jollainen asiakkaan lausunto: ”Haluamme hajautetun hotspot-verkoston, joka toimisi kanavien kautta laitteissa, joiden mallia ei tiedetä etukäteen, mutta joita emme vielä tunne. Unohdimme sanoa, ettemme halua vain näyttää mainoksia asiakkaille, vaan myös analysoida kaiken hotspotin asennussivustossa. Ei, emme vielä tiedä miksi, mutta keksimme sen, älä epäröi, pystyimme keksimään tämän idean.

Eikä saa unohtaa, että jo etukäteen monien epävarmien olosuhteiden vuoksi hallinta on suoritettava epätyypillisissä olosuhteissa, jolloin emme voi muodostaa yhteyttä reitittimeen suoraan ip: portin kautta ja joudumme vain odottamaan toiminnan ilmaantumista se. Jos teemme abstraktia, palvelimen ja reitittimen välinen dialogi voidaan esittää seuraavasti:

  • reititin: Hei. Olen sellainen ja sellainen reititin, onko minulle tehtäviä?
  • Server: sellainen ja sellainen reititin, rekisteröin sinulle, että olet elossa. Tässä on haaste: näytä minulle ifconfig-komennon tulos?
  • reititin: Hei. Olen sellainen ja sellainen reititin, viimeksi kun pyysit näyttämään ifconfigin tuloksen, tässä se on. Onko minulle tehtäviä?
  • Server: sellainen ja sellainen reititin, rekisteröin sinulle, että olet elossa. Sinulle ei ole tehtäviä.

Mielenkiintoisin kysymys on: kuinka etäreititin voi lähettää tietyn määrän tietoa? Viimeisessä osassa kuvailin, että reitittimessä on rajallisten resurssien vuoksi vain "riistetty" wget, joka toimii vain GET:n kautta eikä mitään muuta, ei ole ftp-asiakasta tai curl-ohjelmaa. Tarkemmin sanottuna tarvitsemme universaalin tavan kuvakokoonpanon ominaisuuksista riippumatta. Päädyin käyttämään wgetiä. Tarkemmin sanottuna kuinka "pysähdyttiin" - minulla ei vain ollut vaihtoehtoa 🙂

Varaus hetiHallintaratkaisuni on toimiva, ei kovin rajoittunut, ja olen varma, että se on vino, vaikka se sopii useimmille asiakkailleni. Kuinka se olisi mahdollista tehdä viisaasti - kirjoita pieni apuohjelma, joka lähettää binaaridataa POST:n kautta 80. portin kautta. Sisällytä se (apuohjelma) reitittimen laiteohjelmistoon ja käytä sitä bashilla. Mutta todellisuus on, että: a) sinun täytyy nopeasti b) sinun täytyy luultavasti tehdä kaikki olemassa olevalla "reitittimien eläintarhalla" c) "älä vahingoita!" - jos reititin toimii ja suorittaa muita tehtäviä, yritä tehdä muutoksia, jotka eivät vaikuta olemassa oleviin toimintoihin.

Siirrytään toteutukseen. Oletetaan, että asiakkaasi haluaa zabbixilta käynnistää reitittimen uudelleen helposti ja luonnollisesti "hiiren napsautuksella". Tänään aloitamme toteutuksen kuvauksen zabbixilla.
Lisää uusi komentosarja valikossa "Hallinta" -> "Skriptit". Kutsumme sitä "Reboot" -komennona kirjoitamme "php /usr/share/zabbix/reboot.php {HOST.HOST}"

Linux/OpenWrt/Lede-laitteiden etävalvonta ja ohjaus portin 80 kautta, jatkuu

Seuraavaksi: Valikko "Seuranta" -> "Viimeisimmät tiedot" -> "Napsauta hiiren kakkospainikkeella haluamaasi isäntä". Tältä valikko näyttää skriptin lisäämisen jälkeen.

Linux/OpenWrt/Lede-laitteiden etävalvonta ja ohjaus portin 80 kautta, jatkuu
Tämän mukaisesti laitamme reboot.php-komentosarjan /usr/share/zabbix-hakemistoon (se voi olla erilainen sinulle, käytän zabbixa-juurihakemistoa).

TurvallisuusvastuulausekeSelvyyden vuoksi skriptissä käytän vain reitittimen tunnusta, mutta en käytä salasanaa. Työversiossa tätä ei suositella! Miksi tein tämän: koska suuri kysymys on, mihin tallentaa reitittimien salasanat? Itse zabbixessa "inventaariossa"? Ristiriitainen käytäntö. Vaihtoehtona: rajoita ulkoista pääsyä itse reboot.php-tiedostoon

reboot.php tiedosto

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

Itse asiassa kaikki. Kysymys "miten saada komennon suorittamisen tulos laitepuolelta" jää avoimeksi. Tarkastellaan tehtävää käyttämällä esimerkkinä ifconfig-komentoa. Laitteelle voidaan lähettää seuraava komento:

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

, jossa:
viesti=`ifconfig` - kohdistamme ifconfig-komennon tulosteen $message-muuttujaan
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - a.php-skriptimme, joka rekisteröi reitittimet ja vastaanottaa viestejä niiltä
u=käyttäjä&p=salasana!&m=$viesti - tunnistetiedot ja kyselymuuttujan m arvo - määrittää $sanomamuuttujan sisällön
-O /tmp/out.txt - emme tarvitse tulostetta /tmp/out.txt-tiedostoon tässä tapauksessa, mutta jos tätä parametria ei ole määritetty, wget ei toimi

Miksi tämä toimii väärinKoska se on mahdollinen tietoturva-aukko. vaarattomin virhe, joka voi tapahtua, on, jos komentosi tulos sisältää esimerkiksi symbolin "&". Siksi on tarpeen suodattaa kaikki, mikä lähetetään reitittimistä ja kaikki, mikä tulee palvelimelle. Joo, häpeän todella. Puolustukseksi voin vain kirjoittaa, että koko artikkeli on omistettu reitittimien hallitsemiseen määrittelemättömällä laiteohjelmistolla ja määrittelemättömillä viestintäkanavilla.

No, olen koskettanut tulevaisuutta: en ole vielä keksinyt, kuinka heijastan palvelimelle tulevia tuloksia (esimerkiksi komennon suorittamisen tulosta) tavallisilla zabbix-työkaluilla.

Muistutan, että kaikki lähteet voidaan ottaa Git-arkistosta osoitteessa: github.com/BazDen/iotnet.online.git

Lähde: will.com

Lisää kommentti