Monitoraġġ u kontroll mill-bogħod ta' apparati bbażati fuq Lunix/OpenWrt/Lede permezz tal-port 80...

Hello lil kulħadd, din hija l-ewwel esperjenza tiegħi fuq Habré. Irrid nikteb dwar kif timmaniġġja t-tagħmir tan-netwerk fuq netwerk estern b'mod mhux standard. X'ifisser mhux standard: fil-biċċa l-kbira tal-każijiet, biex timmaniġġja tagħmir fuq netwerk estern għandek bżonn:

  • Indirizz IP pubbliku. Ukoll, jew jekk it-tagħmir ikun wara n-NAT ta 'xi ħadd, allura IP pubbliku u port "mgħoddi".
  • Mina (PPTP/OpenVPN/L2TP+IPSec, eċċ.) għan-nodu ċentrali li permezz tiegħu tkun aċċessibbli.

Għalhekk, ser ikollok bżonn "ir-rota tiegħi" meta l-metodi standard ma jkunux adattati għalik, pereżempju:

  1. It-tagħmir jinsab wara NAT u, ħlief għall-http tas-soltu (port 80), kollox huwa magħluq. Din hija sitwazzjoni kompletament normali għal netwerks korporattivi federali kbar. Jistgħu jirreġistraw portijiet, iżda mhux minnufih, mhux malajr, u mhux għalik.
  2. Kanal ta' komunikazzjoni instabbli u/jew “dejjaq”. Veloċità baxxa, telf kostanti. Uġigħ u frustrazzjoni meta tipprova torganizza mina.
  3. Kanal ta 'komunikazzjoni għali, fejn litteralment kull megabyte jgħodd. Per eżempju, komunikazzjonijiet bis-satellita. Flimkien ma' dewmien twil u faxxa "dejqa".
  4. Sitwazzjoni meta għandek bżonn "juggle" numru kbir ta 'routers żgħar, li fuqhom, min-naħa waħda, OpenWrt/Lede huwa installat biex jespandu l-kapaċitajiet, u min-naħa l-oħra, ir-riżorsi (memorja) tar-router mhumiex biżżejjed għal kollox.

Innota numru drabi X'jipprevjenik milli tinstalla flash drive fil-port USB tar-router u tespandi l-memorja tar-router?

Ħafna drabi, ir-rekwiżiti huma għall-ispiża tas-soluzzjoni kollha kemm hi, iżda xi drabi l-fattur tal-forma għandu wkoll rwol ewlieni. Pereżempju, hemm TP-Link ML3020 fis-sit, l-uniku port USB tiegħu jintuża għal modem 2G/3G, dan kollu huwa mgeżwer f'xi tip ta 'każ żgħir tal-plastik u mqiegħed x'imkien għoli, għoli (fuq l-arblu), bogħod, bogħod (fil-għalqa, 30 km mill-eqreb stazzjon bażi tal-operatur mobbli). Iva, tista 'tipplaggja hub USB u tespandi n-numru ta' portijiet, iżda l-esperjenza turi li dan huwa ingombranti u mhux affidabbli.

Għalhekk, ippruvajt niddeskrivilek is-sitwazzjoni tipika tiegħi: “x'imkien 'il bogħod, il-bogħod, hemm router importanti ħafna, solitarju u żgħir li jħaddem Linux. Huwa importanti li tkun taf mill-inqas darba kuljum li huwa "ħaj" u, jekk meħtieġ, jintbagħtu kmandi lilu, pereżempju, "għasel, reboot!"

Ejja ngħaddu għall-implimentazzjoni:

1) Fuq in-naħa tar-router, permezz ta' cron, kull 5/10/1440 minuta, jew kull meta trid, trid tibgħat talba http lis-server billi tuża wget, issalva r-riżultat tat-talba għal fajl, tagħmel il-fajl eżekutibbli , u tesegwixxiha.

Il-linja cron tiegħi tidher xi ħaġa bħal din:

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

, fejn:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai huwa d-dominju tas-server tiegħi. Ħalli ninnota mill-ewwel: iva, tista 'tispeċifika indirizz IP speċifiku tas-server, konna nagħmlu dan sakemm l-istat tagħna, f'impuls ġust ta' ġlieda, se ngħid, ma nafx, imblokka l-aċċess għall-iljun sehem tas-“sħab” DigitalOcean u Amazon. Jekk tuża dominju simboliku, jekk iseħħ inċident bħal dan, tista 'faċilment tqajjem sħaba ta' backup, terġa 'tidderieġi d-dominju lejha u tirrestawra l-monitoraġġ tal-apparat.

a.php huwa l-isem tal-iskript tan-naħa tas-server. Iva, naf li huwa ħażin li nsemmi varjabbli u ismijiet ta' fajls bl-istess ittra... Nissuġġerixxi li b'dan il-mod niffrankaw ftit bytes meta nibagħtu talba :)
u - username, login tal-hardware
p - password
“-O /tmp/wa.sh” huwa fajl fuq ir-router remot fejn ir-rispons tas-server, pereżempju l-kmand tar-reboot, se jiġi ffrankat.

Innota numru tnejn: Ahhh, għaliex nużaw wget u mhux curl, għax permezz ta 'curl tista' tibgħat talbiet https mhux b'GET, iżda bil-POST? Ahhh għax, bħal fiċ-ċajta l-antika “NE titla’ fil-vażett!” curl jinkludi libreriji ta 'kodifikazzjoni ta' madwar 2MB fid-daqs u minħabba dan huwa improbabbli li inti tkun tista 'tiġbor immaġini għal TP-LINK ML3020 żgħir, pereżempju. U ma wget - jekk jogħġbok.

2) Fuq in-naħa tas-server (għandi Ubuntu) se nużaw Zabbix. Għaliex: Irrid li jkun sabiħ (bil-grafiċi) u konvenjenti (ibgħat kmandi permezz tal-menu tal-kuntest). Zabbix għandu ħaġa sabiħa daqs l-aġent zabbix. Permezz tal-aġent, aħna se nsejħu script PHP fuq is-server, li se jirritorna informazzjoni dwar jekk ir-router tagħna irreġistrax matul il-perjodu ta 'żmien meħtieġ. Biex taħżen informazzjoni dwar il-ħin tar-reġistrazzjoni, kmandi għall-apparati, nuża MySQL, utenti ta' tabella separati b'madwar l-oqsma li ġejjin:

		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;

Is-sorsi kollha jistgħu jitniżżlu mir-repożitorju Git fuq: https://github.com/BazDen/iotnet.online.git
Issa skripts PHP mqiegħda fuq in-naħa tas-server (għall-konvenjenza, jistgħu jitqiegħdu fil-folder /usr/share/zabbix/):

Fajl a.php:

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

Fajl Agent.php (dan huwa l-iskript tal-aġent zabbix imsejjaħ):

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

Ukoll, l-istadju finali: tirreġistra aġent u żżid l-iskedi.

Jekk għadek ma installajtx l-aġent zabbix, allura:

apt-get install zabbix-agent

Editja l-fajl /etc/zabbix/zabbix_agentd.conf.

Żid il-linja:

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

, fejn:
it-test huwa l-isem tal-aġent tagħna
“php /usr/share/zabbix/agent.php user password” - skript imsejjaħ li jindika d-dejta tar-reġistrazzjoni tal-apparat.

Żieda ta' mapep: iftaħ l-interface web zabbix, agħżel mill-menu:
Settings -> Network nodes -> Oħloq node tan-netwerk. Hawnhekk huwa biżżejjed li tispeċifika l-isem tal-host tan-netwerk, il-grupp tiegħu, u l-interface tal-aġent default:

Monitoraġġ u kontroll mill-bogħod ta' apparati bbażati fuq Lunix/OpenWrt/Lede permezz tal-port 80...

Issa rridu nżidu element tad-dejta għal dan in-node tan-netwerk. Oqgħod attent għal żewġ oqsma: "ċavetta" - dan huwa eżattament il-parametru li ktibna fil-fajl /etc/zabbix/zabbix_agentd.conf (fil-każ tagħna huwa test), u "intervall ta' aġġornament" - issettjah għal 5 minuti , għaliex u t-tagħmir huwa wkoll irreġistrat fuq is-server darba kull ħames minuti.

Monitoraġġ u kontroll mill-bogħod ta' apparati bbażati fuq Lunix/OpenWrt/Lede permezz tal-port 80...

Ukoll, ejja żid graff. Nirrakkomanda li tagħżel "Imla" bħala l-istil tar-rendi.

Monitoraġġ u kontroll mill-bogħod ta' apparati bbażati fuq Lunix/OpenWrt/Lede permezz tal-port 80...

L-output huwa xi ħaġa lakonika ħafna, pereżempju bħal din:

Monitoraġġ u kontroll mill-bogħod ta' apparati bbażati fuq Lunix/OpenWrt/Lede permezz tal-port 80...

Għall-mistoqsija raġonevoli: "kien worth it?", Se nwieġeb: ukoll, ovvjament, ara "raġunijiet għall-ħolqien ta 'rota" fil-bidu tal-artikolu.

Jekk l-ewwel esperjenza graphomaniac tiegħi tqajjem l-interess tal-qarrejja, allura fl-artikoli li ġejjin irrid niddeskrivi kif tibgħat kmandi lil tagħmir remot. Irnexxielna wkoll nimplimentaw l-iskema kollha għal apparati bbażati fuq RouterOS (Mikrotik).

Sors: www.habr.com

Żid kumment