पोर्ट 80 द्वारे Lunix/OpenWrt/Lede आधारित उपकरणांचे दूरस्थ निरीक्षण आणि नियंत्रण…

सर्वांना नमस्कार, हाब्रेवरील हा माझा पहिला अनुभव आहे. मला नॉन-स्टँडर्ड मार्गाने बाह्य नेटवर्कवर नेटवर्क उपकरणे कशी व्यवस्थापित करावी याबद्दल लिहायचे आहे. गैर-मानक म्हणजे काय: बहुतेक प्रकरणांमध्ये, बाह्य नेटवर्कवर उपकरणे व्यवस्थापित करण्यासाठी आपल्याला आवश्यक आहे:

  • सार्वजनिक IP पत्ता. ठीक आहे, किंवा उपकरणे एखाद्याच्या NAT च्या मागे असल्यास, सार्वजनिक IP आणि "फॉरवर्डेड" पोर्ट.
  • बोगदा (PPTP/OpenVPN/L2TP+IPSec, इ.) मध्यवर्ती नोड ज्याद्वारे ते प्रवेशयोग्य असेल.

म्हणून, जेव्हा मानक पद्धती आपल्यास अनुरूप नसतील तेव्हा आपल्याला "माय बाईक" ची आवश्यकता असेल, उदाहरणार्थ:

  1. उपकरणे NAT च्या मागे स्थित आहेत आणि नेहमीच्या http (पोर्ट 80) व्यतिरिक्त, सर्वकाही बंद आहे. मोठ्या फेडरल कॉर्पोरेट नेटवर्कसाठी ही पूर्णपणे सामान्य परिस्थिती आहे. ते पोर्ट नोंदणी करू शकतात, परंतु लगेच नाही, पटकन नाही आणि तुमच्यासाठी नाही.
  2. अस्थिर आणि/किंवा "अरुंद" संप्रेषण चॅनेल. कमी वेग, सतत नुकसान. बोगदा आयोजित करण्याचा प्रयत्न करताना वेदना आणि निराशा.
  3. एक महाग संप्रेषण चॅनेल, जिथे अक्षरशः प्रत्येक मेगाबाइट मोजली जाते. उदाहरणार्थ, उपग्रह संप्रेषण. तसेच दीर्घ विलंब आणि "अरुंद" बँड.
  4. अशी परिस्थिती जेव्हा आपल्याला मोठ्या संख्येने लहान राउटर "जगल" करण्याची आवश्यकता असते, ज्यावर, एकीकडे, क्षमता वाढविण्यासाठी OpenWrt/Lede स्थापित केले जाते आणि दुसरीकडे, राउटरची संसाधने (मेमरी) पुरेसे नाहीत. सगळ्यासाठी.

नोंद क्रमांक वेळा राउटरच्या USB पोर्टमध्ये फ्लॅश ड्राइव्ह स्थापित करण्यापासून आणि राउटरची मेमरी वाढवण्यापासून तुम्हाला काय प्रतिबंधित करते?

बऱ्याचदा, आवश्यकता संपूर्णपणे सोल्यूशनच्या खर्चासाठी असतात, परंतु कधीकधी फॉर्म फॅक्टर देखील महत्त्वाची भूमिका बजावते. उदाहरणार्थ, साइटवर TP-Link ML3020 आहे, त्याचा एकमेव यूएसबी पोर्ट 2G/3G मॉडेमसाठी वापरला जातो, हे सर्व काही प्रकारच्या लहान प्लास्टिकच्या केसमध्ये गुंडाळलेले आहे आणि कुठेतरी उंच, उंच (मास्टवर) ठेवलेले आहे. दूर, खूप दूर (क्षेत्रात, जवळच्या मोबाइल ऑपरेटर बेस स्टेशनपासून 30 किमी). होय, तुम्ही USB हबमध्ये प्लग इन करू शकता आणि पोर्टची संख्या वाढवू शकता, परंतु अनुभव दर्शवितो की हे अवजड आणि अविश्वसनीय आहे.

म्हणून, मी तुम्हाला माझ्या वैशिष्ट्यपूर्ण परिस्थितीचे वर्णन करण्याचा प्रयत्न केला: “कुठेतरी दूर, दूर, एक अतिशय महत्त्वाचा, एकटा आणि लहान राउटर Linux चालवत आहे. दिवसातून एकदा तरी तो "जिवंत" आहे हे जाणून घेणे महत्वाचे आहे आणि आवश्यक असल्यास, त्याला आज्ञा पाठवल्या जातात, उदाहरणार्थ, "मध, रीबूट!"

चला अंमलबजावणीकडे जाऊ:

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 “Clouds” चा सिंहाचा वाटा आहे. तुम्ही प्रतीकात्मक डोमेन वापरत असल्यास, अशी घटना घडल्यास, तुम्ही सहजपणे बॅकअप क्लाउड वाढवू शकता, डोमेन त्यावर पुनर्निर्देशित करू शकता आणि डिव्हाइस मॉनिटरिंग पुनर्संचयित करू शकता.

a.php हे सर्व्हर-साइड स्क्रिप्टचे नाव आहे. होय, मला माहित आहे की व्हेरिएबल्स आणि फाइल्सना एकाच अक्षराने नाव देणे चुकीचे आहे... मी सुचवितो की विनंती पाठवताना आपण काही बाइट्स वाचवतो :)
u - वापरकर्तानाव, हार्डवेअर लॉगिन
p - पासवर्ड
“-O /tmp/wa.sh” ही रिमोट राउटरवरील फाइल आहे जिथे सर्व्हरचा प्रतिसाद, उदाहरणार्थ रीबूट कमांड सेव्ह केला जाईल.

टीप क्रमांक दोन: अहो, आम्ही wget का वापरतो आणि curl नाही, कारण curl द्वारे तुम्ही https विनंत्या GET ने नाही तर POST सोबत पाठवू शकता? आहाह कारण, जुन्या विनोदाप्रमाणे "NE जारमध्ये चढतो!" कर्लमध्ये सुमारे 2MB आकाराच्या एन्क्रिप्शन लायब्ररींचा समावेश आहे आणि यामुळे तुम्ही लहान TP-LINK ML3020 साठी प्रतिमा एकत्र करू शकाल अशी शक्यता नाही, उदाहरणार्थ. आणि wget सह - कृपया.

२) सर्व्हरच्या बाजूने (माझ्याकडे उबंटू आहे) आपण 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

, कोठे:
चाचणी हे आमच्या एजंटचे नाव आहे
"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 आधारित उपकरणांचे दूरस्थ निरीक्षण आणि नियंत्रण…

वाजवी प्रश्नासाठी: "ते फायदेशीर होते?", मी उत्तर देईन: नक्कीच, लेखाच्या सुरूवातीस "सायकल तयार करण्याची कारणे" पहा.

जर माझा पहिला ग्राफोमॅनियाक अनुभव वाचकांची आवड जागृत करत असेल, तर पुढील लेखांमध्ये मला रिमोट उपकरणांना कमांड कसे पाठवायचे याचे वर्णन करायचे आहे. आम्ही RouterOS (Mikrotik) वर आधारित उपकरणांसाठी संपूर्ण योजना लागू करण्यात देखील व्यवस्थापित केले.

स्त्रोत: www.habr.com

एक टिप्पणी जोडा