Hilit nga pag-monitor ug pagkontrol sa Lunix / OpenWrt / Lede nga nakabase sa mga aparato pinaagi sa port 80…

Kumusta sa tanan, kini ang akong una nga kasinatian sa Habré. Gusto nakong isulat kung unsaon pagdumala ang mga kagamitan sa network sa usa ka eksternal nga network sa dili standard nga paagi. Unsa ang gipasabut sa dili standard: sa kadaghanan nga mga kaso, aron madumala ang mga kagamitan sa usa ka eksternal nga network kinahanglan nimo:

  • Pampublikong IP adres. Aw, o kung ang kagamitan naa sa luyo sa NAT sa usa ka tawo, unya usa ka publiko nga IP ug usa ka "gipasa" nga pantalan.
  • Tunnel (PPTP/OpenVPN/L2TP+IPSec, ug uban pa) ngadto sa sentral nga node diin kini mahimong ma-access.

Busa, kinahanglan nimo ang "akong bisikleta" kung ang mga standard nga pamaagi dili angay kanimo, pananglitan:

  1. Ang mga kagamitan nahimutang sa luyo sa NAT ug, gawas sa naandan nga http (port 80), ang tanan sirado. Kini usa ka hingpit nga normal nga kahimtang alang sa dagkong mga network sa korporasyon sa federal. Mahimo silang magparehistro sa mga pantalan, apan dili dayon, dili dayon, ug dili alang kanimo.
  2. Dili lig-on ug / o "hiktin" nga agianan sa komunikasyon. Ubos nga tulin, kanunay nga pagkawala. Kasakit ug kahigawad sa dihang mosulay sa pag-organisar og tunel.
  3. Usa ka mahal nga channel sa komunikasyon, diin literal ang matag megabyte nga hinungdanon. Pananglitan, ang komunikasyon sa satellite. Dugang nga taas nga mga paglangan ug usa ka "hiktin" nga banda.
  4. Usa ka sitwasyon kung kinahanglan nimo nga "mag-juggle" sa daghang mga gagmay nga mga router, diin, sa usa ka bahin, gi-install ang OpenWrt / Lede aron mapalapad ang mga kapabilidad, ug sa laing bahin, ang mga kahinguhaan (memorya) sa router dili igo. para sa tanan.

Matikdi ang gidaghanon sa mga higayon Unsa ang nagpugong kanimo sa pag-instalar og flash drive sa USB port sa router ug pagpalapad sa memorya sa router?

Kasagaran, ang mga kinahanglanon alang sa gasto sa solusyon sa kinatibuk-an, apan usahay ang porma nga hinungdan usab adunay hinungdan nga papel. Pananglitan, adunay usa ka TP-Link ML3020 sa site, ang bugtong USB port niini gigamit alang sa 2G/3G modem, kining tanan giputos sa usa ka gamay nga plastik nga kaso ug gibutang sa usa ka lugar nga taas, taas (sa palo), layo, layo (sa uma, 30 km gikan sa labing duol nga mobile operator base station). Oo, mahimo nimong ibutang ang usa ka USB hub ug palapdan ang gidaghanon sa mga pantalan, apan gipakita sa kasinatian nga kini lisud ug dili kasaligan.

Mao nga, gisulayan nako nga ihulagway kanimo ang akong naandan nga kahimtang: "sa usa ka lugar nga layo, layo, adunay usa ka hinungdanon, kamingaw ug gamay nga router nga nagdagan sa Linux. Importante nga mahibal-an bisan kausa sa usa ka adlaw nga siya "buhi" ug, kung gikinahanglan, ipadala kaniya ang mga sugo, pananglitan, "honey, reboot!"

Mopadayon kita sa pagpatuman:

1) Sa kilid sa router, pinaagi sa cron, matag 5/10/1440 ka minuto, o bisan kanus-a nimo gusto, kinahanglan ka magpadala usa ka hangyo sa http sa server gamit ang wget, i-save ang resulta sa hangyo sa usa ka file, himoa nga ma-executable ang file , ug ipatuman kini.

Ang akong linya sa cron ingon niini:

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

, diin:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai ang domain sa akong server. Tugoti ako nga timan-an dayon: oo, mahimo nimong ipiho ang usa ka piho nga IP address sa server, gibuhat namon kini hangtod sa among estado, sa usa ka matarong nga pagdasig sa pakigbisog, isulti ko, wala ako kahibalo, gibabagan ang pag-access sa leon. bahin sa DigitalOcean ug Amazon "mga panganod". Kung mogamit ka usa ka simbolikong domain, kung mahitabo ang ingon nga insidente, dali nimo nga mapataas ang usa ka backup nga panganod, i-redirect ang domain niini ug ibalik ang pag-monitor sa aparato.

a.php mao ang ngalan sa server-side script. Oo, nahibal-an ko nga sayup ang pagngalan sa mga variable ug mga ngalan sa file nga adunay parehas nga letra ... Gisugyot ko nga niining paagiha makatipig kami pipila ka mga byte kung magpadala usa ka hangyo :)
u - username, pag-login sa hardware
p - password
Ang "-O /tmp/wa.sh" usa ka file sa hilit nga router diin ang tubag sa server, pananglitan ang reboot command, maluwas.

Nota nga numero duha: Ahhh, nganong gigamit nato ang wget ug dili curl, tungod kay pinaagi sa curl mahimo nimong ipadala ang mga hangyo sa https dili sa GET, apan sa POST? Ahhh kay, sama sa karaang joke nga "NE misaka sa garapon!" curl naglakip sa encryption librarya sa mahitungod sa 2MB sa gidak-on ug tungod niini kini mao ang dili tingali nga kamo makahimo sa pag-assemble sa usa ka larawan alang sa usa ka gamay nga TP-LINK ML3020, alang sa panig-ingnan. Ug uban sa wget - palihug.

2) Sa server side (ako adunay Ubuntu) atong gamiton ang Zabbix. Ngano: Gusto nako nga kini matahum (uban ang mga graph) ug kombenyente (ipadala ang mga mando pinaagi sa menu sa konteksto). Ang Zabbix adunay usa ka talagsaon nga butang sama sa ahente sa zabbix. Pinaagi sa ahente, tawgon namo ang PHP script sa server, nga magbalik sa impormasyon kung nakarehistro ba ang among router sa gikinahanglan nga yugto sa panahon. Aron tipigan ang impormasyon mahitungod sa oras sa pagparehistro, mga sugo alang sa mga himan, akong gigamit ang MySQL, usa ka bulag nga tiggamit sa lamesa nga adunay gibana-bana nga mosunod nga mga natad:

		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;

Ang tanang tinubdan mahimong ma-download gikan sa Git repository sa: https://github.com/BazDen/iotnet.online.git
Karon ang mga script sa PHP gibutang sa kilid sa server (alang sa kasayon, mahimo silang ibutang sa / usr / share / zabbix / folder):

a.php file:

<?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 file (kini ang script sa zabbix agent nga gitawag):

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

Aw, ang katapusang yugto: pagparehistro sa usa ka ahente ug pagdugang mga iskedyul.

Kung wala pa nimo ma-install ang ahente sa zabbix, dayon:

apt-get install zabbix-agent

I-edit ang file /etc/zabbix/zabbix_agentd.conf.

Idugang ang linya:

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

, diin:
ang pagsulay mao ang ngalan sa among ahente
“php /usr/share/zabbix/agent.php user password” - usa ka gitawag nga script nga nagpakita sa datos sa pagrehistro sa device.

Pagdugang mga tsart: ablihi ang zabbix web interface, pagpili gikan sa menu:
Settings -> Network nodes -> Paghimo og network node. Dinhi igo na nga ipiho ang ngalan sa host sa network, ang grupo niini, ug ang default nga interface sa ahente:

Hilit nga pag-monitor ug pagkontrol sa Lunix / OpenWrt / Lede nga nakabase sa mga aparato pinaagi sa port 80…

Karon kinahanglan namong idugang ang usa ka elemento sa datos alang niini nga network node. Hatagi'g pagtagad ang duha ka field: "key" - mao gyud kini ang parameter nga among gisulat sa /etc/zabbix/zabbix_agentd.conf file (sa among kaso kini pagsulay), ug "update interval" - Gibutang nako kini sa 5 minuto , tungod kay ug ang mga ekipo narehistro usab sa server kausa sa matag lima ka minuto.

Hilit nga pag-monitor ug pagkontrol sa Lunix / OpenWrt / Lede nga nakabase sa mga aparato pinaagi sa port 80…

Aw, magdugang ta ug graph. Girekomendar nako ang pagpili sa "Punan" isip estilo sa paghubad.

Hilit nga pag-monitor ug pagkontrol sa Lunix / OpenWrt / Lede nga nakabase sa mga aparato pinaagi sa port 80…

Ang output usa ka butang nga laconic, pananglitan sama niini:

Hilit nga pag-monitor ug pagkontrol sa Lunix / OpenWrt / Lede nga nakabase sa mga aparato pinaagi sa port 80…

Sa makatarunganon nga pangutana: "takus ba kini?", Ako motubag: maayo, siyempre, tan-awa ang "mga hinungdan sa paghimo og bisikleta" sa sinugdanan sa artikulo.

Kung ang akong una nga kasinatian sa graphomaniac nakapukaw sa interes sa mga magbabasa, nan sa sunod nga mga artikulo gusto nako ihulagway kung giunsa pagpadala mga mando sa hilit nga kagamitan. Nahimo usab namon nga ipatuman ang tibuuk nga laraw alang sa mga aparato nga gibase sa RouterOS (Mikrotik).

Source: www.habr.com

Idugang sa usa ka comment