Monitoring en kontrôle op ôfstân fan Lunix / OpenWrt / Lede-basearre apparaten fia poarte 80 ...

Hallo elkenien, dit is myn earste ûnderfining op Habré. Ik wol skriuwe oer hoe't jo netwurkapparatuer kinne beheare op in ekstern netwurk op in net-standert manier. Wat betsjut net-standert: yn 'e measte gefallen hawwe jo nedich om apparatuer op in ekstern netwurk te behearjen:

  • Iepenbier IP-adres. No, as de apparatuer efter de NAT fan ien is, dan in iepenbiere IP en in "trochstjoerde" haven.
  • Tunnel (PPTP / OpenVPN / L2TP + IPSec, ensfh.) nei it sintrale knooppunt dêr't it soe wêze tagonklik.

Dêrom sille jo "myn fyts" nedich wêze as standertmetoaden jo net passe, bygelyks:

  1. De apparatuer leit efter NAT en, útsein de gewoane http (haven 80), is alles sletten. Dit is in folslein normale situaasje foar grutte federale bedriuwsnetwurken. Se kinne registrearje havens, mar net direkt, net fluch, en net foar jo.
  2. Ynstabyl en / of "smel" kommunikaasjekanaal. Lege snelheid, konstante ferliezen. Pine en frustraasje as jo besykje in tunnel te organisearjen.
  3. In djoer kommunikaasjekanaal, dêr't letterlik elke megabyte telt. Bygelyks, satellyt kommunikaasje. Plus lange fertragingen en in "smel" band.
  4. In situaasje wêryn jo in grut oantal lytse routers moatte "jonggelje", wêrop oan 'e iene kant OpenWrt / Lede is ynstalleare om mooglikheden út te wreidzjen, en oan' e oare kant binne de boarnen (ûnthâld) fan 'e router net genôch foar alles.

Notysje oantal kearen Wat foarkomt dat jo in flash drive yn 'e USB-poarte fan' e router ynstallearje en it ûnthâld fan 'e router útwreidzje?

Meastentiids binne de easken foar de kosten fan 'e oplossing as gehiel, mar soms spilet de foarmfaktor ek in wichtige rol. Bygelyks, d'r is in TP-Link ML3020 op 'e side, de ienige USB-poarte wurdt brûkt foar in 2G / 3G-modem, dit alles is ferpakt yn in soarte fan lytse plestik koffer en pleatst earne heech, heech (op 'e mêst), fier, fier fuort (yn fjild, 30 km fan it tichtstby lizzende mobile operator basisstasjon). Ja, jo kinne in USB-hub ynstekke en it oantal havens útwreidzje, mar ûnderfining lit sjen dat dit omslachtich en ûnbetrouber is.

Dat, ik besocht myn typyske situaasje foar jo te beskriuwen: "ergens fier, fier fuort is d'r in heul wichtige, iensume en lytse router dy't Linux draait. It is wichtich om op syn minst ien kear deis te witten dat hy "libbet" en, as it nedich is, wurde opdrachten nei him stjoerd, bygelyks "leafde, opnij starte!"

Litte wy nei de ymplemintaasje gean:

1) Oan 'e routerkant, fia cron, elke 5/10/1440 minuten, of wannear jo wolle, moatte jo in http-fersyk nei de tsjinner stjoere mei wget, bewarje it resultaat fan it fersyk yn in bestân, meitsje it bestân útfierber , en útfiere it.

Myn cron line sjocht der sa út:

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

, dêr't:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai is it domein fan myn tsjinner. Ik sil daliks opmerke: ja, jo kinne in spesifyk IP-adres fan 'e tsjinner opjaan, wy diene dit eartiids oant ús steat, yn in rjochtfeardige ympuls fan striid, ik sil sizze, ik wit it net, tagong blokkearre ta it liuw syn oandiel fan 'e DigitalOcean en Amazon "wolken". As jo ​​in symboalysk domein brûke, as sa'n ynsidint bart, kinne jo maklik in reservekopywolk ophelje, it domein dernei omliede en apparaatmonitoring weromsette.

a.php is de namme fan it serverside-skript. Ja, ik wit dat it ferkeard is om fariabelen en bestânsnammen te neamen mei deselde letter... Ik stel foar dat wy op dizze manier in pear bytes bewarje by it ferstjoeren fan in fersyk :)
u - brûkersnamme, hardware login
p - wachtwurd
"-O /tmp/wa.sh" is in bestân op 'e router op ôfstân wêr't de serverantwurd, bygelyks it kommando opnij opstart, bewarre wurdt.

Opmerking nûmer twa: Ahhh, wêrom brûke wy wget en net curl, want fia curl kinne jo https-oanfragen net mei GET, mar mei POST ferstjoere? Ahhh om't, lykas yn 'e âlde grap "NE klimt yn 'e pot!" curl omfettet fersiferingsbiblioteken fan sawat 2MB yn grutte en dêrom is it net wierskynlik dat jo bygelyks in ôfbylding kinne gearstalle foar in lytse TP-LINK ML3020. En mei wget - asjebleaft.

2) Oan 'e serverkant (ik haw Ubuntu) sille wy Zabbix brûke. Wêrom: ik wol dat it moai is (mei grafiken) en handich (kommando's ferstjoere fia it kontekstmenu). Zabbix hat sa'n prachtich ding as de zabbix-agent. Troch de agint sille wy in PHP-skript op 'e tsjinner neame, dy't ynformaasje sil weromjaan oer oft ús router registrearre is yn' e fereaske perioade. Om ynformaasje te bewarjen oer registraasjetiid, kommando's foar apparaten, brûk ik MySQL, in aparte tabel brûkers mei sawat de folgjende fjilden:

		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;

Alle boarnen kinne wurde downloade fan it Git-repository op: https://github.com/BazDen/iotnet.online.git
No PHP-skripts pleatst op 'e serverkant (foar it gemak kinne se pleatst wurde yn' e map /usr/share/zabbix/):

a.php triem:

<?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-bestân (dit is it skript fan 'e zabbix-agent neamd):

<?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();
?>		

No, de lêste etappe: in agint registrearje en skema's tafoegje.

As jo ​​​​de zabbix-agent noch net ynstalleare hawwe, dan:

apt-get install zabbix-agent

Bewurkje de triem /etc/zabbix/zabbix_agentd.conf.

Foegje de rigel ta:

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

, dêr't:
test is de namme fan ús agent
"php /usr/share/zabbix/agent.php brûkerswachtwurd" - in oproppen skript dat de registraasjegegevens fan it apparaat oanjout.

Charts tafoegje: iepenje de zabbix-webynterface, selektearje út it menu:
Ynstellings -> Netwurkknooppunten -> Meitsje in netwurkknooppunt. Hjir is it genôch om de namme fan 'e netwurkhost, syn groep, en de standert agentynterface op te jaan:

Monitoring en kontrôle op ôfstân fan Lunix / OpenWrt / Lede-basearre apparaten fia poarte 80 ...

No moatte wy in gegevenselemint tafoegje foar dit netwurkknooppunt. Jou omtinken oan twa fjilden: "key" - dit is krekt de parameter dy't wy skreaun hawwe yn it /etc/zabbix/zabbix_agentd.conf-bestân (yn ús gefal is it test), en "update ynterval" - ik set it op 5 minuten , omdat en de apparatuer wurdt ek registrearre op de tsjinner ien kear yn de fiif minuten.

Monitoring en kontrôle op ôfstân fan Lunix / OpenWrt / Lede-basearre apparaten fia poarte 80 ...

No, lit ús in grafyk tafoegje. Ik advisearje om "Fill" te kiezen as de renderingstyl.

Monitoring en kontrôle op ôfstân fan Lunix / OpenWrt / Lede-basearre apparaten fia poarte 80 ...

De útfier is wat heul lakonich, bygelyks sa:

Monitoring en kontrôle op ôfstân fan Lunix / OpenWrt / Lede-basearre apparaten fia poarte 80 ...

Op de ridlike fraach: "wie it it wurdich?", Ik sil antwurdzje: goed, fansels, sjoch "redenen foar it meitsjen fan in fyts" oan it begjin fan it artikel.

As myn earste grafomanyske ûnderfining de belangstelling fan lêzers wekket, dan wol ik yn 'e folgjende artikels beskriuwe hoe't jo kommando's kinne stjoere nei apparatuer op ôfstân. Wy binne ek slagge om it hiele skema út te fieren foar apparaten basearre op RouterOS (Mikrotik).

Boarne: www.habr.com

Add a comment