Udaljeno praćenje i upravljanje uređajima baziranim na Lunix/OpenWrt/Lede putem 80. porta…

Pozdrav svima, ovo je moje prvo iskustvo na Habru. Želim pisati o tome kako neovisno upravljati mrežnom opremom u eksternoj mreži. Što znači neovisno: u većini slučajeva, za upravljanje opremom u eksternoj mreži potrebno vam je:

  • Javni IP-adresa. Ili, ako je oprema iza nečijeg NAT-a, tada javni IP i 'proknjižena' port.
  • TUnel (PPTP/OpenVPN/L2TP+IPSec itd.) do središnje točke, putem koje bi bila dostupna.

Stoga će vam 'moj bicikl' trebati kada vam standardne metode ne odgovaraju, na primjer:

  1. Oprema se nalazi iza NAT-a i osim uobičajenog http (port 80) — sve je zatvoreno. Sasvim normalna situacija za velike federalne korporativne mreže. Mogu napisati portove — ali ne odmah, ne brzo i ne za vas.
  2. Nestabilna i/ili 'uska' veza. Mala brzina, stalni gubici. Bol i razočaranje prilikom pokušaja organiziranja tunela.
  3. Skupa veza, gdje je svaki megabajt od velike važnosti. Na primjer, satelitska veza. Plus veliki latencije i 'uska' propusnost.
  4. Situacija u kojoj morate 'žonglirati' s velikim brojem malih usmjerivača, na kojima s jedne strane stoji OpenWrt/Lede za proširenje mogućnosti, a s druge strane resursi (memorija) usmjerivača nisu dovoljni za sve.

Napomena broj jedan Što sprječava da u USB-port usmjerivača umetnete 'flash' i proširite memoriju usmjerivača?

Najčešće su zahtjevi za troškovima rješenja u cjelini, ali ponekad ključnu ulogu igra i form-faktor. Na primjer, na objektu je postavljen TP-Link ML3020, njegov jedini USB-port koristi se za 2G/3G modem, sve to je umotano u neki mali plastični kućište i smješteno negdje visoko (na stupu), daleko (na terenu, 30 km od najbliže bazne stanice mobilnog operatera). Da, možete umetnuti USB-hub i povećati broj portova, ali iskustvo pokazuje da je to glomazno i nepouzdano.

Dakle, pokušao sam opisati svoju tipičnu situaciju: 'negdje daleko, nalazi se vrlo važan, usamljeni i mali usmjerivač pod upravljanjem Linuxa. Važno je znati barem jednom dnevno da je 'živ' i po potrebi mu slati komande, na primjer 'sunce, restartaj se!'

Pređimo na implementaciju:

1) Na strani usmjerivača, prema cron-u, svake 5/10/1440 minuta ili kad god je potrebno slati http zahtjev na server pomoću wget, rezultat zahtjeva spremati u datoteku, napraviti datoteku izvršnom i izvršiti je.

Moj cron redak izgleda otprilike ovako:

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

, gdje:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — domena mog servera. Odmah da napomenem: da, možete navesti i određenu ip adresu servera, mi smo to radili ranije, sve dok naše državne vlasti, u plemenitom porivu borbe protiv nečega što ne znam — nisu zatvorile pristup većini „oblaka“ DigitalOcean i Amazon. U slučaju korištenja simbolične domene, u slučaju takvih problema, moći ćete mirno pokrenuti rezervno oblak, preusmjeriti na njega domenu i obnoviti nadzor uređaja.

a.php — ime skripte na strani servera. Da, znam da nije ispravno, nazivati varijable i imena datoteka jednom slovom… predlažem da smatramo da tako štedimo nekoliko bajtova pri slanju zahtjeva 🙂
u — ime korisnika, prijava uređaja.
p — lozinka.
„-O /tmp/wa.sh“ — datoteka na udaljenom usmjerivaču, gdje će se spremati odgovor servera, na primjer naredba reboot.

Napomena broj dva: Aaaa, zašto koristimo wget, a ne curl, jer se preko curl može slati https zahtjeve i to ne samo GET, nego i POST? Aaaa zato što, kao u starom vicevu „U krnju nE lezi!“. U sastav curl ulaze knjižnice šifriranja veličine oko 2MB i stoga je malo vjerojatno da ćete moći sastaviti sliku za mali TP-LINK ML3020, na primjer. A s wget — nema problema.

2) Na strani servera (kod mene je to Ubuntu) koristit ćemo Zabbix. Zašto: želim da bude lijepo (s grafikonima) i zgodno (slati naredbe kroz kontekstni izbornik). Zabbix ima jednu divnu stvar, zabbix-agent. Kroz agenta ćemo pozvati php skriptu na serveru, koja će vraćati informacije o tome je li se naš usmjerivač registrirao u potrebnom vremenskom periodu. Za pohranu informacija o vremenu registracije, naredbama za uređaje, koristim MySQL, zasebnu tablicu korisnika s približno takvim poljima:

		KREIRAJ TABLICU `users` (
		  `id` varchar(25) NE MOŽE BITI NULL,
		  `passwd` varchar(25) NE MOŽE BITI NULL,
		  `description` varchar(150) NE MOŽE BITI NULL,
		  `category` varchar(30) NE MOŽE BITI NULL,
		  `status` varchar(10) NE MOŽE BITI NULL,
		  `last_time` varchar(20) NE MOŽE BITI NULL, // vrijeme zadnjeg povezivanja
		  `last_ip` varchar(20) NE MOŽE BITI NULL, // IP zadnjeg povezivanja 
		  `last_port` int(11) NE MOŽE BITI NULL, // port zadnjeg povezivanja
		  `task` text NE MOŽE BITI NULL, // zadatak koji dobiva router
		  `reg_task` varchar(150) NE MOŽE BITI NULL, // "redoviti" zadatak, ako želimo da se zadatak izvršava uvijek prilikom registracije
		  `last_task` text NE MOŽE BITI NULL, // log zadataka
		  `response` text NE MOŽE BITI NULL, // ovdje se zapisuje odgovor uređaja
		  `seq` int(11) NE MOŽE BITI NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Sve izvore možete preuzeti s Git-repozitorija, na adresi: https://github.com/BazDen/iotnet.online.git
Sada PHP skripte, koje se nalaze na strani poslužitelja (za praktičnost ih možete staviti u mapu /usr/share/zabbix/):

Datoteka a.php:

set_charset("utf8");
	// ovdje tražimo naš usmjerivač u tablici baze podataka
	$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();
		// ovdje šaljemo usmjerivaču njegove zadatke
		echo $task;
		echo "n";
		echo $reg_task;
		// ovdje zapisujemo vrijeme odgovora i sam odgovor usmjerivača
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// zadatak je poslan, sada ga trebamo izbrisati, a nakon brisanja označiti u logovima da je taj zadatak izvršen
		$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();
		}
		// sada trebamo sačuvati vrijeme registracije korisnika, njegov IP i poruku od njega. Za sada samo poruku
		$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();
	}
	// ako nismo pronašli usmjerivač u našoj bazi podataka, ili je njegov status "neaktivan", onda će mu biti poslana naredba reboot....
	// Zašto ovako strogo? Zato što usmjerivači ponekad nestaju, a to je mali način da se "novi vlasnici" nauče pameti.
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Datoteka agent.php (ovo je skripta pozvanog zabbix agenta):

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();
	// razmjena podataka se odvija putem polja seq. Tijekom registracije oprema postavlja ovo polje na "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// resetiramo $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();
?>		

I posljednji korak: evidentiranje agenta i dodavanje grafova.

Ako još niste instalirali zabbix-agent, učinite sljedeće:

apt-get install zabbix-agent

Uređujemo datoteku /etc/zabbix/zabbix_agentd.conf.

Dodajemo redak:

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

, gdje:
test — ime našeg agenta
„php /usr/share/zabbix/agent.php user password“ — pozivana skripta s podacima za registraciju uređaja.

Dodavanje grafova: otvaramo web sučelje zabbixa, u izborniku biramo:
Postavke -> Čvorovi mreže -> Stvori čvor mreže. Ovdje je dovoljno navesti ime čvora mreže, njegovu grupu, zadani agentov sučelje:

Udaljeno praćenje i upravljanje uređajima baziranim na Lunix/OpenWrt/Lede putem 80. porta…

Sada trebamo dodati element podataka za ovaj čvor mreže. Obratite pažnju na dva polja: „ključ“ — to je onaj parametar koji smo naveli u datoteci /etc/zabbix/zabbix_agentd.conf (u našem slučaju to je test), i „interval ažuriranja“ — postavljam ga na 5 minuta, jer se i oprema registrira na serveru također jednom svakih pet minuta.

Udaljeno praćenje i upravljanje uređajima baziranim na Lunix/OpenWrt/Lede putem 80. porta…

I dodajemo graf. Preporučujem kao stil prikaza odabrati „Ispunjavanje“.

Udaljeno praćenje i upravljanje uređajima baziranim na Lunix/OpenWrt/Lede putem 80. porta…

Na izlazu dobivamo nešto vrlo suvislo, na primjer ovako:

Udaljeno praćenje i upravljanje uređajima baziranim na Lunix/OpenWrt/Lede putem 80. porta…

Na razuman upit: „je li to bilo vrijedno?“, odgovaram: naravno, pogledajte „razloge za stvaranje bicikla“ na početku članka.

Ako će moje prvo grafomansko iskustvo izazvati interes čitatelja, u sljedećim člancima želim opisati kako slati naredbe na udaljenu opremu. Također je uspjelo realizirati cijelu shemu i za uređaje temeljen na RouterOS-u (Mikrotik-ov).

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster