د پورټ 80 له لارې د Lunix/OpenWrt/Lede پر بنسټ وسیلو ریموټ څارنه او کنټرول ...

ټولو ته سلام، دا په هابري کې زما لومړۍ تجربه ده. زه غواړم په غیر معیاري ډول په بهرنۍ شبکه کې د شبکې تجهیزاتو اداره کولو څرنګوالي په اړه ولیکم. غیر معیاري څه معنی لري: په ډیری قضیو کې ، په بهرني شبکه کې د تجهیزاتو اداره کولو لپاره تاسو اړتیا لرئ:

  • عامه IP پته. ښه، یا که تجهیزات د چا د NAT شاته وي، نو بیا یو عامه IP او "پرانیستل شوی" بندر.
  • تونل (PPTP/OpenVPN/L2TP+IPSec، او نور) مرکزي نوډ ته چې له لارې به یې د لاسرسي وړ وي.

له همدې امله ، تاسو به "زما بایسکل" ته اړتیا ولرئ کله چې معیاري میتودونه ستاسو سره مناسب نه وي ، د مثال په توګه:

  1. تجهیزات د NAT شاته موقعیت لري او د معمول http (پورټ 80) پرته ، هرڅه بند دي. دا د لوی فدرالي کارپوریټ شبکو لپاره په بشپړ ډول عادي حالت دی. دوی کولی شي بندرونه راجستر کړي، مګر سمدلاسه نه، ژر نه، او نه ستاسو لپاره.
  2. بې ثباته او/یا "تنګ" ارتباطي چینل. ټیټ سرعت، دوامداره زیانونه. درد او خپګان کله چې د تونل تنظیم کولو هڅه کوي.
  3. یو ګران مخابراتي چینل، چیرې چې په لفظي توګه هر میګابایټ شمیرل کیږي. د مثال په توګه، د سپوږمکۍ مخابرات. پلس اوږد ځنډ او یو "تنګ" بانډ.
  4. یو وضعیت کله چې تاسو اړتیا لرئ د لوی شمیر کوچني روټرونو "جګل" کولو ته اړتیا ولرئ ، په کوم کې چې له یوې خوا ، OpenWrt/Lede د ظرفیتونو پراخولو لپاره نصب شوی ، او له بلې خوا ، د روټر سرچینې (یادونه) کافي ندي. د هر څه لپاره.

د شمیرې وختونه یاد کړئ څه شی د روټر USB پورټ کې د فلش ډرایو نصبولو او د روټر حافظې پراخولو مخه نیسي؟

ډیری وختونه، اړتیاوې په ټولیز ډول د حل لګښت لپاره دي، مګر کله ناکله د فارم فکتور هم کلیدي رول لوبوي. د مثال په توګه، په سایټ کې د TP-Link ML3020 شتون لري، د هغې یوازینی USB پورټ د 2G/3G موډیم لپاره کارول کیږي، دا ټول په یو ډول کوچني پلاستيکي قضیه کې پوښل شوي او په یو ځای کې په لوړ، لوړ (مستقبل کې) ځای پرځای شوي. لیرې، لیرې (په ساحه کې، د نږدې ګرځنده آپریټر بیس سټیشن څخه 30 کیلومتره). هو، تاسو کولی شئ په یو USB مرکز کې ولګوئ او د بندرونو شمیر پراخ کړئ، مګر تجربه ښیې چې دا پیچلې او د اعتبار وړ ندي.

نو، ما هڅه وکړه چې تاسو ته زما عادي وضعیت تشریح کړم: "یو ځای، لیرې، یو خورا مهم، یوازینی او کوچنی روټر شتون لري چې لینکس چلوي. دا مهمه ده چې لږترلږه په ورځ کې یو ځل پوه شئ چې هغه "ژوندی" دی او که اړتیا وي، هغه ته امرونه لیږل کیږي، د بیلګې په توګه، "شه، ریبوټ!"

راځئ چې پلي کولو ته لاړ شو:

1) د روټر اړخ کې ، د کرون له لارې ، په هر 5/10/1440 دقیقو کې ، یا کله چې تاسو غواړئ ، تاسو اړتیا لرئ د ویجټ په کارولو سره سرور ته د 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 پته مشخص کړئ، موږ دا کار تر هغه وخته پورې کاوه چې زموږ دولت، د مبارزې په صادقانه جذبه کې، زه به ووایم، زه نه پوهیږم، زمریانو ته لاسرسی بند شوی. د ډیجیټل سمندر او ایمیزون "بادلونو" برخه. که تاسو سمبولیک ډومین وکاروئ ، که داسې پیښه رامینځته شي ، تاسو کولی شئ په اسانۍ سره یو بیک اپ کلاوډ پورته کړئ ، ډومین دې ته واستوئ او د وسیلې نظارت بحال کړئ.

a.php د سرور اړخ سکریپټ نوم دی. هو، زه پوهیږم چې د ورته لیک سره د متغیرونو او فایل نومونو نومول غلط دي ... زه وړاندیز کوم چې پدې توګه موږ د غوښتنې لیږلو پر مهال یو څو بایټونه خوندي کړو :)
u - کارن نوم، هارډویر ننوتل
p - پټنوم
"-O /tmp/wa.sh" په ریموټ روټر کې یو فایل دی چیرې چې د سرور ځواب ، د مثال په توګه د ریبوټ کمانډ به خوندي شي.

دوهم نمبر یادونه: آه، ولې موږ wget کاروو او نه curl، ځکه چې د curl له لارې تاسو کولی شئ د https غوښتنې د GET سره نه، مګر د POST سره واستوئ؟ آه ځکه، لکه څنګه چې په زاړه ټوکه کې "NE په جار کې پورته کیږي!" curl کې د شاوخوا 2MB اندازې کوډ کولو کتابتونونه شامل دي او د دې له امله امکان نلري چې تاسو به د مثال په توګه د کوچني TP-LINK ML3020 لپاره عکس راټول کړئ. او د wget سره - مهرباني وکړئ.

2) د سرور اړخ کې (زه اوبنټو لرم) موږ به زبیکس وکاروو. ولې: زه غواړم دا ښکلی وي (د ګرافونو سره) او مناسب وي (د شرایطو مینو له لارې امرونه واستوئ). زیبکس د زبیبکس اجنټ په څیر په زړه پوری شی لري. د اجنټ له لارې، موږ به په سرور کې د 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 فایل (دا د زیبکس ایجنټ سکریپټ دی چې ویل کیږي):

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

ښه، وروستی مرحله: د اجنټ راجستر کول او د مهال ویش اضافه کول.

که تاسو تراوسه د زیبکس ایجنټ نه دی نصب کړی، نو:

apt-get install zabbix-agent

فایل سم کړئ /etc/zabbix/zabbix_agentd.conf.

کرښه اضافه کړئ:

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

چیرته:
ازموینه زموږ د اجنټ نوم دی
"php /usr/share/zabbix/agent.php کارن پاسورډ" - یو سکریپټ په نامه یادیږي چې د وسیلې ثبتولو ډاټا په ګوته کوي.

د چارټونو اضافه کول: د زیبکس ویب انٹرفیس خلاص کړئ، له مینو څخه غوره کړئ:
ترتیبات -> د شبکې نوډونه -> د شبکې نوډ جوړ کړئ. دلته دا کافی دی چې د شبکې کوربه نوم، د هغې ګروپ، او د ډیفالټ اجنټ انٹرفیس مشخص کړئ:

د پورټ 80 له لارې د Lunix/OpenWrt/Lede پر بنسټ وسیلو ریموټ څارنه او کنټرول ...

اوس موږ اړتیا لرو د دې شبکې نوډ لپاره د ډیټا عنصر اضافه کړو. دوه برخو ته پام وکړئ: "کیلي" - دا دقیقا هغه پیرامیټر دی چې موږ یې په /etc/zabbix/zabbix_agentd.conf فایل کې لیکلي (زموږ په قضیه کې دا ازموینه ده) ، او "د تازه کولو وقفه" - ما دا 5 دقیقو ته تنظیم کړه. ځکه چې او تجهیزات هم په هرو پنځو دقیقو کې یو ځل په سرور کې ثبت کیږي.

د پورټ 80 له لارې د Lunix/OpenWrt/Lede پر بنسټ وسیلو ریموټ څارنه او کنټرول ...

ښه، راځئ چې یو ګراف اضافه کړو. زه وړاندیز کوم چې د رینډینګ سټایل په توګه "ډک" غوره کړئ.

د پورټ 80 له لارې د Lunix/OpenWrt/Lede پر بنسټ وسیلو ریموټ څارنه او کنټرول ...

محصول یو څه ډیر نیمګړی دی، د بیلګې په توګه:

د پورټ 80 له لارې د Lunix/OpenWrt/Lede پر بنسټ وسیلو ریموټ څارنه او کنټرول ...

معقول پوښتنې ته: "ایا دا د دې ارزښت درلود؟"، زه به ځواب ورکړم: ښه، البته، د مقالې په پیل کې "د بایسکل جوړولو دلیلونه" وګورئ.

که زما لومړۍ ګرافومانیاک تجربه د لوستونکو علاقه راپاروي ، نو په لاندې مقالو کې زه غواړم تشریح کړم چې څنګه لرې پرتو تجهیزاتو ته امرونه واستوئ. موږ د RouterOS (Mikrotik) پراساس د وسیلو لپاره د بشپړ سکیم پلي کولو اداره هم کړې.

سرچینه: www.habr.com

Add a comment