Lunix/OpenWrt/Lede balstītu ierīču attālināta uzraudzība un vadība, izmantojot portu 80…

Sveiki visiem, šī ir mana pirmā pieredze Habré. Vēlos uzrakstīt par to, kā nestandarta veidā pārvaldīt tīkla iekārtas ārējā tīklā. Ko nozīmē nestandarta: vairumā gadījumu, lai pārvaldītu aprīkojumu ārējā tīklā, jums ir nepieciešams:

  • Publiskā IP adrese. Nu, vai, ja iekārta atrodas aiz kāda NAT, tad publiska IP un “pārsūtīts” ports.
  • Tunelis (PPTP/OpenVPN/L2TP+IPSec utt.) uz centrālo mezglu, caur kuru tas būtu pieejams.

Tāpēc jums būs nepieciešams “mans velosipēds”, kad standarta metodes jums nav piemērotas, piemēram:

  1. Aparatūra atrodas aiz NAT un, izņemot parasto http (ports 80), viss ir slēgts. Tā ir pilnīgi normāla situācija lieliem federālajiem korporatīvajiem tīkliem. Viņi var reģistrēt ostas, bet ne uzreiz, ne ātri un ne jums.
  2. Nestabils un/vai “šaurs” sakaru kanāls. Mazs ātrums, pastāvīgi zaudējumi. Sāpes un neapmierinātība, mēģinot sakārtot tuneli.
  3. Dārgs sakaru kanāls, kurā burtiski katrs megabaits ir svarīgs. Piemēram, satelīta sakari. Plus ilga kavēšanās un “šaura” josla.
  4. Situācija, kad nepieciešams “žonglēt” ar lielu skaitu mazu maršrutētāju, uz kuriem, no vienas puses, ir uzstādīts OpenWrt/Lede, lai paplašinātu iespējas, un, no otras puses, ar maršrutētāja resursiem (atmiņai) nepietiek. par visu.

Piezīme reizes Kas neļauj maršrutētāja USB portā instalēt zibatmiņas disku un paplašināt maršrutētāja atmiņu?

Visbiežāk prasības ir par risinājuma izmaksām kopumā, taču dažkārt galvenā loma ir arī formas faktoram. Piemēram, objektā atrodas TP-Link ML3020, tā vienīgais USB ports tiek izmantots 2G/3G modemam, tas viss ir ietīts kaut kādā mazā plastmasas maciņā un novietots kaut kur augstu, augstu (uz masta), tālu, tālu (laukā, 30 km no tuvākās mobilo sakaru operatora bāzes stacijas). Jā, jūs varat pievienot USB centrmezglu un paplašināt portu skaitu, taču pieredze liecina, ka tas ir apgrūtinoši un neuzticami.

Tāpēc es mēģināju jums aprakstīt savu tipisko situāciju: “kaut kur tālu, tālu ir ļoti svarīgs, vientuļš un mazs maršrutētājs, kurā darbojas Linux. Ir svarīgi vismaz reizi dienā zināt, ka viņš ir “dzīvs” un, ja nepieciešams, viņam tiek nosūtītas komandas, piemēram, “dārgā, pārstartējiet!”

Pāriesim pie ieviešanas:

1) Maršrutētāja pusē, izmantojot cron, ik pēc 5/10/1440 minūtēm vai kad vien vēlaties, serverim jānosūta http pieprasījums, izmantojot wget, pieprasījuma rezultāts jāsaglabā failā, jāpadara fails izpildāms , un izpildiet to.

Mana cron līnija izskatās apmēram šādi:

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

, kur:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai ir mana servera domēns. Uzreiz atzīmēšu: jā, var norādīt konkrētu servera IP adresi, mēs to darījām līdz mūsu valstij, taisnīgā cīņas impulsā, teikšu, nezinu, bloķējām piekļuvi lauvas DigitalOcean un Amazon “mākoņu” daļa. Ja izmantojat simbolisku domēnu, ja notiek šāds incidents, varat viegli izveidot rezerves mākoni, novirzīt domēnu uz to un atjaunot ierīces uzraudzību.

a.php ir servera puses skripta nosaukums. Jā, es zinu, ka ir nepareizi nosaukt mainīgos un failu nosaukumus ar vienu un to pašu burtu... Iesaku šādi ietaupīt dažus baitus, sūtot pieprasījumu :)
u - lietotājvārds, aparatūras pieteikšanās
p - parole
“-O /tmp/wa.sh” ir fails attālajā maršrutētājā, kurā tiks saglabāta servera atbilde, piemēram, atsāknēšanas komanda.

Otrā piezīme: Ahhh, kāpēc mēs lietojam wget nevis curl, jo caur curl var sūtīt https pieprasījumus nevis ar GET, bet ar POST? Ahhh, jo, kā vecajā jokā "NE kāpj burkā!" curl ietver aptuveni 2 MB lielas šifrēšanas bibliotēkas, un tāpēc ir maz ticams, ka jūs varēsiet izveidot attēlu, piemēram, mazam TP-LINK ML3020. Un ar wget - lūdzu.

2) Servera pusē (man ir Ubuntu) mēs izmantosim Zabbix. Kāpēc: es vēlos, lai tas būtu skaists (ar grafikiem) un ērts (sūtiet komandas, izmantojot konteksta izvēlni). Zabbix ir tik brīnišķīga lieta kā zabbix aģents. Ar aģenta starpniecību mēs serverī izsauksim PHP skriptu, kas atgriezīs informāciju par to, vai mūsu maršrutētājs ir reģistrējies vajadzīgajā laika periodā. Lai saglabātu informāciju par reģistrācijas laiku, komandām ierīcēm, es izmantoju MySQL, atsevišķu tabulu lietotājiem ar aptuveni šādiem laukiem:

		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;

Visus avotus var lejupielādēt no Git repozitorija: https://github.com/BazDen/iotnet.online.git
Tagad servera pusē ievietotie PHP skripti (ērtības labad tos var ievietot mapē /usr/share/zabbix/):

a.php fails:

<?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 fails (tas ir zabbix aģenta skripts):

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

Nu, pēdējais posms: aģenta reģistrēšana un grafiku pievienošana.

Ja vēl neesat instalējis zabbix aģentu, veiciet tālāk norādītās darbības.

apt-get install zabbix-agent

Rediģējiet failu /etc/zabbix/zabbix_agentd.conf.

Pievienojiet rindu:

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

, kur:
tests ir mūsu aģenta vārds
“php /usr/share/zabbix/agent.php lietotāja parole” - izsauktais skripts, kas norāda ierīces reģistrācijas datus.

Diagrammu pievienošana: atveriet zabbix tīmekļa saskarni, izvēlnē atlasiet:
Iestatījumi -> Tīkla mezgli -> Izveidojiet tīkla mezglu. Šeit pietiek norādīt tīkla resursdatora nosaukumu, tā grupu un noklusējuma aģenta saskarni:

Lunix/OpenWrt/Lede balstītu ierīču attālināta uzraudzība un vadība, izmantojot portu 80…

Tagad mums ir jāpievieno datu elements šim tīkla mezglam. Pievērsiet uzmanību diviem laukiem: “atslēga” - tieši tas ir parametrs, ko ierakstījām failā /etc/zabbix/zabbix_agentd.conf (mūsu gadījumā tas ir tests), un “atjaunināšanas intervāls” - es to iestatīju uz 5 minūtēm. , jo un iekārta arī tiek reģistrēta serverī reizi piecās minūtēs.

Lunix/OpenWrt/Lede balstītu ierīču attālināta uzraudzība un vadība, izmantojot portu 80…

Nu, pievienosim grafiku. Kā renderēšanas stilu iesaku izvēlēties “Aizpildīt”.

Lunix/OpenWrt/Lede balstītu ierīču attālināta uzraudzība un vadība, izmantojot portu 80…

Izvade ir kaut kas ļoti lakonisks, piemēram, šāds:

Lunix/OpenWrt/Lede balstītu ierīču attālināta uzraudzība un vadība, izmantojot portu 80…

Uz pamatotu jautājumu: “vai tas bija tā vērts?” atbildēšu: nu, protams, skatiet raksta sākumā “velosipēda izveides iemeslus”.

Ja mana pirmā grafomāna pieredze izraisa lasītāju interesi, tad turpmākajos rakstos vēlos aprakstīt, kā nosūtīt komandas uz attālo aprīkojumu. Mums arī izdevās ieviest visu shēmu ierīcēm, kuru pamatā ir RouterOS (Mikrotik).

Avots: www.habr.com

Pievieno komentāru