Diaľkové monitorovanie a správa zariadení na báze Lunix/OpenWrt/Lede cez 80. port…

Ahojte, toto je moja prvá skúsenosť na Habre. Chcem napísať o tom, ako netradične spravovať sieťové zariadenia vo vonkajšej sieti. Čo znamená netradične: vo väčšine prípadov, na spravovanie zariadení vo vonkajšej sieti potrebujete:

  • Verejnú IP adresu. Alebo ak sa zariadenie nachádza za niekým NAT, tak verejnú IP a „presmerovaný“ port.
  • Tunel (PPTP/OpenVPN/L2TP+IPSec atď.) do centrálneho uzla, cez ktorý by bol dostupný.

Preto bude "môj bicykel" potrebný, keď štandardné metódy nefungujú, napríklad:

  1. Zariadenie sa nachádza za NAT a okrem bežného http (port 80) je všetko uzavreté. Úplne bežná situácia pre veľké federálne korporátne siete. Priradiť porty - môžu, ale nie hneď, nie rýchlo a nie pre vás.
  2. Nestabilný a/alebo „úzky“ komunikačný kanál. Malá rýchlosť, neustále straty. Bolestné a sklamanie pri pokuse zorganizovať tunel.
  3. Drahý komunikačný kanál, kde je doslova každý megabajt cenný. Napríklad satelitná komunikácia. Plus veľké oneskorenia a „úzka“ šírka pásma.
  4. Situácia, keď musíte „žonglovať“ s veľkým množstvom malých routerov, na ktorých je na jednej strane nainštalovaný OpenWrt/Lede na rozšírenie možností, a na druhej strane sú prostriedky (pamäť) routera ďaleko od dostatočných pre všetko.

Poznámka číslo jedna Čo bráni nainštalovať do USB portu routera „flashku“ a rozšíriť pamäť routera?

Najčastejšie sú požiadavky na cenu riešenia celkovo, ale niekedy hrá kľúčovú úlohu aj formát. Napríklad, na objekte je TP-Link ML3020, jeho jediný USB port je použitý na 2G/3G modem, všetko to je zabalené v nejakom malom plastovom puzdre a umiestnené niekde vysoko (na stožiari), ďaleko (v poli, 30 km od najbližšej základnej stanice mobilného operátora). Áno, môžete pripojiť USB hub a rozšíriť počet portov, ale skúsenosti ukazujú, že je to objemné a nespolehlivé.

Takže som sa pokúsil opísať moju typickú situáciu: „niekde ďaleko, stojí veľmi dôležitý, osamelý a malý router na Linuxe. Dôležité je vedieť aspoň raz za deň, že je „živý“ a v prípade potreby mu poslať príkazy, ako napríklad „slnečko, reštartuj sa!“

Prejdime k realizácii:

1) Na strane routera pomocou cron-u každých 5/10/1440 minút, alebo kedykoľvek je potrebné odoslať http-žiadosti na server pomocou wget, výsledok požiadavky uložiť do súboru, súbor spraviť spustiteľným a vykonať ho.

Moja linka v cron-e vyzerá približne takto:

Súbor /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

, kde:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — doména môjho servera. Hneď poviem: áno, môžete uviesť aj konkrétnu ip-adresu servera, my sme tak robili, pokiaľ naše štátne orgány, v spravodlivom úsilí o boj s niečím, neuzavreli prístup k väčšine „cloudov“ DigitalOcean a Amazon. V prípade použitia symbolickej domény, pri vzniku podobného problému, môžete pokojne zdvihnúť záložné cloud a presmerovať naň doménu a obnoviť monitorovanie zariadení.

a.php — názov skriptu na strane servera. Áno, viem, že je to nesprávne nazývať premenné a názvy súborov jedným písmenom… navrhujem považovať to za spôsob, ako ušetriť niekoľko bajtov pri odosielaní požiadavky 🙂
u — meno používateľa, prihlasovacie údaje zariadenia
p — heslo
„-O /tmp/wa.sh“ — súbor na vzdialenom routeri, kam sa bude ukladať odpoveď servera, napríklad príkaz reboot.

Poznámka číslo dva: Aaaa, prečo používame wget, a nie curl, veď cez curl je možné odosielať https požiadavky a nie GET-om, ale POST-om? Aaaa preto, lebo ako v starom vtipe „Do krhly nE lezie!“. V zložení curl sú knižnice šifrovania veľké približne 2MB a preto je nepravdepodobné, že by ste mohli zostaviť obraz pre malý TP-LINK ML3020, napríklad. A s wget — prosím.

2) Na strane servera (mám to v Ubuntu) budeme používať Zabbix. Prečo: chcem, aby to bolo pekné (s grafmi) a pohodlné (odosielať príkazy cez kontextové menu). Zabbix má takú skvelú vec ako zabbix-agent. Cez agenta budeme volať php-skript na serveri, ktorý vráti informácie o tom, či sa náš router registroval v požadovanom časovom období. Na uchovávanie informácií o čase registrácie, príkazoch pre zariadenia, používam MySQL, samostatnú tabuľku users približne s takýmito poliami:

		VYTVOŘTE TABULKU `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;

Všechny zdroje lze stáhnout z Git repozitáře na adrese: https://github.com/BazDen/iotnet.online.git
Nyní PHP skripty umístěné na straně serveru (pro pohodlí je můžete umístit do složky /usr/share/zabbix/):

Soubor a.php:

set_charset("utf8");
	// Tu hľadáme náš router v tabuľke databázy
	$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();
		// Tu posielame routeru jeho úlohy
		echo $task;
		echo "n";
		echo $reg_task;
		// Tu zapisujeme čas odpovede a samotnú odpoveď routera
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// Úlohu sme poslali, teraz ju musíme odstrániť a po odstránení zaznamenať v logoch, že daná úloha bola vykonaná
		$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();
		}
		// Teraz musíme uložiť čas registrácie používateľa, jeho IP a správu od neho. Zatiaľ iba správu
		$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();
	}
	// Ak sme nenašli router v našej databáze, alebo jeho stav je "neaktívny", tak mu ... bude odoslaný príkaz reboot....
	// Prečo tak kruto? Pretože routery občas zmiznú a je to malý spôsob, ako potrestať "nových vlastníkov".
	else
	{
	echo "reboot";
	}
	$sql_users->close();
?>

Súbor agent.php (toto je skript volaného 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();
	// výmena údajov prebieha cez pole seq. Pri registrácii zariadenie nastavuje toto pole na "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// resetujeme $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();
?>		

No a posledný krok: zadefinovanie agenta a pridanie grafov.

Ak ešte nemáte nainštalovaný zabbix-agent, tak:

apt-get install zabbix-agent

Upravujeme súbor /etc/zabbix/zabbix_agentd.conf.

Pridáme riadok:

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

, kde:
test — názov nášho agenta
„php /usr/share/zabbix/agent.php user password“ — volaný skript so zadaním prihlasovacích údajov zariadenia.

Pridanie grafov: otvárame webové rozhranie zabbix, v menu vyberáme:
Nastavenie -> Uzly siete -> Vytvoriť uzol siete. Tu stačí uviesť názov uzla siete, jeho skupinu, predvolený rozhranie agenta:

Diaľkové monitorovanie a správa zariadení na báze Lunix/OpenWrt/Lede cez 80. port…

Teraz musíme tomuto uzlu siete pridať prvok údajov. Venujte pozornosť dvom poliam: „kľúč“ — to je presne ten parameter, ktorý sme uvádzali v súbore /etc/zabbix/zabbix_agentd.conf (v našom prípade je to test), a „interval aktualizácie“ — dávam 5 minút, pretože zariadenie sa na serveri registruje tiež raz za päť minút.

Diaľkové monitorovanie a správa zariadení na báze Lunix/OpenWrt/Lede cez 80. port…

A pridáme graf. Odporúčam zvoliť „Vyplnenie“ ako štýl vykreslenia.

Diaľkové monitorovanie a správa zariadení na báze Lunix/OpenWrt/Lede cez 80. port…

Na výstupe bude niečo veľmi stručné, napríklad takto:

Diaľkové monitorovanie a správa zariadení na báze Lunix/OpenWrt/Lede cez 80. port…

Na rozumnú otázku: „stálo to za to?“, odpoviem: no určite, pozrite sa na „príčiny vytvorenia bicykla“ na začiatku článku.

Ak môj prvý grafomanský pokus vzbudí záujem čitateľov, v nasledujúcich článkoch chcem opísať, ako zasielať príkazy na vzdialené zariadenia. Podarilo sa mi taktiež realizovať celú schému aj pre zariadenia na báze RouterOS (Mikrotik-ov).

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster