Fora monitorado kaj kontrolo de Linukso/OpenWrt/Lede-aparatoj per haveno 80, daŭris

Jen la fina parto de la artikolo, jen la komenco habr.com/en/post/445568
Lastan fojon mi skribis pri kiel mi efektivigis aparatan monitoradon, nun ni parolos pri administrado. En diskutoj kun "teknikistoj" flanke de la Kliento, mi ofte renkontas limigitan percepton de la kapabloj de tiaj malgrandaj aparatoj (kun malaltaj memoraj rimedoj kaj rendimento), multaj opinias, ke "la maksimumo, kiun ni bezonas, estas sendi rekomencon. , por io pli serioza - ni sendos brigadon" .
Sed praktiko montras, ke tio ne estas tute vera. Jen malgranda listo de oftaj tipaj taskoj:

  1. Diagnozo de reto kaj solvo de problemoj. Malantaŭ la eterreta haveno de via enkursigilo, kutime "vivas" alia ferpeco, kiu havas sian propran internan ip-adreson. Foje, ĝi povas (devus) esti "pingita". Aŭ tunela administrado - se la tunelo subite ne leviĝas sur la enkursigilo laboranta per la 3G-modemo, sed ni vidas la enkursigilon mem.
  2. Sistema servo. Ĝisdatigo de firmware, ĝisdatigo de servaj skriptoj.
  3. Ekvilibrismo. Tion oni povus nomi "perversioj", sed la koncepto de "funmambulo" kiel, mi citas, "la kapablo de cirka ludanto konservi ekvilibron en malstabila korpopozicio" - konvenas pli bone. Tiaj situacioj aperas pro la limigita buĝeto de la kliento. Mi donis kelkajn ekzemplojn sube, sed ekde tiam ili ne rekte rilatas al la temo de la rakonto, mi metis ilin en la notojn

vigla monitoradoModa temo dum la lastaj kvin jaroj, ĉefe inter federaciaj podetalaj ĉenoj. Vi malrapide promenas tra la komercaj etaĝoj, kaj via poŝtelefono kun Wi-Fi ŝaltita, provante "algluiĝi" al iu fadeno de la reto, regule sendas Probe Request-pakaĵojn analizeblajn por kalkuli por vi. : kiom ofte vi venas al ĉi tiu vendejo, por kiaj trajektorioj vi marŝas ktp. Plue, la datumoj estas kolektitaj, analizitaj, varmomapoj estas desegnitaj, kaj administrantoj "frapas" monon de administrado aŭ investantoj por tiaj bildoj. Intertempe .... "ne estas mono, sed vi tenas ...", kaj la rezulto (reala) devus esti jam montrata, la bona malnova kanto "Jes, jes, tiam kompreneble ni liveros ciskojn kaj kion ajn vi volas, sed nun ni devas montri al la Kliento la rezulton! Cetere, ili forgesis diri, ke la Kliento permesis al nia ekipaĵo konektiĝi al sia retpunkto per Wi-Fi, sed ĝenerale, kvazaŭ ni estus gastklientoj. Kaj nun vi devas fari ekvilibrajn enkursigilojn - pluraj WiFi-subinterfacoj leviĝas, unu el kiuj ĝi alkroĉiĝas al la hotspot, kaj la dua monitoras la medion, freneze malŝarĝas la rezulton de tcpdump en si mem, poste pakas la enhavon de la dosiero en arkivon kaj riskas morti pro "tromanĝado" provante kraĉi la enhavon al la ftp-servilo. Ne estas surprize, ke la ekvilibra enkursigilo ofte "rompiĝas" kaj iel devas esti "revivigita" malproksime.

radiusoĈi tie estas pli facile priskribi la situacion per io kiel ĉi tiu deklaro de la kliento: “Ni volas malcentralizitan reton de hotspots, kiu funkcius sur ekipaĵoj, kies modelon oni ne scias antaŭe, per kanaloj, sed kiujn ni ankoraŭ ne konas. Ho, ni forgesis diri, ni ne nur volas montri reklamojn al klientoj, sed ankaŭ analizi ĉion ĉirkaŭ la hotspot instalejo. Ne, ni ankoraŭ ne scias kial, sed ni elpensos ĝin, ne hezitu, ni povis elpensi ĉi tiun ideon."

Kaj ni ne devas forgesi, ke pro multaj necertaj cirkonstancoj anticipe, administrado devas esti farata en ne-normaj kondiĉoj, kiam ni ne povas konekti al la enkursigilo rekte per ip: haveno kaj estas devigitaj simple atendi ke apero aperos de. ĝi. Se ni abstraktas, tiam la dialogo inter la servilo kaj la enkursigilo povas esti reprezentita jene:

  • Router: Saluton. Mi estas tia kaj tia enkursigilo, ĉu estas taskoj por mi?
  • Servilo: tia kaj tia enkursigilo, mi registris vin, ke vi vivas. Jen la defio: montri al mi la eligon de la komando ifconfig?
  • Router: Saluton. Mi estas tia kaj tia enkursigilo, la lastan fojon vi petis montri la rezulton de ifconfig, jen ĝi. Ĉu estas taskoj por mi?
  • Servilo: tia kaj tia enkursigilo, mi registris vin, ke vi vivas. Ne estas taskoj por vi.

La plej interesa demando estas: kiel fora enkursigilo povas sendi certan kvanton da informoj? En la lasta parto, mi priskribis, ke pro limigitaj rimedoj, la enkursigilo nur havas "nudigitan" wget, kiu funkcias nur per GET kaj nenio alia, ne ekzistas ftp-kliento aŭ buklo. Pli precize, ni bezonas universalan manieron, sendepende de la trajtoj de la bilda aro. Mi decidis uzi wget. Pli precize, kiel "haltis" - mi simple ne havis elekton 🙂

Tuj rezervoMia administradsolvo funkcias, ne tre limigita, kaj mi certas, ke ĝi estas malrekta, eĉ se ĝi konvenas al la plimulto de miaj klientoj. Kiel Eblus fari ĝin saĝe - verku malgrandan ilon, kiu sendas binarajn datumojn per POST tra la 80-a haveno. Enmetu ĝin (utilo) en la firmvaro de la enkursigilo kaj uzu bash por aliri ĝin. Sed la realo estas, ke: a) vi devas rapide b) vi verŝajne bezonas ĉion fari sur la ekzistanta "zoo de enkursigiloj" c) "ne malbonu!" - se la enkursigilo funkcias kaj plenumas aliajn taskojn, provu fari ŝanĝojn, kiuj ne influos la ekzistantan funkciojn.

Ni transiru al la efektivigo. Ni diru, ke via kliento volas de zabbix rekomenci la enkursigilon facile kaj nature, per "musklako". Hodiaŭ ni komencos la priskribon de la efektivigo per zabbix.
En la menuo "Administrado" -> "Skriptoj" aldonu novan skripton. Ni nomas ĝin "Reboot", kiel komandon ni skribas "php /usr/share/zabbix/reboot.php {HOST.HOST}"

Fora monitorado kaj kontrolo de Linukso/OpenWrt/Lede-aparatoj per haveno 80, daŭris

Sekva: Menuo "Monitorado" -> "Lastaj datumoj" -> "Dekstre alklaku la deziratan gastiganton". Jen kiel la menuo aspektos post aldoni la skripton.

Fora monitorado kaj kontrolo de Linukso/OpenWrt/Lede-aparatoj per haveno 80, daŭris
Sekve ni metas la skripton reboot.php en la dosierujon /usr/share/zabbix (eble por vi estas alie, mi uzas la radikan dosierujon zabbixa).

Sekureca malgarantioPor klareco de klarigo en la skripto, mi uzas nur la identigilon de la enkursigilo, sed ne uzas la pasvorton. En la funkcianta versio, ĉi tio ne estas rekomendita! Kial mi faris tion: ĉar la granda demando estas kie stoki pasvortojn por enkursigiloj? En zabbixe mem en "inventaro"? Kontraŭdira praktiko. Kiel opcio: limigi eksteran aliron al la dosiero reboot.php mem

reboot.php dosiero

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

Fakte ĉio. La demando "kiel akiri la rezulton de la komanda ekzekuto de la aparato" restas malfermita. Ni konsideru la taskon uzante la ifconfig komandon kiel ekzemplon. La sekva komando povas esti sendita al la aparato:

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

, kie:
mesaĝo=`ifconfig` - ni atribuas la rezulton de la eligo de la komando ifconfig al la variablo $mesaĝo
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - nia a.php-skripto kiu registras enkursigilojn kaj ricevas mesaĝojn de ili
u=uzanto&p=pasvorto!&m=$mesaĝo - akreditaĵoj kaj la valoro de la demanda variablo m - asignas la enhavon de la $mesaĝa variablo
-O /tmp/out.txt - ni ne bezonas eligon al la /tmp/out.txt-dosiero ĉi-kaze, sed se ĉi tiu parametro ne estas specifita, wget ne funkcias

Kial ĉi tio funkcias malboneĈar ĝi estas ebla sekureca truo. la plej sendanĝera eraro kiu povas okazi estas se la eligo de via komando, ekzemple, enhavas la simbolon "&". Tial necesas filtri ĉion, kio estas sendita de la enkursigiloj kaj ĉion, kio venas al la servilo. Jes, mi hontas, vere. En mia defendo, mi povas nur skribi, ke la tuta artikolo estas dediĉita al kiel administri enkursigilojn kun nedifinita firmvaro, kun nedifinitaj komunikaj kanaloj.

Nu, mi tuŝis la estontecon: mi ankoraŭ ne eltrovis kiel reflekti la rezultojn (ekzemple, la rezulton de komanda ekzekuto) kiuj venas al la servilo per normaj zabbix-iloj.

Mi memorigas al vi, ke ĉiuj fontoj povas esti prenitaj el la Git-deponejo ĉe: github.com/BazDen/iotnet.online.git

fonto: www.habr.com

Aldoni komenton