Monitorizarea și gestionarea de la distanță a dispozitivelor pe baza Lunix/OpenWrt/Lede prin portul 80...

Salut tuturor, acesta este prima mea experiență pe Habr. Vreau să scriu despre cum să gestionăm neobișnuit echipamentele de rețea într-o rețea externă. Ce înseamnă neobișnuit: în cele mai multe cazuri, pentru a gestiona echipamentele dintr-o rețea externă, aveți nevoie de:

  • O adresă IP publică. Sau, dacă echipamentul se află în spatele unui NAT, atunci o adresă IP publică și un port "forward".
  • Un tunel (PPTP/OpenVPN/L2TP+IPSec etc.) către nodul central, prin care ar putea fi accesat.

Prin urmare, "bicicleta mea" va fi necesară atunci când metodele standard nu vă sunt potrivite, de exemplu:

  1. Echipamentul se află în spatele unui NAT și, în afară de http obișnuit (portul 80), totul este închis. O situație destul de normală pentru rețelele corporative federale mari. Pot să deschidă porțile – dar nu imediat, nu rapid și nu pentru dumneavoastră.
  2. O conexiune instabilă și/sau "îngustă". Viteză mică, pierderi constante. Durere și dezamăgire atunci când încercați să organizați un tunel.
  3. Un canal de comunicație scump, unde literalmente fiecare megabyte contează. De exemplu, comunicațiile prin satelit. Plus întârzieri mari și lățime de bandă "îngustă".
  4. Situația în care trebuie să "jonglați" cu un număr mare de routere mici, pe care de o parte aveți instalat OpenWrt/Lede pentru a extinde posibilitățile, iar de cealaltă parte resursele (memoria) routerului nu sunt suficiente pentru toate.

Observație numărul unu Ce împiedică instalarea unei "flash" în portul USB al routerului pentru a extinde memoria routerului?

Cel mai adesea, cerințele pentru costul soluției în ansamblu, dar uneori joacă un rol cheie și factorul de formă. De exemplu, pe obiect se află un TP-Link ML3020, singurul său port USB este folosit pentru un modem 2G/3G, totul este înfășurat într-o carcasă mică din plastic și plasat undeva sus (pe un stâlp), departe-departe (în câmp, la 30 km de cea mai apropiată bază a operatorului de telefonie mobilă). Da, poate fi conectat un hub USB pentru a extinde numărul de porturi, dar experiența arată că este un lucru voluminos și nesigur.

Așadar, am încercat să vă descriu situația mea tipică: "undeva departe-departe, se află un router foarte important, solitar și mic, pe care rulează Linux. Este important să știu măcar o dată pe zi că este "viu" și, dacă este necesar, să-i trimit comenzi, de exemplu "soare, repornește!"

Să trecem la implementare:

1) Pe partea router-ului, la intervale de 5/10/1440 minute, sau oricând este necesar, trebuie să trimitem o cerere http către server folosind wget, rezultatul cererii salvându-se într-un fișier, făcând fișierul executabil și executându-l.

Linia mea din cron arată cam așa:

Fișierul /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

, unde:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — domeniul server-ului meu. Menționez imediat: da, se poate specifica și o adresă IP specifică a server-ului, noi am făcut așa înainte, până când statul nostru, în fervorul său de a lupta împotriva nu știu ce — a închis accesul la o mare parte din „cloud”-urile DigitalOcean și Amazon. În cazul utilizării unui domeniu simbolic, în cazul în care apare o astfel de problemă, veți putea ridica un cloud de rezervă, redirecționa domeniul către acesta și restabili monitorizarea dispozitivelor.

a.php — numele scriptului pe partea server-ului. Da, știu că nu este corect să numești variabilele și numele fișierelor cu o singură literă… propun să considerăm că astfel economisim câțiva bytes la trimiterea cererii 🙂
u — numele utilizatorului, loginul dispozitivului
p — parola
„-O /tmp/wa.sh“ — fișierul de pe router-ul îndepărtat, unde va fi salvat răspunsul server-ului, de exemplu comanda reboot.

Observație numărul doi: Aaaa, de ce folosim wget, nu curl, căci prin curl putem trimite cereri https și nu GET, ci POST? Aaa pentru că, ca în vechiul banc „În crăcile nu se înțeles”! Curl include biblioteci de criptare de aproximativ 2MB și din acest motiv, cu greu vei reuși să aduni o imagine pentru un TP-LINK ML3020 de exemplu. Dar cu wget — te rog.

2) Pe partea server-ului (la mine este Ubuntu) vom folosi Zabbix. De ce: vreau să fie frumos (cu grafice) și convenabil (să trimit comenzi prin meniul contextual). Zabbix-ul are o caracteristică foarte plăcută, numită agent zabbix. Prin agent, vom apela un script php pe server, care va returna informații despre înregistrarea router-ului nostru în perioada necesară. Pentru stocarea informațiilor despre timpul de înregistrare, comenzile pentru dispozitive, folosesc MySQL, o tabelă separată users cu aproximativ aceste câmpuri:

		CREATE TABLE `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, 
		  `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;

Toate sursele pot fi descărcate de pe Git-repository, la adresa: https://github.com/BazDen/iotnet.online.git
Acum scripturile PHP, plasate pe partea serverului (pentru comoditate pot fi puse în folderul /usr/share/zabbix/):

Fișierul a.php:

set_charset("utf8");
	// aici căutăm routerul nostru în tabelul bazei de date
	$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();
		// aici trimitem routerului sarcinile sale
		echo $task;
		echo "n";
		echo $reg_task;
		// aici scriem timpul de răspuns și răspunsul propriu-zis al routerului
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// sarcina a fost trimisă, acum trebuie să o eliminăm, iar după eliminare să marcăm în loguri că sarcina respectivă a fost finalizată
		$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();
		}
		// acum trebuie să păstrăm timpul înregistrării utilizatorului, IP-ul său și mesajul de la el. Deocamdată doar mesajul
		$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();
	}
	// dacă nu am găsit routerul în baza noastră de date sau statusul său este "inactiv", atunci...
	// De ce este atât de sever? Pentru că uneori routerele dispar, iar acesta este un mic mod de a pedepsi "noii proprietari".
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Fișierul agent.php (acesta este scriptul apelat al agentului 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();
	// schimbul de date are loc prin câmpul seq. La înregistrarea echipamentului, se setează acest câmp la "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// resetăm $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();
?>		

Iar etapa finală: configurarea agentului și adăugarea graficelor.

Dacă nu ați instalat încă zabbix-agent, atunci:

apt-get install zabbix-agent

Edităm fișierul /etc/zabbix/zabbix_agentd.conf.

Adăugăm următoarea linie:

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

, unde:
test - numele agentului nostru
"php /usr/share/zabbix/agent.php user password" - scriptul apelat cu datele de autentificare ale dispozitivului.

Adăugarea graficelor: deschidem interfața web zabbix, în meniu selectăm:
Configurare -> Noduri de rețea -> Crează nod de rețea. Aici este suficient să specificăm numele nodului de rețea, grupul său, interfața agentului implicit:

Monitorizarea și gestionarea de la distanță a dispozitivelor pe baza Lunix/OpenWrt/Lede prin portul 80...

Acum, pentru acest nod de rețea trebuie să adăugăm un element de date. Luați în considerare cele două câmpuri: „cheie” - este exact parametrul pe care l-am specificat în fișierul /etc/zabbix/zabbix_agentd.conf (în cazul nostru este test), și „interval de actualizare” - eu aleg 5 minute, deoarece echipamentul se înregistrează la server și o dată la cinci minute.

Monitorizarea și gestionarea de la distanță a dispozitivelor pe baza Lunix/OpenWrt/Lede prin portul 80...

Și adăugăm graficul. Recomand ca stil de desenare să aleg „Umplere”.

Monitorizarea și gestionarea de la distanță a dispozitivelor pe baza Lunix/OpenWrt/Lede prin portul 80...

Rezultatul este ceva foarte concis, de exemplu așa:

Monitorizarea și gestionarea de la distanță a dispozitivelor pe baza Lunix/OpenWrt/Lede prin portul 80...

La întrebarea legitimă: „A fost vrednic de efort?”, voi răspunde: bineînțeles, priviți „motivele creării bicicletei” la începutul articolului.

Dacă prima mea experiență de scriitor va stârni interesul cititorilor, atunci în articolele următoare vreau să descriu cum se pot trimite comenzi către echipamentele îndepărtate. De asemenea, am reușit să implementăm întreaga schemă și pentru dispozitive bazate pe RouterOS (Mikrotik).

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster