Linux/OpenWrt/Lede seadmete kaugmonitorimine ja -haldamine 80. porta kaudu, jÀtk

See on artikli viimane osa, siin on algus habr.com/ru/post/445568
Viimati kirjutasin, kuidas seadmete jĂ€lgimist rakendada, nĂŒĂŒd rÀÀgime haldamisest. Kliendi "tehnikutega" aruteludes kohtan tihti piiratud arusaama, mida sellised vĂ€ikesed seadmed (madala mĂ€lu ja jĂ”udlusega) suudavad, paljud arvavad, et "kĂ”ige rohkem, mida me vajame, on saata reboot, tĂ”sisemate asjade jaoks saadame meeskonna".
Kuid praktika nĂ€itab, et see ei ole pĂ€ris tĂ”si. Siin on vĂ€ike nimekiri sagedastest tĂŒĂŒpilistest ĂŒlesannetest:

  1. VĂ”rgud diagnostika ja tĂ”rkeotsingu. Teie ruuteri ethernet-pordi taha elab tavaliselt teine seade, millel on oma sisemine IP-aadress. MĂ”nikord vĂ”ib seda "pingida". VĂ”i tunnelihaldus — kui ruuter, mis töötab 3G-mooduliga, ei hakka Ă€kki tunnelit ĂŒles, kuid me nĂ€eme ise ruuterit.
  2. SĂŒsteemi hooldus. Firmware vĂ€rskendamine, teenuseskriptide uuendamine.
  3. Ekvilibristika. Seda vĂ”iks nimetada "vÀÀnamiseks", kuid mĂ”iste "ekvilibrist" tĂ€hendab, tsiteerides, "tsirkusekunstniku vĂ”imet hoida tasakaalu ebastabiilses kehaasendis" — sobib paremini. Sellised olukorrad tekivad tellija eelarve piirangute tĂ”ttu. Allpool olen vĂ€lja toonud paar nĂ€idet, kuid kuna need ei ole otseselt seotud narratiiviga, tĂ”in need vĂ€lja eraldi mĂ€rkustes.

Wi-Fi jĂ€lgimineViimase viie aasta jooksul on see teema muutunud eriti aktuaalseks riiklike jaotussĂŒsteemide seas. Te jalutate rahulikult kauplustes, samas kui teie mobiiltelefon, millel on sisse lĂŒlitatud Wi-Fi, saadab pidevalt Probe Request pakette, et «kinnituda» mĂ”nda vĂ”rku, mis vĂ”imaldab analĂŒĂŒsida, kui sageli te sellesse poodi tulete, milliseid teid mööda jalutate jne. SeejĂ€rel kogutakse ja analĂŒĂŒsitakse andmeid, joonistatakse soojuskaarte ning juhid saavavad selliste piltide abil rahastust juhtkonnalt vĂ”i investoritelt. Ja seni, kuni
 "raha pole, aga te ikka pĂŒsige
", tuleb nĂ€idata tegelikku tulemust, lastakse mĂ€ngu vana hea laulusalm: "Jah, jah, hiljem me muidugi paigaldame kĂ”ik soovitud seadmed, aga praegu peab nĂ€itama Kliendile tulemust! Muide, unustasime mainida, et Klient lubas meie seadmeid oma hotspotiga Wi-Fi kaudu ĂŒhendada, aga ka ĂŒhiselt, nagu oleksime kĂŒlaliskliendid." Ja nii tuleb teha ekvilibristist ruutereid — tĂ”stetakse mitu WiFi alaliidest, millest ĂŒks ĂŒhendub hotspotiga, samas kui teine jĂ€lgib ĂŒmbritsevat keskkonda, tĂ”mbab tcpdumpi tulemusi ning ĂŒritab pakitud faili FTP-serverisse saata, riskides „liigne kurnatus“. Pole ĂŒllatav, et ekvilibristist ruuter puruneb sageli ning seda tuleb kuidagi eemalt "elustada".

RaadiusSiin on olukord lihtsam kirjeldada jĂ€rgmisel nĂ”udmisel: «Me tahame detsentraliseeritud hotspotide vĂ”rku, mis töötaks seadmetel, mille mudel ei ole eelnevalt teada, lĂ€bi kanalite, kuid millised need on, me veel ei tea. Ah, unustasime mainida, et me tahame mitte ainult reklaami klientidele kuvada, vaid analĂŒĂŒsida ka kĂ”ike hotspot'i paigalduskoha ĂŒmber. Ei, me veel ei tea, milleks me seda vajalikuks peame, aga leiame vĂ€lja, Ă€rge muretsege, me suutsime ju selle idee vĂ€lja mĂ”elda!»

Ja ei tohi unustada, et paljude mÀÀramatute eelnevalt mÀÀratlemata asjaolude tĂ”ttu peab juhtimine toimuma mittestandardses olukorras, kus me ei saa otse ruuterisse IP: porti ĂŒhenduda ja oleme sunnitud lihtsalt ootama tema aktiivsuse ilmingut. Kui abstraktselt vaadata, siis dialogi serveri ja ruuteri vahel vĂ”ib kujutada nii:

  • Ruuter: tere. ma olen selline ruuter, kas mul on ĂŒlesandeid?
  • Server: ruuter, ma olen sind registreerinud, et sa oled elus. Siin on ĂŒlesanne: nĂ€ita mulle ifconfig kĂ€su tulemust?
  • Ruuter: tere. ma olen selline ruuter, eelmisel korral palusid sa nĂ€idata ifconfigi tulemust, siin see on. Kas mul on ĂŒlesandeid?
  • Server: ma router on registreeritud, et sa oled elus. Sul ei ole ĂŒlesandeid.

Selle huvitav kĂŒsimus: kuidas saab eemalolev ruuter saata teatud hulga teavet? Eelmises osas kirjeldasin, et ruuteri piiratud ressursside tĂ”ttu on seal ainult «lĂ”igatud» wget, mis töötab ainult lĂ€bi GET ja rohkem mitte midagi, ei ole ftp-klienti ega curl. TĂ€psemalt öeldes, vajame universaalset viisi, mis ei sĂ”ltu pildi koostamise omadustest. Peatusin wget'i kasutamise juures. TĂ€psemalt, kuidas «peatusin» — mul polnud lihtsalt valikut 🙂

Esiteks ĂŒks vĂ€ike mĂ€rkusMinu lahendus haldamiseks on töökindel, kĂŒll pigem piiratud ja olen kindel, et see ei ole tĂ€iuslik, isegi kui see sobib enamikule minu klientidest. Kuidas oleks mĂ”istlikum seda teha — kirjutada vĂ€ike utiliit, mis saadab porti 80 kaudu POST-iga binaardata. Lisada see (utiliit) ruuteri tarkvarasse ja kutsuda seda esile bash-i kaudu. Kuid reaalsus on see, et: a) peab olema kiire b) vĂ”ib-olla tuleb kasutada olemasolevat 'ruuteri loomaaeda' c) 'Ă€ra tee vigade!' — kui ruuter töötab ja tĂ€idab muid ĂŒlesandeid, pĂŒĂŒa teha muudatusi, mis ei mĂ”jutaks olemasolevat funktsionaalsust.

Liigume edasi rakendamise juurde. Oletame, et teie klient soovib zabbixist ruuteri taaskÀivitamist, et see oleks lihtne ja mugav, 'hiireklÔpsuga'. TÀna alustame rakenduse kirjeldust zabbixist.
Administratsiooni menĂŒĂŒs -> Skriptid lisame uue skripti. Nimeks paneme 'Reboot', kĂ€suks kirjutame 'php /usr/share/zabbix/reboot.php {HOST.HOST}'

Linux/OpenWrt/Lede seadmete kaugmonitorimine ja -haldamine 80. porta kaudu, jÀtk

Edasi: JĂ€lgimise menĂŒĂŒs -> Viimased andmed -> 'ParemklĂ”ps vajalikule vĂ”rgu sĂ”lmele'. Nii nĂ€eb menĂŒĂŒ vĂ€lja pĂ€rast skripti lisamist.

Linux/OpenWrt/Lede seadmete kaugmonitorimine ja -haldamine 80. porta kaudu, jÀtk
Seega paneme skripti reboot.php katalooge, mis asub /usr/share/zabbix (Teie puhul vÔib see olla teine, mina kasutan zabbixi juurkatalooge).

OhutusmĂ€rkusedSelguse huvides kasutan skriptis ainult ruuteri ID-d, kuid ei kasuta parooli. Tööversioonis ei soovitata nii teha! Miks nii tegin: suur kĂŒsimus on, kus hoida ruuterite paroole? Kas Zabbixis «inventarimaterjalides»? Vastuolu praktika. Ühe vĂ”imalusena: piirata juurdepÀÀsu vĂ€ljastpoolt failile reboot.php

Fail reboot.php

set_charset("utf8");
			
	// "Saadame" kĂ€sku reboot lĂ€bi muutes ĂŒlesande vĂ€lja tabelis users. Ülesande vĂ€lja saab saata ĂŒkskĂ”ik millise kĂ€su.
	$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();
?>

KĂŒsimus on selles, kuidas saada seadme poolt kĂ€skude tĂ€itmise tulemusi. Vaadake ĂŒlesannet, kasutades kĂ€sku ifconfig. Siin on nĂ€ide, mille 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 muutuja $message vÀÀrtuseks kĂ€sku ifconfig tĂ€itmise tulemus
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — meie skript a.php, mis registreerib ruutereid ja vĂ”tab neilt sĂ”numeid vastu
u=user&p=password!&m=$message — autentimise andmed ja muutuja m vÀÀrtus mÀÀratakse muutuja $message sisu jĂ€rgi
-O /tmp/out.txt — vĂ€ljund failiks /tmp/out.txt ei ole antud juhul vajalik, kuid kui seda parameetrit ei mÀÀrata, siis wget ei toimi

Miks see ei töötaKuna see on potentsiaalne turvaauk. KĂ”ige kahjutum viga, mis vĂ”ib juhtuda, on see, et teie kĂ€su vĂ€ljundis on nĂ€iteks mĂ€rk „&“. SeetĂ”ttu tuleb filtreerida kĂ”ik, mis saadetakse ruuteritest ja kĂ”ik, mis serverisse saabub. Jaa, mul on tĂ”esti piinlik. Kaitseks vĂ”in vaid öelda, et kogu artikkel on pĂŒhendatud sellele, kuidas hallata ruutereid, millel on ette teadmata tarkvara ja ette teadmata sidekanaleid.

Ja tulevikuks: ma ei ole veel aru saanud, kuidas zabbixi standardsete vahenditega kajastada tulemusi (nÀiteks kÀsu tÀitmise tulemust), mis serverisse saadetakse.

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

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster