بندرگاهه 80 ذريعي Lunix/OpenWrt/Lede ٻڌل ڊوائيسز جي ريموٽ نگراني ۽ ڪنٽرول…

هيلو سڀني کي، هي منهنجو پهريون تجربو آهي Habré تي. مان لکڻ چاهيان ٿو ته غير معياري طريقي سان ٻاهرين نيٽ ورڪ تي نيٽ ورڪ سامان کي ڪيئن منظم ڪجي. غير معياري مطلب ڇا آهي: اڪثر ڪيسن ۾، ٻاهرين نيٽ ورڪ تي سامان کي منظم ڪرڻ لاء توهان کي ضرورت آهي:

  • عوامي 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 پتي جي وضاحت ڪري سگهو ٿا، اسان اهو ڪندا هئاسين جيستائين اسان جي رياست، جدوجهد جي صالح تسلسل ۾، مان چوندس، مون کي خبر ناهي، شينهن جي رسائي کي بند ڪيو ويو. DigitalOcean ۽ Amazon جو حصو ”بادل“. جيڪڏهن توهان هڪ علامتي ڊومين استعمال ڪريو ٿا، جيڪڏهن اهڙو واقعو ٿئي ٿو، توهان آساني سان بيڪ اپ ڪلائوڊ بلند ڪري سگهو ٿا، ڊومين کي ان ڏانهن ريڊائريڪٽ ڪري سگهو ٿا ۽ ڊوائيس مانيٽرنگ بحال ڪري سگهو ٿا.

a.php سرور سائڊ اسڪرپٽ جو نالو آهي. ها، مان ڄاڻان ٿو ته متغيرن ۽ فائلن جا نالا ساڳيا اکر سان رکڻ غلط آهي... مان صلاح ڏيان ٿو ته هن طريقي سان اسان ڪجھ بائٽس بچائي سگهون ٿا جڏهن درخواست موڪلڻ وقت :)
u - صارف جو نالو، هارڊويئر لاگ ان
p - پاسورڊ
"-O /tmp/wa.sh" ريموٽ روٽر تي هڪ فائل آهي جتي سرور جو جواب، مثال طور ريبوٽ ڪمانڊ، محفوظ ڪيو ويندو.

نوٽ نمبر ٻه: آه، اسان ويجٽ ڇو استعمال ڪريون ۽ نه curl، ڇو ته curl ذريعي توهان https جي درخواست موڪلي سگهو ٿا GET سان نه، پر پوسٽ سان؟ آه، ڇاڪاڻ ته، جيئن پراڻي مذاق ۾ "NE جار ۾ چڙهڻ!" curl ۾ اٽڪل 2MB سائيز جي انڪرپشن لائبريريون شامل آھن ۽ ان جي ڪري اھو ممڪن ناهي ته توھان ھڪڙي ننڍڙي TP-LINK ML3020 لاءِ تصوير گڏ ڪري سگھو، مثال طور. ۽ wget سان - مهرباني ڪري.

2) سرور جي پاسي (مون وٽ Ubuntu آهي) اسان استعمال ڪنداسين 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 فائل (هي زبڪس ايجنٽ جي اسڪرپٽ آهي جنهن کي سڏيو ويندو آهي):

<?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 ٻڌل ڊوائيسز جي ريموٽ نگراني ۽ ڪنٽرول…

هاڻي اسان کي هن نيٽ ورڪ نوڊ لاء ڊيٽا عنصر شامل ڪرڻ جي ضرورت آهي. ٻن شعبن تي ڌيان ڏيو: “key” - اھو بلڪل اھو آھي جيڪو اسان /etc/zabbix/zabbix_agentd.conf فائل ۾ لکيو آھي (اسان جي صورت ۾ اھو ٽيسٽ آھي)، ۽ ”اپڊيٽ وقفو“ - مون ان کي 5 منٽن تي سيٽ ڪيو. ، ڇاڪاڻ ته ۽ سامان پڻ رجسٽر ٿيل آهي سرور تي هڪ ڀيرو هر پنجن منٽن ۾.

بندرگاهه 80 ذريعي Lunix/OpenWrt/Lede ٻڌل ڊوائيسز جي ريموٽ نگراني ۽ ڪنٽرول…

خير، اچو ته هڪ گراف شامل ڪريو. مان سفارش ڪريان ٿو "Fill" کي رينڊرنگ انداز طور چونڊيو.

بندرگاهه 80 ذريعي Lunix/OpenWrt/Lede ٻڌل ڊوائيسز جي ريموٽ نگراني ۽ ڪنٽرول…

ٻاھر نڪرڻ واري شيءِ تمام گھڻي آھي، مثال طور ھن وانگر:

بندرگاهه 80 ذريعي Lunix/OpenWrt/Lede ٻڌل ڊوائيسز جي ريموٽ نگراني ۽ ڪنٽرول…

مناسب سوال تي: "ڇا اهو ان جي لائق هو؟"، مان جواب ڏيندس: چڱو، يقينا، مضمون جي شروعات ۾ "سائيڪل ٺاهڻ جا سبب" ڏسو.

جيڪڏهن منهنجو پهريون graphomaniac تجربو پڙهندڙن جي دلچسپي پيدا ڪري ٿو، پوء هيٺ ڏنل مضمونن ۾ آئون بيان ڪرڻ چاهيان ٿو ته ريموٽ سامان ڏانهن حڪم ڪيئن موڪلجي. اسان RouterOS (Mikrotik) جي بنياد تي ڊوائيسز لاء پوري منصوبي کي لاڳو ڪرڻ جو انتظام پڻ ڪيو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو