పోర్ట్ 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 హబ్‌ని ప్లగ్ ఇన్ చేయవచ్చు మరియు పోర్ట్‌ల సంఖ్యను విస్తరించవచ్చు, అయితే ఇది గజిబిజిగా మరియు నమ్మదగనిదని అనుభవం చూపిస్తుంది.

కాబట్టి, నేను మీకు నా సాధారణ పరిస్థితిని వివరించడానికి ప్రయత్నించాను: “ఎక్కడో దూరంగా, చాలా ముఖ్యమైన, ఒంటరి మరియు చిన్న రూటర్ 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 చిరునామాను పేర్కొనవచ్చు, మా రాష్ట్రం వరకు మేము దీన్ని ఉపయోగించాము, పోరాటం యొక్క న్యాయమైన ప్రేరణలో, నేను చెబుతాను, నాకు తెలియదు, యాక్సెస్ బ్లాక్ చేయబడింది డిజిటల్ ఓషన్ మరియు అమెజాన్ "క్లౌడ్స్"లో సింహభాగం. మీరు సింబాలిక్ డొమైన్‌ను ఉపయోగిస్తే, అటువంటి సంఘటన సంభవించినట్లయితే, మీరు సులభంగా బ్యాకప్ క్లౌడ్‌ను పెంచవచ్చు, డొమైన్‌ను దానికి దారి మళ్లించవచ్చు మరియు పరికర పర్యవేక్షణను పునరుద్ధరించవచ్చు.

a.php అనేది సర్వర్ సైడ్ స్క్రిప్ట్ పేరు. అవును, వేరియబుల్స్ మరియు ఫైల్ పేర్లను ఒకే అక్షరంతో పేరు పెట్టడం తప్పు అని నాకు తెలుసు... అభ్యర్థనను పంపేటప్పుడు ఈ విధంగా మనం కొన్ని బైట్‌లను సేవ్ చేయమని నేను సూచిస్తున్నాను :)
u - వినియోగదారు పేరు, హార్డ్‌వేర్ లాగిన్
p - పాస్వర్డ్
“-O /tmp/wa.sh” అనేది రిమోట్ రూటర్‌లోని ఫైల్, ఇక్కడ సర్వర్ ప్రతిస్పందన, ఉదాహరణకు రీబూట్ కమాండ్ సేవ్ చేయబడుతుంది.

గమనిక సంఖ్య రెండు: ఆహ్, మేము ఎందుకు wget ఉపయోగిస్తాము మరియు కర్ల్ కాదు, ఎందుకంటే కర్ల్ ద్వారా మీరు https అభ్యర్థనలను GETతో కాకుండా POSTతో పంపవచ్చు? ఆహ్, ఎందుకంటే, పాత జోక్‌లో “NE కూజాలోకి ఎక్కుతుంది!” curl సుమారు 2MB పరిమాణంలో ఉన్న ఎన్‌క్రిప్షన్ లైబ్రరీలను కలిగి ఉంటుంది మరియు దీని కారణంగా మీరు ఒక చిన్న TP-LINK ML3020 కోసం చిత్రాన్ని సమీకరించే అవకాశం లేదు, ఉదాహరణకు. మరియు wget తో - దయచేసి.

2) సర్వర్ వైపు (నా దగ్గర ఉబుంటు ఉంది) మేము Zabbix ఉపయోగిస్తాము. ఎందుకు: ఇది అందంగా (గ్రాఫ్‌లతో) మరియు సౌకర్యవంతంగా ఉండాలని నేను కోరుకుంటున్నాను (సందర్భ మెను ద్వారా ఆదేశాలను పంపండి). Zabbix agent వంటి అద్భుతమైన విషయం 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

ఒక వ్యాఖ్యను జోడించండి