Çavdêrî û kontrolkirina dûr a cîhazên bingehîn ên Lunix / OpenWrt / Lede bi riya porta 80…

Silav her kes, ev ezmûna min a yekem li ser Habré ye. Ez dixwazim binivîsim ka meriv çawa amûrên torê li ser torgilokek derveyî bi rengek ne-standard îdare dike. Wateya ne-standard çi ye: di pir rewşan de, ji bo birêvebirina alavên li ser torgilokek derveyî hûn hewce ne:

  • Navnîşana IP-ya gelemperî. Welê, an heke amûr li pişt NAT-a kesek be, wê hingê IP-ya gelemperî û portek "pêşvekirî".
  • Tunnel (PPTP/OpenVPN/L2TP+IPSec, hwd.) ber bi girêka navendî ya ku tê de dê bigihîje.

Ji ber vê yekê, hûn ê hewceyê "bisîklêta min" bikin dema ku rêbazên standard ne li gorî we ne, mînakî:

  1. Amûr li pişt NAT-ê ye û, ji bilî http-ya gelemperî (port 80), her tişt girtî ye. Ev ji bo torên pargîdaniyên mezin ên federal rewşek bi tevahî normal e. Ew dikarin benderan tomar bikin, lê ne tavilê, ne zû, û ne ji bo we.
  2. Kanala ragihandinê ya bêîstîqrar û / an "teng". Leza kêm, windahiyên berdewam. Dema ku hewl didin ku tunelek organîze bikin êş û xemgînî.
  3. Kanalek ragihandinê ya biha, ku bi rastî her megabyte tê hesibandin. Ji bo nimûne, peywendiyên satelîtê. Zêde derengiyên dirêj û bandek "teng".
  4. Rewşek gava ku hûn hewce ne ku hejmareke mezin ji routerên piçûk "bişopînin", ku ji aliyekî ve OpenWrt/Lede tê saz kirin da ku kapasîteyên berfireh bikin, û ji hêla din ve jî çavkaniyên (bîra) routerê ne bes in. ji bo her tiştî.

Têbînî hejmara caran Çi rê li we digire ku hûn ajokerek flash-ê li porta USB-ya routerê saz bikin û bîranîna routerê berfireh bikin?

Bi gelemperî, hewcedarî ji bo lêçûna çareseriyê bi tevahî ne, lê carinan faktora formê jî rolek sereke dilîze. Mînakî, li malperê TP-Link ML3020 heye, porta wê ya yekane USB ji bo modemek 2G/3G tê bikar anîn, ev hemî di cûreyek piçûkek piçûk a plastîk de tê pêçan û li cîhek bilind, bilind (li ser mastê) tê danîn. dûr, dûr (li zeviyê, 30 km ji stasyona bingehîn a operatorê mobîl a herî nêzîk). Erê, hûn dikarin navendek USB-ê têxin û hejmara portan berfireh bikin, lê ezmûn destnîşan dike ku ev yek giran û ne pêbawer e.

Ji ber vê yekê, min hewl da ku rewşa xwe ya tîpîk ji we re vebêjim: "Li cîhek dûr, dûr, routerek pir girîng, tenê û piçûk heye ku Linux-ê dixebitîne. Girîng e ku bi kêmanî rojê carekê zanibin ku ew "zindî" ye û, ger hewce be, ferman ji wî re têne şandin, mînakî, "Hingiv, reboot!"

Ka em herin ser pêkanînê:

1) Li milê routerê, bi rêya cron, her 5/10/1440 hûrdem, an jî gava ku hûn bixwazin, hûn hewce ne ku daxwazek http ji serverê re bi karanîna wget bişînin, encama daxwaznameyê li pelek hilînin, pelê bicîh bikin. , û wê pêk bînin.

Rêza min a cron tiştek wusa xuya dike:

Pelê /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

, ku li:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai domaina servera min e. Bihêle ez tavilê bibêjim: erê, hûn dikarin navnîşanek IP-ya taybetî ya serverê diyar bikin, me ev yek dikir heya ku dewleta me, di nav têkoşînek rastdar de, ez ê bibêjim, nizanim, gihîştina şêr asteng kir. parvekirina "ewrên" DigitalOcean û Amazonê. Ger hûn domainek sembolîk bikar bînin, heke bûyerek wusa çêbibe, hûn dikarin bi hêsanî ewrek paşvekêşanê rakin, domainê beralî bikin û çavdêriya cîhazê sererast bikin.

a.php navê skrîpta server-side ye. Erê, ez dizanim ku xelet e ku meriv guhêrbar û navên pelan bi heman herfê bi nav bike... Ez pêşniyar dikim ku bi vî rengî em di şandina daxwazekê de çend bayt hilînin :)
u - navê bikarhêner, têketina hardware
p - şîfreya
"-O /tmp/wa.sh" pelek li ser routerê dûr e ku dê bersiva serverê, mînakî fermana reboot, were tomar kirin.

Nîşe hejmar du: Ahhh, çima em wget bikar tînin û ne curl dikin, ji ber ku bi riya curl hûn dikarin daxwazên https ne bi GET, lê bi POST re bişînin? Ahhh ji ber ku, wekî henekek kevn "NE hildikişe nav jar!" curl pirtûkxaneyên şîfrekirinê yên bi qasî 2 MB mezinahiyê vedihewîne û ji ber vê yekê ne mimkûn e ku hûn ji bo mînakek piçûk TP-LINK ML3020 wêneyek berhev bikin. Û bi wget - kerema xwe.

2) Li aliyê serverê (min Ubuntu heye) em ê Zabbix bikar bînin. Çima: Ez dixwazim ku ew xweşik (bi grafîkan) û rehet be (fermanan bi navgîniya menuya çarçoveyê bişîne). Zabbix xwedan tiştek ecêb e wekî nûnerê zabbix. Bi navgîniya nûnerê, em ê li ser serverê gazî skrîptek PHP-ê bikin, ku dê agahdarî vegerîne ka ka routerê me di heyama dema pêwîst de qeydkirî ye an na. Ji bo hilanîna agahdariya li ser dema qeydkirinê, fermanên ji bo cîhazan, ez MySQL, bikarhênerên tabloyek cihêreng bi qasî qadên jêrîn bikar tînim:

		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;

Hemî çavkanî dikarin ji depoya Git li vir werin dakêşandin: https://github.com/BazDen/iotnet.online.git
Naha nivîsarên PHP-ê li ser milê serverê têne danîn (ji bo rehetiyê, ew dikarin di peldanka /usr/share/zabbix/ de werin danîn):

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

Pelê Agent.php (ev skrîpta agentê zabbix e ku jê re tê gotin):

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

Welê, qonaxa paşîn: qeydkirina nûnerek û lê zêdekirina bername.

Ger we hîn nûnerê zabbix saz nekiriye, wê hingê:

apt-get install zabbix-agent

Pelê biguherîne /etc/zabbix/zabbix_agentd.conf.

Rêzê lê zêde bike:

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

, ku li:
test navê nûnerê me ye
"php /usr/share/zabbix/agent.php şîfreya bikarhêner" - skrîpta bi navê ku daneyên qeydkirina cîhazê destnîşan dike.

Zêdekirina nexşeyan: pêwendiya webê ya zabbix vekin, ji menuê hilbijêrin:
Mîheng -> Girêkên torê -> Nodek torê biafirînin. Li vir bes e ku meriv navê mêvandarê torê, koma wê, û navgîniya nûnerê xwerû diyar bike:

Çavdêrî û kontrolkirina dûr a cîhazên bingehîn ên Lunix / OpenWrt / Lede bi riya porta 80…

Naha divê em ji bo vê girêka torê hêmanek daneyê zêde bikin. Bala xwe bidin du qadan: "kilît" - ev tam parametreya ku me di pelê /etc/zabbix/zabbix_agentd.conf de nivîsand (di rewşa me de ew ceribandin e), û "navbera nûvekirinê" - min ew danî ser 5 hûrdeman , ji ber ku û amûr jî her pênc deqeyan carekê li ser serverê têne tomar kirin.

Çavdêrî û kontrolkirina dûr a cîhazên bingehîn ên Lunix / OpenWrt / Lede bi riya porta 80…

Belê, em grafiyek lê zêde bikin. Ez pêşniyar dikim ku "Dajî" wekî şêwaza vegotinê hilbijêrin.

Çavdêrî û kontrolkirina dûr a cîhazên bingehîn ên Lunix / OpenWrt / Lede bi riya porta 80…

Hilber tiştek pir lakonîk e, mînakî bi vî rengî:

Çavdêrî û kontrolkirina dûr a cîhazên bingehîn ên Lunix / OpenWrt / Lede bi riya porta 80…

Ji bo pirsa maqûl: "gelo hêja bû?", Ez ê bersiv bidim: baş e, bê guman, di destpêka gotarê de "sedemên afirandina bisîkletê" bibînin.

Ger ezmûna min a yekem a grafomaniac eleqeya xwendevanan çêdike, wê hingê di gotarên jêrîn de ez dixwazim diyar bikim ka meriv çawa fermanan bişîne alavên dûr. Di heman demê de me karî ku tevahiya nexşeyê ji bo cîhazên li ser bingeha RouterOS (Mikrotik) bicîh bikin.

Source: www.habr.com

Add a comment