Remote monitoring at pamamahala ng Linux/OpenWrt/Lede based na mga device sa pamamagitan ng port 80, ipinagpatuloy

Ito ang huling bahagi ng artikulo, narito ang simula habr.com/en/post/445568
Noong huling beses na nagsulat ako tungkol sa kung paano ko ipinatupad ang pagsubaybay sa device, ngayon ay pag-uusapan natin ang tungkol sa pamamahala. Sa mga talakayan sa "technician" sa panig ng Customer, madalas akong nakatagpo ng limitadong pang-unawa sa mga kakayahan ng gayong maliliit na device (na may mababang mapagkukunan ng memorya at pagganap), marami ang naniniwala na "ang pinaka kailangan namin ay magpadala ng reboot, para sa isang bagay na higit pa. grabe magpapadala tayo ng team” .
Ngunit ipinapakita ng pagsasanay na hindi ito ganap na totoo. Narito ang isang maliit na listahan ng mga karaniwang karaniwang gawain:

  1. Mga diagnostic at pag-troubleshoot ng network. Sa likod ng ethernet port ng iyong router ay karaniwang may isa pang piraso ng hardware na may sariling panloob na IP address. Minsan, maaari mong (dapat) "i-ping" ito. O pamamahala ng tunnel - kung ang tunel ay biglang hindi tumaas sa isang router na tumatakbo sa pamamagitan ng isang 3G modem, ngunit makikita natin ang router mismo.
  2. Pagpapanatili ng system. Pag-update ng firmware, pag-upgrade ng script ng serbisyo.
  3. Balanse act. Ito ay maaaring tawaging "perversion", ngunit ang konsepto ng "equilibrist" bilang, sinipi ko, "ang kakayahan ng isang circus performer na mapanatili ang balanse sa isang hindi matatag na posisyon ng katawan" - mas angkop. Ang ganitong mga sitwasyon ay lumitaw dahil sa limitadong badyet ng customer. Sa ibaba ay nagbigay ako ng ilang halimbawa, ngunit... Hindi sila direktang nauugnay sa tema ng kwento, inilagay ko sila sa mga tala

Pagsubaybay sa Wi-FiIsang naka-istilong paksa para sa huling limang taon, pangunahin sa mga pederal na retail chain. Malaya kang naglalakad sa mga palapag ng kalakalan, at ang iyong mobile phone na may Wi-Fi na naka-on, sa pagtatangkang "dumikit" sa ilang thread ng network, ay regular na nagpapadala ng mga packet ng Probe Request na maaaring suriin upang makalkula para sa iyo : gaano ka kadalas pumupunta sa tindahan na ito, sa anong mga kadahilanan? naglalakad ka sa mga trajectory at iba pa. Pagkatapos ang data ay kinokolekta, sinusuri, iginuhit ang mga mapa ng init, at ang mga tagapamahala ay "nangikil" ng pera mula sa pamamahala o mga namumuhunan para sa mga naturang larawan. Well, sa ngayon.... “walang pera, pero humawak ka...”, at kailangan nang ipakita ang (totoong) resulta, magsisimula ang magandang lumang kanta: “Oo, oo, pagkatapos siyempre tayo ay i-install ang cis at lahat ng gusto mo, ngunit ngayon kailangan naming ipakita sa Customer ang resulta! Siyanga pala, nakalimutan naming sabihin na pinahintulutan kami ng Customer na ikonekta ang aming kagamitan sa kanyang hotspot sa pamamagitan ng Wi-Fi, ngunit sa pangkalahatan, para kaming mga bisitang kliyente.” At kaya kailangan nating gumawa ng pagbabalanse ng mga router - maraming WiFi subinterfaces ang itinaas, ang isa ay kumakapit sa hotspot, at ang pangalawa ay sinusubaybayan ang kapaligiran, galit na galit na ina-upload ang resulta ng tcpdump sa sarili nito, pagkatapos ay i-pack ang mga nilalaman ng file sa isang archive at mga panganib. ang namamatay mula sa "sobrang pagkain" ay sumusubok na ilabas ang mga nilalaman sa FTP server. Hindi nakakagulat na ang pagbabalanse ng router ay madalas na "nasira" at kahit papaano ay kailangang "resuscitated" nang malayuan.

radiusMas madaling ilarawan ang sitwasyon dito sa isang bagay na tulad ng pahayag na ito mula sa customer: "Gusto namin ng isang desentralisadong network ng mga hotspot na gagana sa mga kagamitan na ang modelo ay hindi alam nang maaga, sa pamamagitan ng mga channel, ngunit kung alin ang hindi pa namin alam. Oh, nakalimutan naming sabihin, hindi lang namin gustong magpakita ng advertising sa mga kliyente, ngunit suriin din ang lahat sa paligid ng lokasyon kung saan naka-install ang hotspot. Hindi, hindi pa namin alam kung bakit, pero aalamin namin ito, huwag magduda, nagawa naming magkaroon ng ideyang ito."

At hindi natin dapat kalimutan na dahil sa maraming hindi kilalang mga pangyayari, ang kontrol ay dapat isagawa sa mga hindi karaniwang kondisyon, kapag hindi tayo makakonekta sa router nang direkta sa pamamagitan ng IP: port at napipilitang maghintay lamang para sa aktibidad mula dito. Kung i-abstract natin ang ating sarili, ang diyalogo sa pagitan ng server at ng router ay maaaring ilarawan tulad nito:

  • Ruta: Kamusta. Ako ay ganoon at ganoong router, mayroon bang anumang mga gawain para sa akin?
  • Server: router such and such, nirehistro kita, na buhay ka. Narito ang hamon: ipakita sa akin ang resulta ng ifconfig command?
  • Ruta: Kamusta. I am such and such a router, last time you asked to show the result of ifconfig, eto na. Mayroon bang anumang mga gawain para sa akin?
  • Server: router such and such, nirehistro kita, na buhay ka. Walang mga gawain para sa iyo.

Ang pinaka-kagiliw-giliw na tanong: paano magpadala ang isang remote na router ng isang tiyak na halaga ng impormasyon? Sa huling bahagi, inilarawan ko na dahil sa limitadong mga mapagkukunan, ang router ay mayroon lamang isang "stripped-down" na wget, na gumagana lamang sa pamamagitan ng GET at wala nang iba pa; walang FTP client o curl. Mas tiyak, kailangan namin ng isang unibersal na pamamaraan, anuman ang mga tampok ng pagpupulong ng imahe. Nakipag-ayos ako sa paggamit ng wget. Mas tiyak, kung paano ako "huminto" - wala lang akong pagpipilian :)

Disclaimer langGumagana ang aking solusyon sa pamamahala, hindi masyadong limitado, at sigurado akong baluktot ito, kahit na angkop ito sa karamihan ng aking mga customer. Paano mo ito magagawa nang matalino - magsulat ng isang maliit na utility na nagpapadala ng POST binary data sa pamamagitan ng port 80. Isama ito (ang utility) sa firmware ng router at i-access ito gamit ang bash. Ngunit ang katotohanan ay: a) kailangan nating mabilis b) malamang na kailangan nating gawin ang lahat sa umiiral na "zoo ng mga router" c) "huwag saktan!" — kung ang router ay gumagana at gumaganap ng iba pang mga gawain, subukang gumawa ng mga pagbabago na hindi makakaapekto sa umiiral na pag-andar.

Lumipat tayo sa pagpapatupad. Sabihin nating gusto ng iyong customer na i-reboot ang router mula sa zabbix nang madali at natural, sa pamamagitan ng "pag-click ng mouse." Ngayon ay magsisimula kaming ilarawan ang pagpapatupad sa Zabbix.
Sa menu na “Administration” -> “Scripts,” magdagdag ng bagong script. Tinatawag namin itong "Reboot", ilagay ang "php /usr/share/zabbix/reboot.php {HOST.HOST}" bilang isang command

Remote monitoring at pamamahala ng Linux/OpenWrt/Lede based na mga device sa pamamagitan ng port 80, ipinagpatuloy

Susunod: Menu “Pagsubaybay” -> “Pinakabagong data” -> “I-right-click sa gustong network node.” Ito ang magiging hitsura ng menu pagkatapos idagdag ang script.

Remote monitoring at pamamahala ng Linux/OpenWrt/Lede based na mga device sa pamamagitan ng port 80, ipinagpatuloy
Alinsunod dito, inilalagay namin ang reboot.php script sa /usr/share/zabbix na direktoryo (maaaring iba ang sa iyo, ginagamit ko ang zabbixa root directory).

Disclaimer sa KaligtasanUpang gawing mas malinaw ang paliwanag sa script, ginagamit ko lamang ang router id, ngunit hindi gumagamit ng password. Hindi inirerekomenda na gawin ito sa bersyon ng produksyon! Bakit ko ginawa ito: dahil ang malaking tanong ay kung saan mag-iimbak ng mga password para sa mga router? Sa zabbixe mismo sa "data ng imbentaryo"? Kontrobersyal na kasanayan. Bilang kahalili: higpitan ang panlabas na access sa reboot.php file mismo

I-reboot ang file.php

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

Iyon lang. Ang tanong ay nananatiling bukas: "kung paano makuha ang resulta ng pagpapatupad ng isang utos mula sa device." Tingnan natin ang gawain gamit ang ifconfig command bilang isang halimbawa. Maaaring ipadala ang command na ito sa device:

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

, kung saan:
message=`ifconfig` — itinalaga namin ang resulta ng ifconfig command output sa $message variable
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — ang aming a.php script na nagrerehistro ng mga router at tumatanggap ng mga mensahe mula sa kanila
u=user&p=password!&m=$mensahe — mga kredensyal at ang halaga ng variable ng kahilingan m — nagtatalaga ng mga nilalaman ng variable ng $message
-O /tmp/out.txt — hindi namin kailangan ng output sa file /tmp/out.txt sa kasong ito, ngunit kung hindi tinukoy ang parameter na ito, hindi gagana ang wget

Bakit hindi ito gumagana?Dahil ito ay isang potensyal na butas ng seguridad. Ang pinaka-hindi nakakapinsalang error na maaaring mangyari ay kung, halimbawa, mayroong "&" na character sa output ng iyong command. Samakatuwid, kinakailangang i-filter ang parehong lahat ng ipinadala mula sa mga router at lahat ng nanggagaling sa server. Oo, nahihiya talaga ako. Sa aking pagtatanggol, maaari ko lamang isulat na ang buong artikulo ay nakatuon sa kung paano pamahalaan ang mga router na may paunang natukoy na firmware at mga channel ng komunikasyon na hindi natukoy nang maaga.

Buweno, isang panimula para sa hinaharap: Hindi ko pa naiisip kung paano gumamit ng karaniwang mga tool ng zabbix upang ipakita ang mga resulta (halimbawa, ang resulta ng pagpapatupad ng isang utos) na dumarating sa server.

Ipinaaalala ko sa iyo na ang lahat ng mga mapagkukunan ay maaaring makuha mula sa Git repository sa: github.com/BazDen/iotnet.online.git

Pinagmulan: www.habr.com

Magdagdag ng komento