Ferniwwerwaachung a Kontroll vu Lunix / OpenWrt / Lede baséiert Geräter iwwer Port 80…

Moien alleguer, dëst ass meng éischt Erfahrung op Habré. Ech wëll schreiwen iwwer wéi een Netzwierkausrüstung op engem externen Netzwierk op eng net-Standard Manéier verwalten. Wat heescht net-Standard: an de meeschte Fäll, fir Ausrüstung op engem externen Netzwierk ze managen, brauch Dir:

  • Ëffentlech IP Adress. Gutt, oder wann d'Ausrüstung hannert engem NAT vun engem ass, dann eng ëffentlech IP an e "Forward" Hafen.
  • Tunnel (PPTP / OpenVPN / L2TP + IPSec, etc.) op den zentrale Node duerch deen et zougänglech wier.

Dofir braucht Dir "mäi Vëlo" wann Standardmethoden Iech net passen, zum Beispill:

  1. D'Ausrüstung läit hannert NAT an, ausser den üblechen http (Port 80), ass alles zou. Dëst ass eng komplett normal Situatioun fir grouss Féderalen Firmennetzwierker. Si kënnen Häfen aschreiwen, awer net direkt, net séier, an net fir Iech.
  2. Onbestänneg an / oder "schmuel" Kommunikatiounskanal. Niddereg Geschwindegkeet, konstante Verloschter. Péng a Frustratioun wann Dir probéiert en Tunnel ze organiséieren.
  3. En deiere Kommunikatiounskanal, wou wuertwiertlech all Megabyte zielt. Zum Beispill, Satellit Kommunikatiounen. Plus laang Verspéidungen an eng "schmuel" Band.
  4. Eng Situatioun wou Dir eng grouss Zuel vu klenge Router muss "jongléieren", op där engersäits OpenWrt / Lede installéiert ass fir d'Fäegkeeten auszebauen, an op der anerer Säit d'Ressourcen (Erënnerung) vum Router net genuch sinn fir alles.

Note Zuel mol Wat verhënnert datt Dir e Flash Drive an den USB Hafen vum Router installéiert an d'Erënnerung vum Router erweidert?

Déi meescht Oft sinn d'Ufuerderunge fir d'Käschte vun der Léisung als Ganzt, awer heiansdo spillt de Formfaktor och eng Schlësselroll. Zum Beispill gëtt et en TP-Link ML3020 op der Plaz, säin eenzegen USB Hafen gëtt fir en 2G/3G Modem benotzt, dat alles ass an enger Aart vu klenge Plastikkëscht gewéckelt an iergendwou héich, héich (um Mast) gesat, wäit, wäit ewech (am Feld, 30 km vun der noosten Handy Bedreiwer Basis Gare). Jo, Dir kënnt en USB-Hub pluggen an d'Zuel vun den Ports ausbauen, awer d'Erfahrung weist datt dëst ëmständlech an onzouverlässeg ass.

Also, ech hu probéiert Iech meng typesch Situatioun ze beschreiwen: "irgendwo wäit, wäit ewech ass e ganz wichtegen, einsamen a klenge Router deen Linux leeft. Et ass wichteg op d'mannst eemol am Dag ze wëssen datt hien "lieweg" ass an, wann néideg, Kommandoe ginn him geschéckt, zum Beispill "Hunneg, nei starten!"

Loosst eis op d'Ëmsetzung goen:

1) Op der Router Säit, iwwer Cron, all 5/10/1440 Minutten, oder wann Dir wëllt, musst Dir eng http Ufro un de Server mat wget schécken, späichert d'Resultat vun der Ufro op eng Datei, maacht d'Datei ausféierbar , an ausféieren.

Meng Cron Linn gesäit sou eppes aus:

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

, wou:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai ass den Domain vu mengem Server. Loosst mech direkt notéieren: jo, Dir kënnt eng spezifesch IP Adress vum Server spezifizéieren, mir hunn dat gemaach, bis eise Staat, an engem gerechte Impuls vum Kampf, ech soen, ech weess et net, den Zougang zum Léiw blockéiert Undeel vun den DigitalOcean an Amazon "Wolleken". Wann Dir e symbolesche Domain benotzt, wann esou en Tëschefall geschitt ass, kënnt Dir ganz einfach eng Backup-Wollek erhéijen, d'Domain op et redirectéieren an d'Apparat Iwwerwaachung restauréieren.

a.php ass den Numm vum Server-Säit Skript. Jo, ech weess datt et falsch ass Variabelen an Dateinumm mam selwechte Buschtaf ze nennen ... Ech proposéieren datt mir op dës Manéier e puer Bytes späicheren wann Dir eng Ufro schécken :)
u - Benotzernumm, Hardware Login
p - Passwuert
"-O /tmp/wa.sh" ass eng Datei um Remote Router wou d'Serverreaktioun, zum Beispill de Reboot Kommando, gespäichert gëtt.

Notiz Nummer zwee: Ahhh, firwat benotze mir wget an net curl, well iwwer Curl kënnt Dir https Ufroe schécken net mat GET, mee mat POST? Ahhh well, wéi am ale Witz "NE klëmmt an d'Kroun!" Curl enthält Verschlësselungsbibliothéike vu ronn 2MB an der Gréisst an dofir ass et onwahrscheinlech datt Dir zum Beispill e Bild fir e klengen TP-LINK ML3020 zesummestellt. A mat wget - wann ech glift.

2) Op der Server Säit (ech hunn Ubuntu) wäerte mir Zabbix benotzen. Firwat: Ech wëll datt et schéin ass (mat Grafiken) a praktesch (Schéckt Kommandoen iwwer de Kontextmenü). Zabbix huet sou eng wonnerbar Saach wéi den Zabbix Agent. Duerch den Agent ruffe mir e PHP-Skript op de Server, deen d'Informatioun zréckginn iwwer ob eise Router während der erfuerderter Zäit registréiert ass. Fir Informatioun iwwer Umeldungszäit ze späicheren, Kommandoen fir Apparater, benotzen ech MySQL, eng separat Tabelle Benotzer mat ongeféier de folgende Felder:

		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, // IP последнего соединения 
		  `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;

All Quelle kënnen aus dem Git Repository erofgeluede ginn op: https://github.com/BazDen/iotnet.online.git
Elo PHP Scripten op der Server Säit gesat (fir d'Bequemlechkeet kënne se am /usr/share/zabbix/ Dossier plazéiert ginn):

a.php Datei:

<?php
// Получаем входные параметры: имя пользователя, пароль и сообщение от удаленного роутера
// Зачем нужен message ? Это способ ответа роутера, например если вы захотите посмотреть содержимое файла роутера
	$user=$_REQUEST['u'];
	$password=$_REQUEST['p'];
	$message=$_REQUEST['m'];
	
	// Подключаемся к нашей базе данных (MySQL)
	$conn=new mysqli("localhost","db_login","db_password","DB_name");
	if (mysqli_connect_errno()) {
		exit();
	}
	$conn->set_charset("utf8");
	// здесь ищем наш роутер в таблице базы данных
	$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();
		// здесь мы роутеру отправляем его задачи
		echo $task;
		echo "n";
		echo $reg_task;
		// вот здесь мы пишем время ответа и сам ответ роутера
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// задачу отправили, теперь надо ее удалить,а после удаления отметить в логах, что такая-то задача выполнена
		$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();
		}
		// теперь надо сохранить время регистрации пользователя, его айпи и сообщение от него. Пока только сообщение
		$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();
	}
	// если мы не нашли роутер в нашей базе данных, или его статус "неактивный", то ему ... будет отправлена команда reboot....
	// Почему так жестоко ? Потому что роутеры иногда пропадают, а это маленький способ проучить "новых владельцев". 
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Agent.php Datei (dëst ass de Skript vum Zabbix Agent genannt):

<?php
	// файл агента Zabbix. Данный скрипт обращается к таблице users и получает "1" если устройство регистрировалось с момента последнего обращения
	// user и password - учетные данные оборудования
	$user = $argv[1];
	$password = $argv[2];
	
	// подключаемся к нашей базе данных
	$conn=new mysqli("localhost","db_user","db_password","db_name");
	if (mysqli_connect_errno()) {
		exit();
		}
	$conn->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();
	// обмен данными происходит через поле seq. При регистрации железка ставит данное поле в "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// обнуляем $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();
?>		

Gutt, déi lescht Etapp: En Agent registréieren an Zäitplang derbäi.

Wann Dir den Zabbix Agent nach net installéiert hutt, dann:

apt-get install zabbix-agent

Änneren d'Datei /etc/zabbix/zabbix_agentd.conf.

Füügt d'Linn derbäi:

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

, wou:
Test ass den Numm vun eisem Agent
"php /usr/share/zabbix/agent.php Benotzer Passwuert" - e genannte Skript deen d'Aschreiwungsdaten vum Apparat ugeet.

Charts addéieren: öffnen d'zabbix Webinterface, wielt aus dem Menü:
Astellungen -> Netzknäppchen -> En Netzknuet erstellen. Hei ass et genuch fir den Numm vum Netzwierkhost, seng Grupp an d'Default Agent Interface ze spezifizéieren:

Ferniwwerwaachung a Kontroll vu Lunix / OpenWrt / Lede baséiert Geräter iwwer Port 80…

Elo musse mir en Dateelement fir dësen Netzknuet addéieren. Opgepasst op zwee Felder: "Schlëssel" - dat ass genau de Parameter dee mir an der Datei /etc/zabbix/zabbix_agentd.conf geschriwwen hunn (an eisem Fall ass et Test), an "Update Intervall" - ech setzen et op 5 Minutten , well an d'Ausrüstung gëtt och eemol all fënnef Minutten um Server registréiert.

Ferniwwerwaachung a Kontroll vu Lunix / OpenWrt / Lede baséiert Geräter iwwer Port 80…

Gutt, loosst eis eng Grafik addéieren. Ech recommandéieren "Fill" als Rendering-Stil ze wielen.

Ferniwwerwaachung a Kontroll vu Lunix / OpenWrt / Lede baséiert Geräter iwwer Port 80…

D'Ausgab ass eppes ganz lakonesch, zum Beispill wéi dëst:

Ferniwwerwaachung a Kontroll vu Lunix / OpenWrt / Lede baséiert Geräter iwwer Port 80…

Op déi raisonnabel Fro: "War et et wäert?", wäert ech äntweren: gutt, natierlech, kuckt "Grënn fir e Vëlo ze kreéieren" am Ufank vum Artikel.

Wann meng éischt graphomaniac Erfahrung den Interessi vun de Lieser erwächt, da wëll ech an de folgenden Artikelen beschreiwen wéi Dir Kommandoen op Fernausrüstung schéckt. Mir hunn et och fäerdeg bruecht de ganze Schema fir Geräter op Basis vu RouterOS (Mikrotik) ëmzesetzen.

Source: will.com

Setzt e Commentaire