Kaugmonitorimine ja seadmete haldamine Lunixi/OpenWrt/Leedi pÔhistel seadmetel 80. pordi kaudu...

Tere kÔigile, see on minu esimene kogemus Habras. Soovin kirjutada, kuidas ebaoluliselt hallata vÔrgu seadmeid vÀlises vÔrgus. Mida tÀhendab ebaoluliselt: enamasti, vÔrgu seadmete haldamiseks vÀlises vÔrgus on vajalikud:

  • Publik IP-aadress. Noh, vĂ”i kui seadmed on kellegi NAT-i taga, siis avalik IP ja 'suunatud' port.
  • Tunnel (PPTP/OpenVPN/L2TP+IPSec jne.) keskse sĂ”lmeni, mille kaudu oleks juurdepÀÀs.

SeetÔttu on 'minu jalgratas' vajalik siis, kui standardsed meetodid ei sobi, nÀiteks:

  1. Seade asub NAT-i taga ja peale tavalise http (80. port) on kĂ”ik suletud. TĂ€iesti normaalne olukord suurtes föderaalses ettevĂ”tetes. Portide seadistamine — nad vĂ”ivad, aga mitte kohe, mitte kiiresti ja mitte teile.
  2. Ebastabiilne ja/vĂ”i „kitsas” sidekanal. VĂ€ike kiirus, pidevad kadud. Valu ja pettumus katsetades korraldada tunnelit.
  3. Kallis sidekanal, kus iga megabait on arvel. NĂ€iteks satelliitside. Pluss suured viivitused ja „kitsas” ribalaius.
  4. Seisund, kus peate â€žĆŸongleerima“ suure hulga vĂ€ikeste ruuterritega, millel ĂŒhel pool on installitud OpenWrt/Lede vĂ”imaluste laiendamiseks ja teisel pool ei ole ruuteri mĂ€lu kaugeltki piisavalt kĂ”igeks.

MĂ€rkus number ĂŒks Mis takistab USB-porti ruuterisse „mĂ€lu“ lisamast ja ruuteri mĂ€lu laiendamist?

Peamiselt on mĂ”istlike lahenduste nĂ”udmised seotud kuludega, kuid vahel on otsustav roll ka vormifaktoril. NĂ€iteks objektil on TP-Link ML3020, mille ainus USB-port on ĂŒhendatud 2G/3G modemiga, kĂ”ik see on pakitud mingisse vĂ€ikesesse plastikkorpusesse ja paigutatud kuskile kĂ”rgele (mastile), kaugele (vĂ€ljas, 30 km kaugusel lĂ€himast mobiilioperaatori baasjaamast). Jah, vĂ”ib ĂŒhendada USB-hubi ja suurendada portide arvu, kuid kogemus nĂ€itab, et see on mahukas ja ebausaldusvÀÀrne.

Nii et olen pĂŒĂŒdnud teile kirjeldada oma tĂŒĂŒpilist olukorda: „kusagil kaugel, seisab vĂ€ga oluline, ĂŒksi ja vĂ€ike Linuxi halduses ruuter. On oluline teada vĂ€hemalt kord pĂ€evas, et ta on „elus“ ja vajadusel saata talle kĂ€ske, nĂ€iteks „pĂ€ike, taaskĂ€ivita!“

Liigu edasi rakendamise juurde:

1) Ruuteripoolne cron-sĂŒsteem peab iga 5/10/1440 minuti tagant, vĂ”i igal muul ajal, saatma http-pĂ€ringu serverisse, kasutades wget’i. PĂ€ringu tulemus tuleb salvestada faili, teha fail tĂ€idetavaks ja see kĂ€ivitada.

Minu cron-rida nÀeb vÀlja umbes nii:

Fail /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

, kus:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — minu serveri domeen. Tahan kohe Ă€ra mĂ€rkida: jah, vĂ”ite kasutada ka konkreetset IP-aadressi, me tegime seda varem, kuni meie riik, Ă”ilses kĂ”igesĂŒvenemises, sulges juurdepÀÀsu suurele hulgale DigitalOcean’i ja Amazoni 'pilvedele'. Kui kasutatakse sĂŒmboolset domeeni ja juhtub midagi sellist, saate rahulikult luua varukoopiapilve, suunata domeeni sellele ja taastada seadmete jĂ€lgimise.

a.php — serveripoolne skriptinimi. Jah, ma tean, et see on vale, nimetada muutujaid ja failide nimesid ĂŒhe tĂ€hega
 pakun, et seelĂ€bi sÀÀstame paar baiti pĂ€ringu saatmisel 🙂
u — kasutajanimi, seadme sisselogimine
p — parool
„-O /tmp/wa.sh“ — fail eemalas ruuteris, kuhu salvestatakse serveri vastus, nĂ€iteks kĂ€sk reboot.

MĂ€rkus number kaks: Aaaa, miks me kasutame wget-i, mitte curl-i? Curl-iga saab saata https-pĂ€ringuid ja mitte ainult GET-iga, vaid ka POST-iga? Aaaa, sest nagu vanas anekdoodis öeldakse „VĂ€ga vĂ€ikesele tĂŒnnile ei mahu!“. Curl-i kuuluvad ĆĄifreerimisraamatukogud, mille suurus on umbes 2MB, seetĂ”ttu on tĂ”enĂ€oliselt raske teil kokku panna pilti vĂ€ikese TP-LINK ML3020 jaoks. Wget-iga on aga kĂ”ik vĂ”imalik.

2) Serveripool (mul on see Ubuntu) kasutame Zabbixit. Miks: tahan, et see oleks ilus (graafikute jaotamiseks) ja mugav (kĂ€skude saatmiseks kontekstimenĂŒĂŒst). Zabbixil on selline toredus nagu zabbix-agent. Ahn-agent kaudu kutsume vĂ€lja php-skripti aadressilt serveril, mis tagastab teavet selle kohta, kas meie ruuter registreerus nĂ”utud ajavahemikus. Registri aja, seadmete kĂ€skude teabe salvestamiseks kasutan MySQL-i, eraldi tabelit users umbes jĂ€rgmiste vĂ€ljadega:

		Loo tabel `users` (
		  `id` varchar(25) NOT NULL,
		  `passwd` varchar(25) NOT NULL,
		  `description` varchar(150) NOT NULL,
		  `category` varchar(30) NOT NULL,
		  `status` varchar(10) NOT NULL,
		  `last_time` varchar(20) NOT NULL, // viimane ĂŒhenduse aeg
		  `last_ip` varchar(20) NOT NULL, // viimane IP
		  `last_port` int(11) NOT NULL, // viimane sadam
		  `task` text NOT NULL, // ĂŒlesanne, mille ruuter saab
		  `reg_task` varchar(150) NOT NULL, // "regulaarne" ĂŒlesanne, kui soovime, et see tĂ€idetaks alati registreerimise ajal
		  `last_task` text NOT NULL, // ĂŒlesannete logi
		  `response` text NOT NULL, // siia kirjutatakse seadme vastus
		  `seq` int(11) NOT NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

KÔik lÀhtekoodid on saadaval Git-repositooriumis aadressil: https://github.com/BazDen/iotnet.online.git
NĂŒĂŒd PHP skriptid, mis paigutatakse serveripoolsele kĂŒljele (mugavuse huvides vĂ”ib need panna ka kausta /usr/share/zabbix/):

Fail a.php:

set_charset("utf8");
	// siin otsime meie routerit andmebaasi tabelist
	$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();
		// siin saadame routerile tema ĂŒlesanded
		echo $task;
		echo "n";
		echo $reg_task;
		// siin kirjutame vastuse aja ja routeri vastuse
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// ĂŒlesanne saadetud, nĂŒĂŒd tuleb see kustutada, ja pĂ€rast kustutamist mĂ€rkida logides, et see ĂŒlesanne on lĂ”petatud
		$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();
		}
		// nĂŒĂŒd tuleb salvestada kasutaja registreerimise aeg, tema IP ja tema sĂ”num. Praegu ainult sĂ”num
		$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();
	}
	// kui me ei leidnud routerit meie andmebaasist, vÔi selle staatus on "aktiivne", siis saadame... kÀsu reboot....
	// Miks nii karm? Sest vahetevahel kaduvad routerid ja see on vÀike viis "uusi omanikke" Ôpetada.
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Fail agent.php (see zabbix-agendi skript):

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();
	// andmevahetus toimub seq vÀlja kaudu. Registreerimisel seadmel mÀÀratakse see vÀli "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// lÀhtestame $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();
?>		

Ja viimane etapp: agendi seadistamine ja graafikute lisamine.

Kui sul ei ole veel zabbix-agensi, siis:

apt-get install zabbix-agent

Muudame faili /etc/zabbix/zabbix_agentd.conf.

Lisame rea:

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

, kus:
test — meie agendi nimi
„php /usr/share/zabbix/agent.php kasutajanimi parool“ — vĂ€ljakutsuv skript koos seadme kontoandmetega.

Graafikute lisamine: avame zabbixi veebiliidese, menĂŒĂŒs valime:
Seaded -> VÔrgusÔlmed -> Loo vÔrgusÔlm. Siin piisab, kui mÀrkida vÔrgusÔlme nimi, selle grupp, ja vaikimisi agentide liides:

Kaugmonitorimine ja seadmete haldamine Lunixi/OpenWrt/Leedi pÔhistel seadmetel 80. pordi kaudu...

NĂŒĂŒd peame sellele vĂ”rgusĂ”lmele lisama andmeelemendi. Pange tĂ€hele kahte vĂ€ljast: „vĂ”ti“ — see on parameeter, mille oleme mÀÀratlenud failis /etc/zabbix/zabbix_agentd.conf (meie puhul on see test), ja „uuendamise intervall“ — panen 5 minutit, kuna seadmed registreeritakse serveris samuti kord viie minuti jĂ€rel.

Kaugmonitorimine ja seadmete haldamine Lunixi/OpenWrt/Leedi pÔhistel seadmetel 80. pordi kaudu...

Ja lisame graafiku. Soovitan joonistusstiilina valida „TĂ€ide“.

Kaugmonitorimine ja seadmete haldamine Lunixi/OpenWrt/Leedi pÔhistel seadmetel 80. pordi kaudu...

LÔpptulemus on midagi vÀga lakoonilist, nÀiteks nii:

Kaugmonitorimine ja seadmete haldamine Lunixi/OpenWrt/Leedi pÔhistel seadmetel 80. pordi kaudu...

MĂ”istlikule kĂŒsimusele: „Kas see oli seda vÀÀrt?“, vastan: muidugi, vaadake „kĂ”rgemad pĂ”hjused jalgratta loomiseks“ artikli alguses.

Kui minu esimene graafomania kogemus huvitab lugejat, siis jĂ€rgnevates artiklites tahan ma kirjeldada, kuidas saata kĂ€ske kaugseadmestikule. Samuti on Ă”nnestunud ellu viia kogu skeem ka RouterOS (Mikrotik’id) seadmete jaoks.

Allikas: habr.com

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