Monitorimi dhe menaxhimi i pajisjeve të bazuara në Lunix/OpenWrt/Lede përmes portit 80...

TĂ« gjithĂ« pĂ«rshĂ«ndetje, ky Ă«shtĂ« pĂ«rvoja ime e parĂ« nĂ« HabrĂ«. Dua tĂ« shkruaj rreth menaxhimit jo standard tĂ« pajisjeve rrjetore nĂ« njĂ« rrjet tĂ« jashtĂ«m. ÇfarĂ« do tĂ« thotĂ« jo standard: nĂ« shumicĂ«n e rasteve, pĂ«r tĂ« menaxhuar pajisjet nĂ« rrjetin e jashtĂ«m do t'ju nevojitet:

  • NjĂ« adresĂ« IP publike. Ose, nĂ«se pajisja ndodhet pas ndonjĂ« NAT-i, atĂ«herĂ« njĂ« IP publike dhe port i 'shkaktuar'.
  • NjĂ« tunel (PPTP/OpenVPN/L2TP+IPSec etj.) deri nĂ« nyjĂ«n qendrore, me anĂ« tĂ« sĂ« cilĂ«s mund tĂ« aksesohet.

Prandaj, 'bicikleta ime' do t'ju nevojitet kur metodat standarde nuk ju përshtaten, për shembull:

  1. Pajisja është pas NAT-it dhe përveç http standard (portit 80) - të gjitha janë të mbyllura. Një situatë krejt normale për rrjetet e mëdha federale të korporatave. Mund të shkruajnë portat - por jo menjëherë, jo shpejt dhe jo për ju.
  2. Një kanal komunikimi i paqëndrueshëm dhe/ose 'ngushtë'. Shpejtësi e vogël, humbje të vazhdueshme. Dhimbje dhe zhgënjim gjatë përpjekjes për të organizuar një tunel.
  3. Një kanal komunikimi i shtrenjtë, ku çdo megabajt është kritik. Për shembull, lidhje satelitore. Plus vonesa të mëdha dhe një 'ngushtë' brez.
  4. Situata ku duhet të "xhongloni" shumë routera të vegjël, ku nga njëra anë është instaluar OpenWrt/Lede për të zgjeruar mundësitë, dhe nga ana tjetër, burimet (memoria) e routerit nuk mjafton gjithmonë për gjithçka.

ShĂ«nimi njĂ« ÇfarĂ« e pengon tĂ« vendosni njĂ« "flash disk" nĂ« portin USB tĂ« routerit pĂ«r tĂ« zgjeruar memorien e routerit?

Shpesh kërkesat për koston e zgjidhjes në tërësi janë vendimtare, por ndonjëherë luan një rol kyç edhe forma fizike. Për shembull, në një vend ndodhet TP-Link ML3020, porti i tij i vetëm USB përdoret për një modem 2G/3G, gjithçka është mbështjellë në ndonjë kuti plastike të vogël dhe është vendosur diku shumë lart (në një majë), larg shumë (në fushë, 30 km. nga stacioni më i afërt bazë të operatorit celular). Po, mund të vendosni një USB-hub për të zgjeruar numrin e porteve, por përvoja tregon se kjo është voluminoze dhe e pasigurt.

Pra, pĂ«rpiqem tĂ« pĂ«rshkruaj situatĂ«n time tipike: "diku larg, ndodhet njĂ« router shumĂ« i rĂ«ndĂ«sishĂ«m, i vetĂ«m dhe i vogĂ«l, nĂ«n menaxhimin e Linux. ËshtĂ« e rĂ«ndĂ«sishme tĂ« dimĂ« tĂ« paktĂ«n njĂ« herĂ« nĂ« ditĂ« se ai Ă«shtĂ« 'i gjallĂ«' dhe nĂ« rast nevoje t'i dĂ«rgojmĂ« komanda, pĂ«r shembull 'dielli, rindez!'.

Tani kalojmë në zbatimin:

1) Në anën e router-it, përdoroni cron çdo 5/10/1440 minuta, ose kurdoherë që është e nevojshme për të dërguar një kërkesë http në server me wget, rezultatet e kërkesës ruajini në një skedë, bëni skedën ekzekutueshme dhe ekzekutoni atë.

Rreshti im në cron duket përafërsisht kështu:

Skedari /etc/crontabs/root:

  */5 * * * * wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password" -O /tmp/wa.sh && chmod 777 /tmp/wa.sh && /tmp/wa.sh

, ku:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — domeni i serverit tim. TĂ« them menjĂ«herĂ«: po, mund tĂ« specifikoni edhe njĂ« adresĂ« ip konkrete tĂ« serverit, ne e bĂ«mĂ« kĂ«shtu mĂ« parĂ«, derisa shteti ynĂ«, nĂ« njĂ« pĂ«rpjekje tĂ« drejtĂ« pĂ«r tĂ« luftuar diçka qĂ« nuk e di — mbylli qasjen nĂ« njĂ« pjesĂ« tĂ« madhe tĂ« ‘cloud’-eve nga DigitalOcean dhe Amazon. NĂ« rastin e pĂ«rdorimit tĂ« njĂ« domene simbolike, nĂ« rast se ndodh njĂ« ngjarje e tillĂ«, do tĂ« jeni nĂ« gjendje tĂ« ngrini njĂ« cloud rezervĂ«, tĂ« ridrejtoni domenin atje dhe tĂ« riktheni monitorimin e pajisjeve.

a.php — emri i skriptit nĂ« anĂ«n e serverit. Po, e di qĂ« Ă«shtĂ« e gabuar tĂ« quash variablat dhe emrat e skedave me njĂ« shkronjë  e propozoni ta konsideroni se kĂ«shtu kursejmĂ« disa byte gjatĂ« dĂ«rgimit tĂ« kĂ«rkesĂ«s 🙂
u — emri i pĂ«rdoruesit, login i pajisjes
p — fjalĂ«kalimi
„-O /tmp/wa.sh“ — njĂ« skedar nĂ« routerin tuaj tĂ« largĂ«t, ku do tĂ« ruhet pĂ«rgjigjja e serverit, pĂ«r shembull komandĂ«s reboot.

ShĂ«nimi numĂ«r dy: Aaaa, pse pĂ«rdorim wget dhe jo curl, kur me curl mund tĂ« dĂ«rgojmĂ« kĂ«rkesa https dhe jo vetĂ«m GET, por edhe POST? Aaaa, sepse, si nĂ« anekdotĂ«n e vjetĂ«r, „Nuk hyhet nĂ« buqel!”. Curl pĂ«rmban libra kriptimi me njĂ« madhĂ«si rreth 2MB, dhe pĂ«r kĂ«tĂ« arsye nuk do t'ju pĂ«rkthejĂ« tĂ« krijoni njĂ« imazh pĂ«r TP-LINK ML3020, pĂ«r shembull. Por me wget — ju lutem.

2) Në anën e serverit (unë përdor Ubuntu) do të përdorim Zabbix. Pse: dua që të duket bukur (me grafikë) dhe të jetë e përshtatshme (të dërgoj komandat përmes menuve kontekstuale). Zabbix ka një gjë kaq të bukur si agjenti zabbix. Nëpërmjet agjentit do të thërrasim php-skriptin në serveri, i cili do të kthejë informacion nëse routeri ynë është regjistruar në periudhën e kërkuar. Për ruajtjen e informacionit në lidhje me kohën e regjistrimit, komandat për pajisjet, unë përdor MySQL, një tabelë të veçantë users me këto fusha:

		KRIJO TABELËN `users` (
		  `id` varchar(25) NUK LEJOHET,
		  `passwd` varchar(25) NUK LEJOHET,
		  `description` varchar(150) NUK LEJOHET,
		  `category` varchar(30) NUK LEJOHET,
		  `status` varchar(10) NUK LEJOHET,
		  `last_time` varchar(20) NUK LEJOHET, // koha e fundit e lidhjes
		  `last_ip` varchar(20) NUK LEJOHET, // IP e fundit e lidhjes 
		  `last_port` int(11) NUK LEJOHET, // porta e fundit e lidhjes
		  `task` text NUK LEJOHET, // detyra që merr routeri
		  `reg_task` varchar(150) NUK LEJOHET, // "detyrë e rregullt", nëse duam që detyra të kryhet gjithmonë gjatë regjistrimit
		  `last_task` text NUK LEJOHET, // log i detyrave
		  `response` text NUK LEJOHET, // këtu shkruhet përgjigjja e pajisjes
		  `seq` int(11) NUK LEJOHET
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Të gjithë origjinalët mund të merren nga repozitori Git, në adresën: https://github.com/BazDen/iotnet.online.git
Tani skenaret PHP, të vendosura në anën e serverit (për lehtësi mund t'i vendosni në dosjen /usr/share/zabbix/):

Skedari a.php:

set_charset("utf8");
	// këtu kërkojmë routerin tonë në tabelën e databazës
	$sql_users=$conn->prepare("SELECT task, reg_task, response, last_time FROM users WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->bind_result($task, $reg_task, $response, $last_time);
	$sql_users->execute();
	$sql_users->store_result();
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		// këtu ne dërgojmë detyrat e routerit
		echo $task;
		echo "n";
		echo $reg_task;
		// këtu shkruajmë kohën e përgjigjes dhe vetë përgjigjen e routerit
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// detyrën e dërguam, tani duhet ta fshijmë, dhe pas fshirjes të shënojmë në log që një detyrë e tillë është përfunduar
		$last_ip=$_SERVER["REMOTE_ADDR"];
		$last_port=$_SERVER["REMOTE_PORT"];
		$ts_last_conn_time=$last_time;
		$sql_users=$conn->prepare("UPDATE users SET task='', seq=1 WHERE (id=?);");
		$sql_users->bind_param('s', $user);
		$sql_users->execute();
		if (strlen($message)>1){
			$sql_users=$conn->prepare("UPDATE users SET response=?, seq=1 WHERE (id=?);");
			$sql_users->bind_param('ss', $response_history, $user);
			$sql_users->execute();
		}
		// tani duhet të ruajmë kohën e regjistrimit të përdoruesit, IP-në e tij dhe mesazhin nga ai. Ndërkohë vetëm mesazhin
		$ts_now=time();
		$sql_users=$conn->prepare("UPDATE users SET last_time=?, last_ip=?, last_port=? WHERE (id=?);");
		$sql_users->bind_param('ssss', $ts_now, $last_ip, $last_port, $user);
		$sql_users->execute();
	}
	// nëse nuk e gjetëm routerin në bazën tonë të të dhënave, ose statusi i tij është "inaktiv", atëherë do t'i dërgohet komanda reboot....
	// Pse kaq e ashpër? Sepse routerët ndonjëherë zhduken, dhe kjo është një mënyrë e vogël për të ndëshkuar "pronarët e rinj".
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Skedari agent.php (ky është skripti i agentit të thirrur të zabbix):

set_charset("utf8");
	$sql_users=$conn->prepare("SELECT seq FROM users WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->bind_result($seq);
	$sql_users->execute();
	$sql_users->store_result();
	// shkëmbimi i të dhënave ndodh nëpërmjet fushës seq. Gjatë regjistrimit, pajisja e vendos këtë fushë në "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// vendosim 0 në $seq.
	$sql_users=$conn->prepare("UPDATE users SET seq=0 WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->execute();
	$sql_users->close();
?>		

Dhe faza përfundimtare: konfigurimi i agentit dhe shtimi i grafikeve.

Nëse ende nuk e keni instaluar zabbix-agen, atëherë:

apt-get install zabbix-agent

Modifikoni skedarin /etc/zabbix/zabbix_agentd.conf.

Shtoni rreshtin:

UserParameter=test,php /usr/share/zabbix/agent.php user password

, ku:
test — emri i agentit tonĂ«
„php /usr/share/zabbix/agent.php user password“ — skripti i thirrur me specifikimin e kredencialeve tĂ« pajisjes.

Shtimi i grafikëve: hapni ndërfaqen web të zabbix, në menunë zgjidhni:
Konfigurimi -> Nyjet e rrjetit -> Krijo nyjën e rrjetit. Këtu mjafton të tregoni emrin e nyjës së rrjetit, grupin e saj, ndërfaqen e agentit për default:

Monitorimi dhe menaxhimi i pajisjeve të bazuara në Lunix/OpenWrt/Lede përmes portit 80...

Tani pĂ«r kĂ«tĂ« nyjĂ« rrjeti na nevojitet tĂ« shtojmĂ« njĂ« element tĂ« dhĂ«nash. Kushtojini vĂ«mendje dy fushave: „çelĂ«si“ — ky Ă«shtĂ« pikĂ«risht parametri qĂ« kemi shkruar nĂ« skedarin /etc/zabbix/zabbix_agentd.conf (nĂ« rastin tonĂ« Ă«shtĂ« test), dhe „intervali i pĂ«rditĂ«simit“ — unĂ« vendos 5 minuta, sepse edhe pajisjet regjistrohen nĂ« server njĂ« herĂ« nĂ« pesĂ« minuta.

Monitorimi dhe menaxhimi i pajisjeve të bazuara në Lunix/OpenWrt/Lede përmes portit 80...

Pra, shtojmĂ« grafikun. Rekomandoj tĂ« zgjidhni „Mbushja“ si stil tĂ« vizatimit.

Monitorimi dhe menaxhimi i pajisjeve të bazuara në Lunix/OpenWrt/Lede përmes portit 80...

Si rezultat, del diçka shumë tërheqëse, për shembull kështu:

Monitorimi dhe menaxhimi i pajisjeve të bazuara në Lunix/OpenWrt/Lede përmes portit 80...

NĂ« pyetjen e arsyeshme: „dhe a ia vlen?“, do tĂ« pĂ«rgjigjem: natyrisht, shikoni „arsyet pĂ«r krijimin e biçikletĂ«s“ nĂ« fillim tĂ« artikullit.

Nëse përvoja ime e parë grafikane do të ngjallë interesin e lexuesve, në artikujt e ardhshëm do të doja të përshkruaj se si të dërgoni komanda në pajisje të largëta. Po ashtu, arrita të realizoj të gjithë skemën edhe për pajisjet që përdorin RouterOS (Mikrotik).

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster