Kaugjuhtimine ja haldamine Linux/OpenWrt/Lede seadmetest 80. pordi kaudu, jÀtk

See on artikli viimane osa, siin on algus habr.com/et/post/445568
Eelmisel korral kirjutasin, kuidas rakendasin seadmete jĂ€lgimist, nĂŒĂŒd rÀÀgime juhtimisest. Aruteludes „tehnilise poole“ esindajatega tellija poolt kohtan sageli piiratud arusaama nende vĂ€ikeste seadmete (madala mĂ€lu- ja töötlusvĂ”imega) vĂ”imalustest; paljud arvavad, et „kĂ”ige rohkem, mida me vajame, on saata reboot, tĂ”sisemate probleemide jaoks saadame me meeskonna“.
Kuid praktika nĂ€itab, et see pole pĂ€ris nii. Siin on vĂ€ike nimekiri sagedastest tĂŒĂŒpilistest ĂŒlesannetest:

  1. VĂ”rgu diagnostika ja tĂ”rkeotsing. Teie ruuteri ethernet-porti taha "elab" tavaliselt teine seade, millel on oma sisemine IP-aadress. MĂ”nikord vĂ”ib seda "pingida". VĂ”i tunnelihalduse juhtimine — kui ruuter, mis töötab 3G-mooduli kaudu, ei tĂ”use Ă€kki tunnel, aga ruuterit ise nĂ€eme.
  2. SĂŒsteemi hooldus. Firmware'i vĂ€rskendamine, teenuse skriptide uuendamine.
  3. Ekvilibristika. Seda vĂ”iks nimetada „vÀÀritamiseks“, kuid mĂ”iste „ekvilibristika“, nagu tsiteerin, „tsirkuseartistide oskus hoida tasakaalu ebastabiilse kehaasendi juures“ on ilmselt sobivam. Sellised olukorrad tekivad tellija eelarve piirangute tĂ”ttu. Olen toonud allpool paar nĂ€idet, kuid kuna neil ei ole otsest seost jutu teemaga, olen need pannud mĂ€rkustesse

Wi-Fi jĂ€lgimineViimase viie aasta jooksul on see teema peamiselt olnud populaarne riikliku jaekaubanduse seas. Te jalutate rahulikult kaupluse vahel ja teie telefon Wi-Fi sisse lĂŒlitatuna pĂŒĂŒab pidevalt Â«ĂŒhenduda» mingi vĂ”rku, saates regulaarselt Probe Request pakette, mida saab analĂŒĂŒsida, et jĂ€lgida teid: kui sagedasti te sellele kauplusele kĂŒlastate, millistel trajektooridel liigute jne. SeejĂ€rel kogutakse andmed, analĂŒĂŒsitakse, joonistatakse soojuskaardid ja juhatajad nĂ”uavad selliste piltide tĂ”ttu raha oma juhtkonnalt vĂ”i investoritelt. Ja seni
 «raha ei ole, aga te hoidke end », samas peab juba nĂ€itama reaalset tulemust ja siseneb vana hea laulusalm «Jah, jah, hiljem me kindlasti paigaldame kĂ”ik soovitud seadmed, aga praegu tuleb klientidele tulemust nĂ€idata! Üks asi, et klient vĂ”imaldas meil oma seadmed oma vĂ”rku Wi-Fi kaudu ĂŒhendada, aga ĂŒhiste pĂ”himĂ”tete alusel, just nagu oleksime kĂŒlastajad». Nii tuleb hakata tegema ekviliibristest ruutereid — seadistatakse mitu WiFi alam-interfÀÀsi, millest ĂŒks ĂŒhendub hotspotiga ja teine jĂ€lgib ĂŒmbritsevat keskkonda, laadides vĂ€lkkiirusel tcpdumpi tulemusi enda sisse, seejĂ€rel pakib faili sisu arhiivi ja riskides Â«ĂŒle sööma», ĂŒritab sisu FTP-serverisse edastada. Pole ĂŒllatav, et ekviliibristest ruuterid kirjeldavad sageli «katkestusi» ja neid tuleb kuidagi kaugelt «elustada».

RadiusSiin on olukorda lihtsam kirjeldada kliendi jĂ€rgmise vĂ€itega: «Me tahame tsentraliseerimata hotspot-vĂ”rku, mis töötaks seadmetel, mille mudel on eelnevalt teadmata, kanalite kaudu, aga me ei tea veel, milliseid. Ah, unustasime öelda, et soovime mitte ainult klientidele reklaami nĂ€idata, vaid ka analĂŒĂŒsida kĂ”ike hotspoti paigaldamise ĂŒmber. Ei, me ei tea veel, milleks, aga me leiame selle vĂ€lja, Ă€rge kahtlege, me suutsime ju selle idee vĂ€lja mĂ”elda!»

Ja ei tohi unustada, et paljude ettenĂ€gematute asjaolude tĂ”ttu peab juhtimine toimuma ebatavalistes tingimustes, kui me ei saa ruuteriga otse IP kaudu ĂŒhendust vĂ”tta: port ja peame lihtsalt ootama aktiivsuse ilmnemist. Kui abstraktseks minna, siis serveri ja ruuteri vahelise dialooge saab esitada jĂ€rgmiselt:

  • Ruuter: tere. mina olen ruuter, kas mul on ĂŒlesandeid?
  • Server: Ruuter, selline nagu sina, registreerisin sind, et sa elad. Siin on ĂŒlesanne: nĂ€ita mulle ifconfig kĂ€su tulemust?
  • Ruuter: Tere. Mina olen ruuter, selline nagu sina, eelmisel korral palusid sa nĂ€idata ifconfigi tulemust, siin see on. Kas sul on minu jaoks ĂŒlesandeid?
  • Server: Ruuter, selline nagu sina, registreerisin sind, et sa elad. Ülesandeid ei ole.

KĂ”ige huvitavam kĂŒsimus: kuidas saab eemalolev ruuter saata teatud hulga teavet? Eelmises osas kirjeldasin, et ruuteril, piiratud ressursside tĂ”ttu, on ainult "lĂ”igatud" wget, mis töötab ainult GET kaudu ja mitte midagi muud, ei ole FTP-klienti, ei curl’i. TĂ€psemalt, meil on vaja universaalset viisi, sĂ”ltumatult kujunduse omadustest. Otsustasin kasutada wget’i. TĂ€psemalt, noh, kuidas öelda, sĂ”nasin "otsustasin" — mul polnud lihtsalt valikut 🙂

Koheselt selgitusMinu lahendus haldamiseks töötab, on vaid pisut piiratud ja ma olen kindel — vildakas, isegi kui see rahuldab enamikku minu klientidest. Kuidas vĂ”iks Ă”igesti teha — kirjutada vĂ€ike utiliit, mis saadab 80. pordi kaudu POST-iga binaarandmeid. Lisada see (utiliit) ruuteri mitteprogrammeeritavasse tarkvarasse ja sealt edasine suhtlemine bash’i kaudu. Kuid reaalsus on selline, et: a) peab olema kiire b) vĂ”ib-olla peab tegema see olemasoleval "loomade aed" ruuterite kogumil c) "Ă€ra korda!" — kui ruuter töötab ja tĂ€idab muid ĂŒlesandeid, pĂŒĂŒa teha muudatusi, mis ei mĂ”juta olemasolevat funktsionaalsust.

Liigume elluviimise juurde. Oletame, et teie klient soovib zabbixist ruuteri taaskÀivitada lihtsalt ja mugavalt, "hiireklÔpsuga". TÀna alustame elluviimise kirjeldusega zabbixist.
MenĂŒĂŒs «Haldus» -> «Skriptid» lisame uue skripti. Nimeks paneme «TaaskĂ€ivita», kĂ€suks kirjutame «php /usr/share/zabbix/reboot.php {HOST.HOST}»

Kaugjuhtimine ja haldamine Linux/OpenWrt/Lede seadmetest 80. pordi kaudu, jÀtk

Edasi: MenĂŒĂŒ «JĂ€lgimine» -> «Viimased andmed» -> «ParemklĂ”ps vajalikul vĂ”rgu sĂ”lmel». Nii nĂ€eb menĂŒĂŒ vĂ€lja pĂ€rast skripti lisamist.

Kaugjuhtimine ja haldamine Linux/OpenWrt/Lede seadmetest 80. pordi kaudu, jÀtk
Seega paneme skripti reboot.php katalooge /usr/share/zabbix (teie kataloog vÔib olla erinev, ma kasutan zabbixi juurkatalooge).

Selgitus turvalisuse huvidesSelgituseks kasutan skripti jaoks ainult ruuteri ID-d, kuid parooli ei kasuta. Tööversioonis ei ole see soovitatav! Miks ma nii tegin: sest suur kĂŒsimus on – kus hoida ruuterite paroole? Zabbixis „inventeerimisandmetes”? Vaieldav praktika. Üks vĂ”imalus: piirata vĂ€ljuvat ligipÀÀsu failile reboot.php

Fail reboot.php

set_charset("utf8");
			
	// „Saatke“ kĂ€sk reboot, muutes users tabelis task vĂ€lja. Task vĂ€lja saab saata mis tahes kĂ€sku.
	$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();
?>

Sellel juhul on kĂ”ik. Avatud jÀÀb kĂŒsimus, „kuidas saada seadme kĂ€skude tĂ€itmise tulemust“. Vaadakem ĂŒlesannet nĂ€ite pĂ”hjal kĂ€su ifconfig puhul. Sellise kĂ€su saab seadmele saata:

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

, kus:
message=`ifconfig` — me mÀÀrame muutujale $message kĂ€su ifconfig vĂ€ljundi tulemuse
wget „xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — meie skript a.php, mis registreerib ruuterid ja vĂ”tab neilt sĂ”numeid vastu
u=user&p=password!&m=$message — autentimistunnused ja muutuja m – mÀÀrab $message muutuja sisu
-O /tmp/out.txt — vĂ€ljund failisse /tmp/out.txt pole antud juhul vajalik, kuid kui seda parameetrit ei mÀÀrata, ei toimi wget

Miks see valesti töötabSest see on potentsiaalne turvaauk. KĂ”ige ohutum viga, mis vĂ”ib juhtuda, on see, kui teie kĂ€su vĂ€ljundis on nĂ€iteks sĂŒmbol „&“. SeetĂ”ttu tuleb filtreerida kĂ”ik, mis saadetakse ruuteritest ja kĂ”ik, mis serverisse tuleb. Jah, ma tunnen end tĂ”eliselt hĂ€benevat. Oma kaitseks vĂ”in vaid kirjutada – et kogu artikkel on pĂŒhendatud sellele, kuidas juhtida ruutereid, millel on eelnevalt mÀÀramata tarkvaraversioon ja teadmatud sidekanalid.

Ja tuleviku jaoks: ma ei ole veel aru saanud, kuidas Zabbixi tavaliste vahenditega kuvada tulemusi (nÀiteks kÀsu tÀitmise tulemus), mis serverisse saadetakse.

Tuletan meelde, et kÔik lÀhtekoodid on saadaval Git-repo aadressil: github.com/BazDen/iotnet.online.git

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster