Далечинско следење и управување со уреди базирани на Linux/OpenWrt/Lede преку портата 80, продолжи

Ова е последниот дел од статијата, еве го почетокот habr.com/ru/post/445568
Последен пат пишував за тоа како го имплементирав мониторингот на уредот, сега ќе зборуваме за управување. Во дискусиите со „техничари“ од страната на клиентот, често наидувам на ограничена перцепција за можностите на таквите мали уреди (со ниски ресурси и перформанси на меморијата), многумина веруваат дека „најмногу што ни треба е да испратиме рестартирање, за нешто повеќе сериозно, ќе испратиме тим“.
Но, практиката покажува дека тоа не е сосема точно. Еве мал список на вообичаени типични задачи:

  1. Мрежна дијагностика и смена на проблеми. Зад етернет-портата на вашиот рутер обично има друг хардвер кој има своја внатрешна IP адреса. Понекогаш, можете (треба) да го „пингувате“. Или управување со тунели - ако тунелот одеднаш не се издигне на рутер кој работи преку 3G модем, но можеме да го видиме самиот рутер.
  2. Одржување на системот. Ажурирање на фирмверот, надградба на скрипта за услуги.
  3. Акт за балансирање. Ова може да се нарече „перверзија“, но концептот на „рамнотежа“ како што, цитирам, „способноста на циркузантот да одржува рамнотежа во нестабилна положба на телото“ - подобро се вклопува. Ваквите ситуации се јавуваат поради ограничениот буџет на клиентот. Подолу дадов неколку примери, но ... Не се директно поврзани со темата на приказната, ги ставам во белешките

Wi-Fi мониторингМодерна тема во последните пет години, главно меѓу федералните малопродажни синџири. Лежерно се шетате низ трговските подови, а вашиот мобилен телефон со вклучен Wi-Fi, во обид да се „залепи“ за некоја нишка на мрежата, редовно испраќа пакети Probe Request, кои може да се анализираат за да се пресмета вие: колку често доаѓате во оваа продавница, од кои причини?одите по траектории и така натаму. Потоа се собираат податоците, се анализираат, се цртаат топлински карти, а менаџерите „изнудуваат“ пари од менаџментот или инвеститорите за такви слики. Па, за сега.... „пари нема, ама издржи...“, а резултатот (вистинскиот) веќе треба да се покаже, почнува старата добра песна: „Да, да, тогаш секако ние ќе го инсталира cis и сè што сакате, но сега треба да му го покажеме резултатот на клиентот! Патем, заборавивме да кажеме дека Клиентот ни дозволи да ја поврземе нашата опрема со неговиот хотспот преку Wi-Fi, но на општа основа, исто како да сме гости-клиенти“. И затоа мораме да направиме рутери за балансирање - се подигаат неколку подинтерфејси за WiFi, од кои едниот се прилепува на жариштето, а вториот ја следи околината, френетично го прикачува резултатот tcpdump во себе, потоа ја спакува содржината на датотеката во архива и ризикува умирање од „прејадување“ се обидува да ја исплука содржината на FTP серверот. Не е изненадувачки што рутерот за балансирање често се „расипува“ и некако мора да се „реанимира“ од далечина.

радиусПолесно е да се опише ситуацијата овде со нешто како оваа изјава од клиентот: „Сакаме децентрализирана мрежа на жаришта кои ќе работат на опрема чиј модел не е однапред познат, преку канали, но кои сè уште не ги знаеме. О, заборавивме да кажеме, не само што сакаме да им прикажуваме реклами на клиентите, туку и да анализираме сè околу локацијата каде што е инсталирано жариштето. Не, сè уште не знаеме зошто, но ќе го сфатиме, не се сомневајте во тоа, успеавме да дојдеме до оваа идеја“.

И не смееме да заборавиме дека поради многу претходно непознати околности, контролата мора да се изврши во нестандардни услови, кога не можеме да се поврземе со рутерот директно преку IP: портата и сме принудени едноставно да чекаме активност од него. Ако се апстрахираме, дијалогот помеѓу серверот и рутерот може да се претстави вака:

  • Рутер: Здраво. Јас сум таков и таков рутер, има ли задачи за мене?
  • Сервер: рутер таков и таков, те регистрирав, дека си жив. Еве го предизвикот: покажи ми го резултатот од командата ifconfig?
  • Рутер: Здраво. Јас сум таков и таков рутер, последен пат побаравте да го покажете резултатот од ifconfig, еве го. Дали има некои задачи за мене?
  • Сервер: рутер таков и таков, те регистрирав, дека си жив. Нема задачи за вас.

Најинтересното прашање: како далечинскиот рутер може да испрати одредена количина на информации? Во последниот дел, опишав дека поради ограничените ресурси, рутерот има само „одземен“ wget, кој работи само преку GET и ништо друго; нема FTP клиент или curl. Поточно, потребен ни е универзален метод, без оглед на карактеристиките на склопувањето на сликата. Се решив да користам wget. Поточно, како „застанав“ - едноставно немав избор :)

Само одрекување од одговорностМоето решение за управување функционира, не е многу ограничено, и сигурен сум дека е криво, дури и ако им одговара на повеќето мои клиенти. Како можете да го направите тоа мудро - напишете мала алатка која испраќа POST бинарни податоци преку портата 80. Вклучете ја (употребата) во фирмверот на рутерот и пристапете до неа користејќи bash. Но, реалноста е дека: а) треба брзо б) веројатно треба да сториме сè на постоечката „зоолошка градина на рутери“ в) „не правиме штета!“ — ако рутерот работи и извршува други задачи, обидете се да направите промени што нема да влијаат на постоечката функционалност.

Ајде да преминеме на имплементација. Да речеме дека вашиот клиент сака да го рестартира рутерот од zabbix лесно и природно, со „кликнување на глувчето“. Денес ќе започнеме да ја опишуваме имплементацијата со Zabbix.
Во менито „Администрација“ -> „Скрипти“, додајте нова скрипта. Ние го нарекуваме „Reboot“, внесете „php /usr/share/zabbix/reboot.php {HOST.HOST}“ како команда

Далечинско следење и управување со уреди базирани на Linux/OpenWrt/Lede преку портата 80, продолжи

Следно: Мени „Мониторинг“ -> „Најнови податоци“ -> „Десен-клик на саканиот мрежен јазол“. Вака ќе изгледа менито по додавањето на скриптата.

Далечинско следење и управување со уреди базирани на Linux/OpenWrt/Lede преку портата 80, продолжи
Според тоа, ја ставаме скриптата reboot.php во директориумот /usr/share/zabbix (твојот може да биде различен, јас го користам root директориумот zabbixa).

Безбедносно одрекувањеЗа да биде појасно објаснувањето во скриптата, го користам само идентификаторот на рутерот, но не ја користам лозинката. Не е препорачливо да го направите ова во производствената верзија! Зошто го направив ова: затоа што големото прашање е каде да се складираат лозинките за рутерите? Во самиот zabbixe во „податоци за залиха“? Контроверзна практика. Алтернативно: ограничете го надворешниот пристап до самата датотека reboot.php

Датотеката reboot.php

<?php
	// присваиваем параметры с консоли переменным
	$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");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

Тоа е се. Останува отворено прашањето: „како да се добие резултат од извршување на команда од уредот“. Ајде да ја погледнеме задачата користејќи ја командата ifconfig како пример. Оваа команда може да се испрати до уредот:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

, каде што:
порака=`ifconfig` — го доделуваме резултатот од излезот на командата ifconfig на променливата $message
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — нашата a.php скрипта која ги регистрира рутерите и прима пораки од нив
u=корисник&p=лозинка!&m=$порака — ингеренциите и вредноста на променливата за барање m — ја доделува содржината на променливата $message
-О /tmp/out.txt - не ни треба излез во датотеката /tmp/out.txt во овој случај, но ако овој параметар не е наведен, wget не работи

Зошто ова не функционира?Бидејќи тоа е потенцијална безбедносна дупка. Најбезопасната грешка што може да се случи е ако, на пример, има знак „&“ во излезот од вашата команда. Затоа, потребно е да се филтрира и сè што е испратено од рутерите и сè што доаѓа до серверот. Да, срам ми е, навистина. Во моја одбрана, можам само да напишам дека целата статија е посветена на тоа како да управувате со рутери со однапред дефиниран фирмвер и канали за комуникација кои не се однапред дефинирани.

Па, почеток за иднината: сè уште не сум сфатил како да ги користам стандардните алатки zabbix за да ги рефлектираат резултатите (на пример, резултатот од извршувањето на командата) што доаѓаат на серверот.

Ве потсетувам дека сите извори може да се добијат од складиштето Git на: github.com/BazDen/iotnet.online.git

Извор: www.habr.com

Додадете коментар