Kaugtöötlus ja seadmete juhtimine Lunix/OpenWrt/Lede pĂ”hjal 80. pordi kaudu


Tere kÔigile, see on minu esimene kogemus Habras. Soovin kirjutada, kuidas ebatavaliselt hallata vÔrguseadet vÀlises vÔrgus. Mis tÀhendab ebatavaliselt: enamikul juhtudel peate seadme vÀlises vÔrgus haldamiseks:

  • Avalik IP-aadress. VĂ”i kui seade asub kellegi NAT-i taga, siis avalik IP ja „edastatud“ port.
  • Tunnel (PPTP/OpenVPN/L2TP+IPSec jne) keskse sĂ”lme juurde, mille kaudu oleks vĂ”imalik juurde pÀÀseda.

SeetĂ”ttu on „minu jalgratas“ vajalik, kui standardsed meetodid ei sobi teile, nĂ€iteks:

  1. Seade on NAT-i taga ja peale tavapĂ€rase http (80. port) on kĂ”ik suletud. TĂ€iesti normaalne olukord suurtes föderaalsetes Ă€rivĂ”rkudes. Portide avamine — nad saavad, kuid mitte kohe, mitte kiiresti ja mitte teile.
  2. Ebatavaliselt stabiilsuseta ja/vĂ”i „kitsas“ sidekanal. Madal kiirus, pidevad kaotused. Valu ja pettumus tunnelite loomise katsetes.
  3. Kallis sidekanal, kus iga megabait on arvel. NĂ€iteks satelliitside. Pluss suured viivitused ja „kitsas“ ribalaius.
  4. Situatsioon, kus peate „kullama“ paljusid vĂ€ikseid ruutereid, millel ĂŒhelt poolt on installitud OpenWrt/Lede vĂ”imaluste laiendamiseks, kuid teiselt poolt jÀÀb ruuteri ressurssidest (mĂ€lu) kaugel puudu.

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

Enamasti on ĂŒldise lahenduse kulunĂ”uded, kuid mĂ”nikord mĂ€ngib olulist rolli ka vormifaktor. NĂ€iteks objektis on TP-Link ML3020, selle ainus USB-port on kasutusel 2G/3G modemiga, kĂ”ik on pakitud mingisse vĂ€ikesesse plastkorpusesse ja paigutatud kĂ”rgele (mastile), kaugele (vĂ€lja, 30 km kaugusel lĂ€himast mobiilside operaatori baasjaamast). Jah, USB-hubi saab sisse lĂŒlitada ja portide arvu suurendada, kuid kogemus nĂ€itab, et see on kohmakas ja ebamugav.

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

Liigume rakendamise juurde:

1) Ruuteri kĂŒljes cron-i kaudu iga 5/10/1440 minuti jĂ€rel vĂ”i igal ajal on vaja saata HTTP-pĂ€ring serverisse kasutades wget, pĂ€ringu tulemus salvestada faili, faili muuta tĂ€idetavaks ja see kĂ€ivitada.

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

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 — on minu serveri domeen. Teen kohe selgeks: jah, saate mĂ€rkida ka konkreetse serveri IP-aadressi, me tegime seda varem, kuni meie riik, Ă”iguslike impulsside taga vaatluse lĂ”petamiseks, sulges ligipÀÀsu suurele osale „pilvedest” DigitalOceanis ja Amazonis. Kui kasutate sĂŒmbolidomeeni, siis sellise olukorra tekkides saate rahulikult ĂŒles tĂ”sta varuplaani, suunata domeeni selle suunas ja taastada seadmete jĂ€lgimine.

a.php — skripti nimi serveri kĂŒljel. Jah, ma tean, et see on vale, nimeta muutujaid ja failide nimesid ĂŒhe tĂ€hega
 pakun vĂ€lja, et nii sÀÀstame pĂ€ringu saatmisel mĂ”ne bait.
u — kasutajanimi, seadme sisselogimine
p — parool
"-O /tmp/wa.sh" — fail eemaloleval ruuteril, kuhu serveri vastus salvestatakse, nĂ€iteks kĂ€sk reboot.

MĂ€rkus number kaks: Aaaa, miks me kasutame wget-d, mitte curl-i, ehkki curl-i kaudu saab saata HTTPS-pĂ€ringuid ja mitte ainult GET-i, vaid ka POST-i? Aaaa, sest nagu vanas anekdoodis „Kruubipudeli sisse ei mahu!”. Curl sisaldab krĂŒptimise teeke, mille suurus on umbes 2MB ja seetĂ”ttu on tĂ”enĂ€oliselt keeruline kokku panna pilti vĂ€ikesest TP-LINK ML3020-st nĂ€iteks. Aga wget-ga — palun.

2) Serveri kĂŒljel (minu puhul on see Ubuntu) kasutame Zabbixit. Miks: tahan, et see nĂ€eks hea vĂ€lja (graafikud) ja oleks mugav (saata kĂ€ske kontekstimenĂŒĂŒst). Zabbixil on selline meeldiv asi nagu zabbix-agent. Agentsi kaudu kutsume ĂŒles PHP-skripti serveris, mis naaseb teavet selle kohta, kas meie ruuter registreerus nĂ”utud ajavahemikul. Aja registreerimise teabe ja seadmete kĂ€skude salvestamiseks kasutan MySQL-i, eraldi tabelit users umbes selliste vĂ€ljadega:

		LOO KAA END ALLE USERIDID TABEL TUGEVATEKS (
		  `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, 
		  `last_ip` varchar(20) NOT NULL, 
		  `last_port` int(11) NOT NULL,
		  `task` text NOT NULL,
		  `reg_task` varchar(150) NOT NULL,
		  `last_task` text NOT NULL,
		  `response` text NOT NULL,
		  `seq` int(11) NOT NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

KÔik lÀhtekoodid on saadaval Git-repositoriumist aadressil: https://github.com/BazDen/iotnet.online.git
NĂŒĂŒd PHP-skripte, mis asuvad serveri poolel (mugavuse huvides saad neid panna ka kausta /usr/share/zabbix/):

Fail a.php:

set_charset("utf8");
	// siin otsime meie ruuterit 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 ruuterile tema ĂŒlesanded
		echo $task;
		echo "n";
		echo $reg_task;
		// siin kirjutame vastuse aja ja ise ruuteri vastuse
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// ĂŒlesanne saadetud, nĂŒĂŒd tuleb see kustutada, ja pĂ€rast kustutamist tĂ€histada logides, et see ĂŒlesanne on tĂ€idetud
		$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 sĂ”num tema poolt. Hetkel 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 ruuterit meie andmebaasist, vÔi tema staatus on "mitteaktiivne", siis saadetakse talle ... kÀskuta restart....
	// Miks nii karm? Sest ruuterid kaovad vahel, ja see on vÀike viis "uute omanike" Ôpetamiseks.
	else
	{
	echo "reboot";
	}
	$sql_users->close();
?>

Fail agent.php (see on kutsutud 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();
	// andmete vahetus toimub seq vÀlja kaudu. Seadme registreerimisel seade seab selle vÀlja "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// nullime $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 Zabbixi agent pole veel installitud, siis:

apt-get install zabbix-agent

Redigeerime 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 user password“ — kutsutav skript, mis sisaldab seadme registreerimise andmeid.

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

Kaugtöötlus ja seadmete juhtimine Lunix/OpenWrt/Lede pĂ”hjal 80. pordi kaudu


NĂŒĂŒd peame selle vĂ”rgusĂ”lme jaoks lisama andmeelemendi. Pange tĂ€hele kahte vĂ€lja: „vĂ”ti“ — see on see parameeter, mille me mÀÀrasime failis /etc/zabbix/zabbix_agentd.conf (meie puhul see on test), ja „uuendamise intervall“ — mina seadsin 5 minutit, kuna seade registreeritakse serverisse samuti kord 5 minuti jooksul.

Kaugtöötlus ja seadmete juhtimine Lunix/OpenWrt/Lede pĂ”hjal 80. pordi kaudu


Lisame graafiku. Soovitan joonistamisstiiliks valida „TĂ€ide“.

Kaugtöötlus ja seadmete juhtimine Lunix/OpenWrt/Lede pĂ”hjal 80. pordi kaudu


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

Kaugtöötlus ja seadmete juhtimine Lunix/OpenWrt/Lede pĂ”hjal 80. pordi kaudu


MĂ”istlikule kĂŒsimusele: „kas see oli seda vÀÀrt?“, vastan: muidugi, vaadake „kĂ”ikuvateks pĂ”hjusteks“ artikli alguses.

Kui minu esimene graafiku loomise kogemus tekitab huvi lugejates, siis jÀrgmistes artiklites plaanin kirjeldada, kuidas saata kÀske kaugseadmetele. Samuti Ônnestus kogu skeem realiseerida ka RouterOS (Mikrotik) seadmete jaoks.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster