වරාය 80 හරහා Lunix/OpenWrt/Lede පදනම් කරගත් උපාංග දුරස්ථව අධීක්ෂණය කිරීම සහ පාලනය කිරීම...

හැමෝටම ආයුබෝවන්, මෙය Habré හි මගේ පළමු අත්දැකීමයි. බාහිර ජාලයක ජාල උපකරණ සම්මත නොවන ආකාරයෙන් කළමනාකරණය කරන්නේ කෙසේද යන්න ගැන ලිවීමට අවශ්යයි. සම්මත නොවන යන්නෙන් අදහස් කරන්නේ කුමක්ද: බොහෝ අවස්ථාවලදී, බාහිර ජාලයක උපකරණ කළමනාකරණය කිරීමට ඔබට අවශ්ය:

  • පොදු IP ලිපිනය. හොඳයි, හෝ උපකරණ යමෙකුගේ NAT පිටුපස තිබේ නම්, පොදු IP සහ "ඉදිරියට යන" වරාය.
  • උමග (PPTP/OpenVPN/L2TP+IPSec, ආදිය) එය ප්‍රවේශ විය හැකි මධ්‍යම නෝඩයට.

එබැවින්, සම්මත ක්රම ඔබට නොගැලපෙන විට ඔබට "මගේ බයිසිකලය" අවශ්ය වනු ඇත, උදාහරණයක් ලෙස:

  1. උපකරණ NAT පිටුපස පිහිටා ඇති අතර, සුපුරුදු http (වරාය 80) හැර, සියල්ල වසා ඇත. විශාල ෆෙඩරල් ආයතනික ජාල සඳහා මෙය සම්පූර්ණයෙන්ම සාමාන්ය තත්වයකි. ඔවුන්ට වරායන් ලියාපදිංචි කළ හැකිය, නමුත් වහාම නොවේ, ඉක්මනින් නොවේ, සහ ඔබ වෙනුවෙන් නොවේ.
  2. අස්ථායී සහ/හෝ "පටු" සන්නිවේදන නාලිකාව. අඩු වේගය, නිරන්තර පාඩු. උමගක් සංවිධානය කිරීමට උත්සාහ කරන විට වේදනාව සහ කලකිරීම.
  3. මිල අධික සන්නිවේදන නාලිකාවක්, වචනාර්ථයෙන් සෑම මෙගාබයිට් එකක්ම ගණන් ගනී. උදාහරණයක් ලෙස, චන්ද්රිකා සන්නිවේදනය. Plus දිගු ප්රමාදයන් සහ "පටු" පටියක්.
  4. ඔබට කුඩා රවුටර විශාල ප්‍රමාණයක් “ජංගල්” කිරීමට අවශ්‍ය වන තත්වයක්, එක් අතකින්, හැකියාවන් පුළුල් කිරීම සඳහා OpenWrt/Lede ස්ථාපනය කර ඇති අතර, අනෙක් අතට, රවුටරයේ සම්පත් (මතකය) ප්‍රමාණවත් නොවේ. හැමදේටම.

වාර ගණන සටහන් කරන්න රවුටරයේ USB පෝට් එකට ෆ්ලෑෂ් ධාවකය ස්ථාපනය කිරීමෙන් සහ රවුටරයේ මතකය පුළුල් කිරීමෙන් ඔබව වළක්වන්නේ කුමක්ද?

බොහෝ විට, අවශ්‍යතා සමස්තයක් ලෙස විසඳුමේ පිරිවැය සඳහා වන නමුත් සමහර විට ආකෘති සාධකය ද ප්‍රධාන කාර්යභාරයක් ඉටු කරයි. උදාහරණයක් ලෙස, වෙබ් අඩවියේ TP-Link ML3020 ඇත, එහි එකම USB පෝට් එක 2G / 3G මොඩමයක් සඳහා භාවිතා කරයි, මේ සියල්ල කුඩා ප්ලාස්ටික් පෙට්ටියක ඔතා කොතැනක හෝ ඉහළ, ඉහළ (කුඹයක් මත) තබා ඇත. දුරින්, දුරින් (ක්ෂේත්‍රයේ, ආසන්නතම ජංගම ක්‍රියාකරු මූලික ස්ථානයෙන් කිලෝමීටර 30 ක්). ඔව්, ඔබට USB හබ් එකක් සම්බන්ධ කර වරායන් ගණන පුළුල් කළ හැකිය, නමුත් අත්දැකීම් පෙන්නුම් කරන්නේ මෙය අපහසු සහ විශ්වාස කළ නොහැකි බවයි.

එබැවින්, මම ඔබට මගේ සාමාන්‍ය තත්වය විස්තර කිරීමට උත්සාහ කළෙමි: “කොතැනක හෝ දුරින්, ඉතා වැදගත්, හුදකලා සහ කුඩා රවුටරයක් ​​ලිනක්ස් ධාවනය කරයි. ඔහු "ජීවත්ව සිටින" බව අවම වශයෙන් දිනකට වරක් දැන ගැනීම වැදගත් වන අතර, අවශ්ය නම්, ඔහුට විධාන යවනු ලැබේ, උදාහරණයක් ලෙස, "පැණි, නැවත ආරම්භ කරන්න!"

අපි ක්රියාත්මක කිරීම වෙත යමු:

1) රවුටරයේ පැත්තේ, ක්‍රෝන් හරහා, සෑම විනාඩි 5/10/1440 කට වරක්, හෝ ඔබට අවශ්‍ය විටෙක, wget භාවිතා කර සේවාදායකයට http ඉල්ලීමක් යැවීම, ඉල්ලීමේ ප්‍රතිඵලය ගොනුවකට සුරැකීම, ගොනුව ක්‍රියාත්මක කළ හැකි බවට පත් කිරීම අවශ්‍ය වේ. , සහ එය ක්රියාත්මක කරන්න.

මගේ ක්‍රෝන් රේඛාව මේ වගේ දෙයක් පෙනේ:

ගොනුව /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

, එහිදී:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai මගේ සේවාදායකයේ වසම වේ. මට වහාම සටහන් කිරීමට ඉඩ දෙන්න: ඔව්, ඔබට සේවාදායකයේ නිශ්චිත IP ලිපිනයක් නියම කළ හැකිය, අපගේ රාජ්‍යය ධර්මිෂ්ඨ අරගලයක දී සිංහයාට ප්‍රවේශය අවහිර කරන තෙක් අපි මෙය කළෙමු. DigitalOcean සහ Amazon "වලාකුළු" වල කොටස. ඔබ සංකේතාත්මක වසමක් භාවිතා කරන්නේ නම්, එවැනි සිදුවීමක් සිදුවුවහොත්, ඔබට පහසුවෙන් උපස්ථ වලාකුළක් ඔසවා, වසම එය වෙත හරවා යවා උපාංග අධීක්ෂණය යථා තත්වයට පත් කළ හැකිය.

a.php යනු server-side script එකේ නමයි. ඔව්, මම දන්නවා විචල්‍යයන් නම් කිරීම සහ එකම අකුරින් නම් ගොනු කිරීම වැරදි බව... මම යෝජනා කරන්නේ ඉල්ලීමක් යවන විට බයිට් කිහිපයක් ඉතිරි කර ගන්නා ලෙසයි :)
u - පරිශීලක නාමය, දෘඪාංග පිවිසුම
p - මුරපදය
“-O /tmp/wa.sh” යනු දුරස්ථ රවුටරයේ ඇති ගොනුවකි, එහිදී සේවාදායකයේ ප්‍රතිචාරය, උදාහරණයක් ලෙස reboot විධානය සුරැකෙනු ඇත.

සටහන අංක දෙක: අහ්හ්, ඇයි අපි wget භාවිතා කරන්නේ සහ curl භාවිතා කරන්නේ නැහැ, මොකද curl හරහා ඔබට https ඉල්ලීම් යැවිය හැක්කේ GET සමඟ නොව POST සමඟද? අහ්හ් මන්ද, පැරණි විහිළුවේ මෙන් "NE බඳුනට නගියි!" curl හි 2MB පමණ ප්‍රමාණයේ සංකේතාංකන පුස්තකාල ඇතුළත් වන අතර මේ නිසා ඔබට කුඩා TP-LINK ML3020 සඳහා රූපයක් එකලස් කිරීමට හැකි වනු ඇතැයි සිතිය නොහැක. සහ wget සමඟ - කරුණාකර.

2) සේවාදායකය පැත්තෙන් (මට උබුන්ටු ඇත) අපි Zabbix භාවිතා කරමු. ඇයි: මට එය ලස්සන (ප්‍රස්තාර සහිත) සහ පහසු වීමට අවශ්‍යයි (සන්දර්භය මෙනුව හරහා විධාන යවන්න). Zabbix නියෝජිතයා වැනි අපූරු දෙයක් Zabbix සතුව ඇත. නියෝජිතයා හරහා, අපි සේවාදායකයේ PHP ස්ක්‍රිප්ට් එකක් අමතන්නෙමු, එමඟින් අපගේ රවුටරය අවශ්‍ය කාල සීමාව තුළ ලියාපදිංචි වී තිබේද යන්න පිළිබඳ තොරතුරු ලබා දෙනු ඇත. ලියාපදිංචි කාලය, උපාංග සඳහා විධාන පිළිබඳ තොරතුරු ගබඩා කිරීම සඳහා, මම MySQL භාවිතා කරමි, ආසන්න වශයෙන් පහත ක්ෂේත්‍ර සහිත වෙනම වගු භාවිතා කරන්නන්:

		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;

සියලුම මූලාශ්‍ර Git ගබඩාවෙන් බාගත කළ හැක්කේ: https://github.com/BazDen/iotnet.online.git
දැන් PHP ස්ක්‍රිප්ට් සේවාදායකයේ පැත්තේ තබා ඇත (පහසුව සඳහා, ඒවා /usr/share/zabbix/ ෆෝල්ඩරය තුළ තැබිය හැක):

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

Agent.php ගොනුව (මෙය zabbix නියෝජිතයාගේ ස්ක්‍රිප්ට් එකයි):

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

හොඳයි, අවසාන අදියර: නියෝජිතයෙකු ලියාපදිංචි කිරීම සහ කාලසටහන් එකතු කිරීම.

ඔබ තවමත් zabbix නියෝජිතයා ස්ථාපනය කර නොමැති නම්, එසේ නම්:

apt-get install zabbix-agent

ගොනුව /etc/zabbix/zabbix_agentd.conf සංස්කරණය කරන්න.

පේළිය එක් කරන්න:

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

, එහිදී:
test යනු අපගේ නියෝජිතයාගේ නමයි
“php /usr/share/zabbix/agent.php පරිශීලක මුරපදය” - උපාංග ලියාපදිංචි දත්ත දැක්වෙන ස්ක්‍රිප්ට් එකක්.

ප්‍රස්ථාර එකතු කිරීම: zabbix වෙබ් අතුරු මුහුණත විවෘත කරන්න, මෙනුවෙන් තෝරන්න:
සැකසීම් -> ජාල නෝඩ් -> ජාල නෝඩයක් සාදන්න. මෙහිදී ජාල සත්කාරකයේ නම, එහි කණ්ඩායම සහ පෙරනිමි නියෝජිත අතුරුමුහුණත සඳහන් කිරීමට ප්‍රමාණවත් වේ:

වරාය 80 හරහා Lunix/OpenWrt/Lede පදනම් කරගත් උපාංග දුරස්ථව අධීක්ෂණය කිරීම සහ පාලනය කිරීම...

දැන් අපි මෙම ජාල නෝඩය සඳහා දත්ත මූලද්රව්යයක් එකතු කළ යුතුය. ක්ෂේත්‍ර දෙකකට අවධානය යොමු කරන්න: “යතුර” - මෙය හරියටම අපි /etc/zabbix/zabbix_agentd.conf ගොනුවේ ලියා ඇති පරාමිතියයි (අපගේ නඩුවේදී එය පරීක්ෂණයකි), සහ “යාවත්කාලීන කාල පරතරය” - මම එය විනාඩි 5 ට සකස් කළෙමි. , මන්ද සහ උපකරණ ද සෑම විනාඩි පහකට වරක් සේවාදායකයේ ලියාපදිංචි වී ඇත.

වරාය 80 හරහා Lunix/OpenWrt/Lede පදනම් කරගත් උපාංග දුරස්ථව අධීක්ෂණය කිරීම සහ පාලනය කිරීම...

හොඳයි, අපි ප්‍රස්ථාරයක් එකතු කරමු. විදැහුම් විලාසය ලෙස "පිරවීම" තෝරා ගැනීමට මම නිර්දේශ කරමි.

වරාය 80 හරහා Lunix/OpenWrt/Lede පදනම් කරගත් උපාංග දුරස්ථව අධීක්ෂණය කිරීම සහ පාලනය කිරීම...

ප්‍රතිදානය ඉතා ලැකොනික් දෙයකි, උදාහරණයක් ලෙස මේ වගේ:

වරාය 80 හරහා Lunix/OpenWrt/Lede පදනම් කරගත් උපාංග දුරස්ථව අධීක්ෂණය කිරීම සහ පාලනය කිරීම...

සාධාරණ ප්රශ්නයට: "එය වටිනවාද?", මම පිළිතුරු දෙන්නෙමි: හොඳයි, ඇත්ත වශයෙන්ම, ලිපියේ ආරම්භයේ "බයිසිකලයක් නිර්මාණය කිරීමට හේතු" බලන්න.

මගේ පළමු graphomaniac අත්දැකීම පාඨකයන්ගේ උනන්දුව අවදි කරයි නම්, පහත දැක්වෙන ලිපිවල දුරස්ථ උපකරණ වෙත විධාන යැවීමට ආකාරය විස්තර කිරීමට මට අවශ්යය. RouterOS (Mikrotik) මත පදනම් වූ උපාංග සඳහා සම්පූර්ණ යෝජනා ක්රමය ක්රියාත්මක කිරීමට ද අපි සමත් විය.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න