Fjareftirlit og stjórn á Lunix/OpenWrt/Lede tækjum í gegnum tengi 80…

Halló allir, þetta er fyrsta reynsla mín á Habré. Mig langar að skrifa um hvernig á að stjórna netbúnaði á utanaðkomandi neti á óhefðbundinn hátt. Hvað þýðir óstöðluð: í flestum tilfellum, til að stjórna búnaði á ytra neti þarftu:

  • Almennt IP-tala. Jæja, eða ef búnaðurinn er á bak við NAT einhvers, þá opinber IP og „framsent“ tengi.
  • Göng (PPTP/OpenVPN/L2TP+IPSec, o.s.frv.) að miðlægum hnút þar sem það væri aðgengilegt.

Þess vegna þarftu „hjólið mitt“ þegar staðlaðar aðferðir henta þér ekki, til dæmis:

  1. Búnaðurinn er staðsettur fyrir aftan NAT og, fyrir utan venjulega http (port 80), er allt lokað. Þetta er algjörlega eðlilegt ástand fyrir stór alríkisfyrirtækjanet. Þeir geta skráð hafnir, en ekki strax, ekki fljótt og ekki fyrir þig.
  2. Óstöðug og/eða „þröng“ samskiptarás. Lítill hraði, stöðugt tap. Sársauki og gremju þegar reynt er að skipuleggja jarðgöng.
  3. Dýr samskiptarás, þar sem bókstaflega hvert megabæt skiptir máli. Til dæmis gervihnattasamskipti. Plús langar tafir og „þröngt“ band.
  4. Aðstæður þar sem þú þarft að „djúga“ fjölda lítilla beina, sem annars vegar er OpenWrt/Lede settur upp á til að auka getu, og hins vegar eru auðlindir (minni) beinisins ekki nóg fyrir allt.

Athugið fjölda sinnum Hvað kemur í veg fyrir að þú setur glampi drif í USB tengi beinisins og stækkar minni beinisins?

Oftast eru kröfurnar um kostnað við lausnina í heild sinni, en stundum gegnir formstuðullinn líka lykilhlutverki. Til dæmis er TP-Link ML3020 á staðnum, eina USB tengið hans er notað fyrir 2G/3G mótald, allt er þetta pakkað inn í einhvers konar lítið plasthylki og sett einhvers staðar hátt, hátt (á mastrinu), langt, langt í burtu (í akri, 30 km frá næstu grunnstöð farsímafyrirtækis). Já, það er hægt að tengja USB hub og stækka fjölda tengi, en reynslan sýnir að þetta er fyrirferðarmikið og óáreiðanlegt.

Svo ég reyndi að lýsa fyrir þér dæmigerðum aðstæðum mínum: „einhvers staðar langt, langt í burtu, er mjög mikilvægur, einmana og lítill beini sem keyrir Linux. Það er mikilvægt að vita að minnsta kosti einu sinni á dag að hann sé "lifandi" og ef nauðsyn krefur eru skipanir sendar til hans, til dæmis, "elskan, endurræstu!"

Við skulum halda áfram að útfærslunni:

1) Á leiðarhliðinni, í gegnum cron, á 5/10/1440 mínútna fresti, eða hvenær sem þú vilt, þarftu að senda http beiðni til netþjónsins með því að nota wget, vista niðurstöðu beiðninnar í skrá, gera skrána keyranlega , og framkvæma það.

Cron línan mín lítur eitthvað svona út:

Skrá /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

hvar:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai er lén þjónsins míns. Leyfðu mér að taka það strax fram: já, þú getur tilgreint tiltekið IP-tölu netþjónsins, við gerðum þetta áður þar til ríki okkar, í réttlátri baráttuhvöt, mun ég segja, ég veit það ekki, lokaði aðgangi að ljóninu. hlut í DigitalOcean og Amazon „skýjunum“. Ef þú notar táknrænt lén, ef slíkt atvik á sér stað, geturðu auðveldlega reist öryggisafrit, beina léninu á það og endurheimt eftirlit með tækinu.

a.php er nafnið á handritinu á netþjóninum. Já, ég veit að það er rangt að nefna breytur og skráarnöfn með sama bókstaf... Ég legg til að þannig sé sparað nokkur bæti við sendingu beiðni :)
u - notandanafn, innskráning vélbúnaðar
p - lykilorð
„-O /tmp/wa.sh“ er skrá á ytri beini þar sem viðbragð þjónsins, til dæmis endurræsaskipunin, verður vistuð.

Athugið númer tvö: Ahhh, af hverju notum við wget en ekki curl, því með curl er hægt að senda https beiðnir ekki með GET, heldur með POST? Ahhh vegna þess að eins og í gamla brandaranum "NE klifrar í krukkuna!" curl inniheldur um það bil 2MB að stærð dulkóðunarsöfn og vegna þessa er ólíklegt að þú getir sett saman mynd fyrir lítinn TP-LINK ML3020, til dæmis. Og með wget - takk.

2) Á miðlarahliðinni (ég er með Ubuntu) munum við nota Zabbix. Af hverju: Ég vil að það sé fallegt (með línuritum) og þægilegt (senda skipanir í gegnum samhengisvalmyndina). Zabbix er með svo dásamlegan hlut eins og zabbix umboðsmanninn. Í gegnum umboðsmanninn munum við hringja í PHP skriftu á þjóninum, sem mun skila upplýsingum um hvort beini okkar hafi verið skráð á tilskildum tíma. Til að geyma upplýsingar um skráningartíma, skipanir fyrir tæki, nota ég MySQL, sérstaka töflunotendur með um það bil eftirfarandi reiti:

		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;

Hægt er að hlaða niður öllum heimildum frá Git geymslunni á: https://github.com/BazDen/iotnet.online.git
Nú eru PHP forskriftir settar á netþjóninn (til þæginda er hægt að setja þau í /usr/share/zabbix/ möppuna):

a.php skrá:

<?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 skrá (þetta er handrit zabbix umboðsmannsins sem heitir):

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

Jæja, lokastigið: að skrá umboðsmann og bæta við áætlunum.

Ef þú hefur ekki enn sett upp zabbix umboðsmanninn, þá:

apt-get install zabbix-agent

Breyttu skránni /etc/zabbix/zabbix_agentd.conf.

Bættu við línunni:

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

hvar:
próf er nafn umboðsmanns okkar
„php /usr/share/zabbix/agent.php notandalykilorð“ - kallað forskrift sem gefur til kynna skráningargögn tækisins.

Bæta við myndritum: opnaðu zabbix vefviðmótið, veldu úr valmyndinni:
Stillingar -> Nethnútar -> Búðu til nethnút. Hér er nóg að tilgreina nafn nethýsilsins, hóp hans og sjálfgefið umboðsmannsviðmót:

Fjareftirlit og stjórn á Lunix/OpenWrt/Lede tækjum í gegnum tengi 80…

Nú þurfum við að bæta við gagnaeiningu fyrir þennan nethnút. Gefðu gaum að tveimur reitum: "lykill" - þetta er nákvæmlega færibreytan sem við skrifuðum í /etc/zabbix/zabbix_agentd.conf skránni (í okkar tilfelli er það próf), og "uppfærslubil" - ég stillti það á 5 mínútur , vegna þess að og búnaðurinn er líka skráður á netþjóninn einu sinni á fimm mínútna fresti.

Fjareftirlit og stjórn á Lunix/OpenWrt/Lede tækjum í gegnum tengi 80…

Jæja, við skulum bæta við línuriti. Ég mæli með því að velja „Fill“ sem flutningsstíl.

Fjareftirlit og stjórn á Lunix/OpenWrt/Lede tækjum í gegnum tengi 80…

Úttakið er eitthvað mjög lakonískt, til dæmis svona:

Fjareftirlit og stjórn á Lunix/OpenWrt/Lede tækjum í gegnum tengi 80…

Við sanngjörnu spurningunni: "var það þess virði?", mun ég svara: jæja, auðvitað, sjá "ástæður fyrir því að búa til reiðhjól" í upphafi greinarinnar.

Ef fyrsta grafómanísk reynsla mín vekur áhuga lesenda, þá vil ég í eftirfarandi greinum lýsa því hvernig á að senda skipanir í fjarbúnað. Okkur tókst líka að innleiða allt kerfið fyrir tæki byggð á RouterOS (Mikrotik).

Heimild: www.habr.com

Bæta við athugasemd