போர்ட் 80 வழியாக Lunix/OpenWrt/Lede சார்ந்த சாதனங்களின் தொலை கண்காணிப்பு மற்றும் கட்டுப்பாடு…

அனைவருக்கும் வணக்கம், இது ஹப்ரேயில் எனது முதல் அனுபவம். வெளிப்புற நெட்வொர்க்கில் நெட்வொர்க் உபகரணங்களை தரமற்ற முறையில் எவ்வாறு நிர்வகிப்பது என்பது பற்றி எழுத விரும்புகிறேன். தரமற்றது என்றால் என்ன: பெரும்பாலான சந்தர்ப்பங்களில், வெளிப்புற நெட்வொர்க்கில் உபகரணங்களை நிர்வகிக்க உங்களுக்குத் தேவை:

  • பொது ஐபி முகவரி. சரி, அல்லது ஒருவரின் NAT க்கு பின்னால் உபகரணங்கள் இருந்தால், பொது ஐபி மற்றும் "முன்னோக்கி" போர்ட்.
  • சுரங்கப்பாதை (PPTP/OpenVPN/L2TP+IPSec, முதலியன) அதை அணுகக்கூடிய மைய முனைக்கு.

எனவே, நிலையான முறைகள் உங்களுக்குப் பொருந்தாதபோது உங்களுக்கு "எனது பைக்" தேவைப்படும், எடுத்துக்காட்டாக:

  1. உபகரணங்கள் NAT க்கு பின்னால் அமைந்துள்ளன, வழக்கமான http (போர்ட் 80) தவிர, அனைத்தும் மூடப்பட்டுள்ளன. பெரிய ஃபெடரல் கார்ப்பரேட் நெட்வொர்க்குகளுக்கு இது முற்றிலும் இயல்பான சூழ்நிலை. அவர்கள் போர்ட்களை பதிவு செய்யலாம், ஆனால் உடனடியாக இல்லை, விரைவாக இல்லை, உங்களுக்காக அல்ல.
  2. நிலையற்ற மற்றும்/அல்லது "குறுகிய" தொடர்பு சேனல். குறைந்த வேகம், நிலையான இழப்புகள். ஒரு சுரங்கப்பாதையை ஒழுங்கமைக்க முயற்சிக்கும்போது வலி மற்றும் விரக்தி.
  3. ஒரு விலையுயர்ந்த தகவல் தொடர்பு சேனல், அதாவது ஒவ்வொரு மெகாபைட்டும் கணக்கிடப்படும். உதாரணமாக, செயற்கைக்கோள் தொடர்பு. மேலும் நீண்ட தாமதங்கள் மற்றும் ஒரு "குறுகிய" இசைக்குழு.
  4. நீங்கள் அதிக எண்ணிக்கையிலான சிறிய திசைவிகளை "வித்தை" செய்ய வேண்டிய சூழ்நிலை, அதில், ஒருபுறம், திறன்களை விரிவாக்க OpenWrt/Lede நிறுவப்பட்டுள்ளது, மறுபுறம், திசைவியின் வளங்கள் (நினைவகம்) போதுமானதாக இல்லை. அனைத்திற்கும்.

எண் முறைகளைக் கவனியுங்கள் ரூட்டரின் யூ.எஸ்.பி போர்ட்டில் ஃபிளாஷ் டிரைவை நிறுவுவதிலிருந்தும் ரூட்டரின் நினைவகத்தை விரிவாக்குவதிலிருந்தும் உங்களைத் தடுப்பது எது?

பெரும்பாலும், தேவைகள் ஒட்டுமொத்த தீர்வின் விலையாகும், ஆனால் சில சமயங்களில் படிவ காரணியும் முக்கிய பங்கு வகிக்கிறது. எடுத்துக்காட்டாக, தளத்தில் ஒரு TP-Link ML3020 உள்ளது, அதன் ஒரே USB போர்ட் 2G/3G மோடமிற்குப் பயன்படுத்தப்படுகிறது, இவை அனைத்தும் ஒருவித சிறிய பிளாஸ்டிக் பெட்டியில் மூடப்பட்டு எங்காவது உயரமான, உயரமான (மாஸ்டில்) வைக்கப்படுகின்றன. தொலைவில், தொலைவில் (வயலில், அருகிலுள்ள மொபைல் ஆபரேட்டர் அடிப்படை நிலையத்திலிருந்து 30 கி.மீ.). ஆம், யூ.எஸ்.பி ஹப்பை செருகலாம் மற்றும் போர்ட்களின் எண்ணிக்கையை விரிவாக்கலாம், ஆனால் இது சிக்கலானது மற்றும் நம்பமுடியாதது என்பதை அனுபவம் காட்டுகிறது.

எனவே, எனது வழக்கமான சூழ்நிலையை உங்களுக்கு விவரிக்க முயற்சித்தேன்: “எங்கோ தொலைவில், தொலைவில், லினக்ஸ் இயங்கும் மிக முக்கியமான, தனிமையான மற்றும் சிறிய திசைவி உள்ளது. அவர் "உயிருடன்" இருக்கிறார் என்பதை ஒரு நாளைக்கு ஒரு முறையாவது அறிந்து கொள்வது முக்கியம், தேவைப்பட்டால், கட்டளைகள் அவருக்கு அனுப்பப்படுகின்றன, எடுத்துக்காட்டாக, "தேன், மறுதொடக்கம்!"

செயல்படுத்தலுக்கு செல்லலாம்:

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 என்பது எனது சேவையகத்தின் டொமைன். நான் இப்போதே கவனிக்கிறேன்: ஆம், நீங்கள் சேவையகத்தின் ஒரு குறிப்பிட்ட ஐபி முகவரியைக் குறிப்பிடலாம், எங்கள் மாநிலம், நியாயமான போராட்டத்தின் தூண்டுதலில், நான் சொல்வேன், எனக்குத் தெரியாது, அணுகலைத் தடுக்கும் வரை DigitalOcean மற்றும் Amazon "மேகங்கள்" ஆகியவற்றின் சிங்கத்தின் பங்கு. நீங்கள் குறியீட்டு டொமைனைப் பயன்படுத்தினால், அதுபோன்ற சம்பவம் நடந்தால், நீங்கள் எளிதாக ஒரு காப்பு மேகத்தை உருவாக்கலாம், டொமைனை அதற்குத் திருப்பிவிடலாம் மற்றும் சாதன கண்காணிப்பை மீட்டெடுக்கலாம்.

a.php என்பது சர்வர் பக்க ஸ்கிரிப்ட்டின் பெயர். ஆம், ஒரே எழுத்தில் மாறிகள் மற்றும் கோப்பு பெயர்களை பெயரிடுவது தவறு என்று எனக்குத் தெரியும்... கோரிக்கையை அனுப்பும்போது சில பைட்டுகளைச் சேமிக்க பரிந்துரைக்கிறேன் :)
u - பயனர்பெயர், வன்பொருள் உள்நுழைவு
p - கடவுச்சொல்
“-O /tmp/wa.sh” என்பது ரிமோட் ரூட்டரில் உள்ள ஒரு கோப்பு, அங்கு சேவையக பதில், எடுத்துக்காட்டாக, மறுதொடக்கம் கட்டளை சேமிக்கப்படும்.

குறிப்பு எண் இரண்டு: ஆஹா, நாங்கள் ஏன் wget ஐப் பயன்படுத்துகிறோம், சுருட்டை அல்ல, ஏனெனில் கர்ல் மூலம் நீங்கள் https கோரிக்கைகளை GET மூலம் அனுப்ப முடியாது, ஆனால் POST மூலம் அனுப்பலாம்? ஆஹா, ஏனெனில், "NE ஜாடிக்குள் ஏறுகிறது!" என்ற பழைய நகைச்சுவையைப் போல. curl ஆனது சுமார் 2MB அளவுள்ள குறியாக்க நூலகங்களை உள்ளடக்கியது, மேலும் இதன் காரணமாக நீங்கள் ஒரு சிறிய TP-LINK ML3020 க்கு ஒரு படத்தை வரிசைப்படுத்துவது சாத்தியமில்லை. மற்றும் wget உடன் - தயவுசெய்து.

2) சர்வர் பக்கத்தில் (என்னிடம் உபுண்டு உள்ளது) நாம் 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 கோப்பு (இது ஜாபிக்ஸ் ஏஜெண்டின் ஸ்கிரிப்ட் ஆகும்):

<?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

கருத்தைச் சேர்