پورٹ 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 ایڈریس بتا سکتے ہیں، ہم یہ اس وقت تک کرتے تھے جب تک کہ ہماری ریاست، جدوجہد کے ایک صالح جذبے میں، میں کہوں گا، مجھے نہیں معلوم، شیر کی رسائی کو مسدود کر دیا گیا تھا۔ ڈیجیٹل اوشین اور ایمیزون "بادلوں" کا حصہ۔ اگر آپ علامتی ڈومین استعمال کرتے ہیں، اگر ایسا کوئی واقعہ پیش آتا ہے، تو آپ آسانی سے بیک اپ کلاؤڈ اٹھا سکتے ہیں، ڈومین کو اس پر ری ڈائریکٹ کر سکتے ہیں اور ڈیوائس کی نگرانی کو بحال کر سکتے ہیں۔

a.php سرور سائیڈ اسکرپٹ کا نام ہے۔ ہاں، میں جانتا ہوں کہ متغیرات اور فائلوں کے نام ایک ہی حرف سے رکھنا غلط ہے... میرا مشورہ ہے کہ اس طرح ہم درخواست بھیجتے وقت چند بائٹس کو بچاتے ہیں :)
u - صارف نام، ہارڈ ویئر لاگ ان
p - پاس ورڈ
"-O /tmp/wa.sh" ریموٹ روٹر پر ایک فائل ہے جہاں سرور کا جواب، مثال کے طور پر ریبوٹ کمانڈ، محفوظ کیا جائے گا۔

نوٹ نمبر دو: آہ، ہم ویجٹ کیوں استعمال کرتے ہیں اور کرل نہیں، کیونکہ curl کے ذریعے آپ https کی درخواستیں GET کے ساتھ نہیں، بلکہ POST کے ساتھ بھیج سکتے ہیں؟ آہ کیونکہ، جیسا کہ پرانے لطیفے میں ہے "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;

تمام ذرائع کو گٹ ریپوزٹری سے ڈاؤن لوڈ کیا جا سکتا ہے: https://github.com/BazDen/iotnet.online.git
اب پی ایچ پی اسکرپٹس کو سرور سائیڈ پر رکھا گیا ہے (سہولت کے لیے انہیں /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 پر مبنی آلات کی ریموٹ مانیٹرنگ اور کنٹرول…

ٹھیک ہے، آئیے ایک گراف شامل کرتے ہیں۔ میں رینڈرنگ اسٹائل کے طور پر "Fill" کو منتخب کرنے کی تجویز کرتا ہوں۔

پورٹ 80 کے ذریعے Lunix/OpenWrt/Lede پر مبنی آلات کی ریموٹ مانیٹرنگ اور کنٹرول…

آؤٹ پٹ کچھ بہت کم ہے، مثال کے طور پر اس طرح:

پورٹ 80 کے ذریعے Lunix/OpenWrt/Lede پر مبنی آلات کی ریموٹ مانیٹرنگ اور کنٹرول…

معقول سوال: "کیا یہ اس کے قابل تھا؟"، میں جواب دوں گا: ٹھیک ہے، یقیناً، مضمون کے آغاز میں "سائیکل بنانے کی وجوہات" دیکھیں۔

اگر میرا پہلا گرافومانیک تجربہ قارئین کی دلچسپی کو بڑھاتا ہے، تو میں مندرجہ ذیل مضامین میں یہ بیان کرنا چاہتا ہوں کہ ریموٹ آلات کو کمانڈ کیسے بھیجیں۔ ہم RouterOS (Mikrotik) پر مبنی آلات کے لیے پوری اسکیم کو نافذ کرنے میں بھی کامیاب رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں