Lunix/OpenWrt/Lede-ի վրա հիմնված սարքերի հեռակա մոնիտորինգ և կառավարում 80 պորտի միջոցով…

Բարև բոլորին, սա իմ առաջին փորձն է 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 հանգույցը և ընդլայնել պորտերի քանակը, բայց փորձը ցույց է տալիս, որ դա դժվար է և անվստահելի:

Այսպիսով, ես փորձեցի ձեզ նկարագրել իմ բնորոշ իրավիճակը. «ինչ-որ տեղ հեռու, հեռու, կա շատ կարևոր, միայնակ և փոքր երթուղիչ, որն աշխատում է Linux-ով: Կարևոր է գոնե օրական մեկ անգամ իմանալ, որ նա «կենդանի է», և անհրաժեշտության դեպքում նրան հրամաններ են ուղարկվում, օրինակ՝ «սիրելի՛ս, վերագործարկի՛ր»:

Անցնենք իրականացմանը.

1) Երթուղիչի կողմից, cron-ի միջոցով, ամեն 5/10/1440 րոպեն մեկ կամ երբ ցանկանաք, դուք պետք է http հարցում ուղարկեք սերվերին wget-ի միջոցով, պահեք հարցման արդյունքը ֆայլում, ֆայլը գործարկելի դարձրեք: , և կատարիր այն։

Իմ cron գիծը նման է հետևյալին.

Ֆայլ /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»-ը հեռակառավարվող երթուղիչի ֆայլ է, որտեղ սերվերի պատասխանը, օրինակ՝ reboot հրամանը, կպահվի:

Նշում թիվ երկու. Աաաաաաա, ինչի՞ ենք օգտագործում wget-ը և ոչ թե curl-ը, որովհետև curl-ի միջոցով կարող եք https հարցումներ ուղարկել ոչ թե GET-ով, այլ POST-ով։ Ահ, որովհետև, ինչպես հին կատակում էր, «NE մագլցում է սափորի մեջ»: curl-ը ներառում է մոտ 2 ՄԲ չափի գաղտնագրման գրադարաններ, և այդ պատճառով քիչ հավանական է, որ դուք կարողանաք պատկեր հավաքել, օրինակ, փոքր TP-LINK ML3020-ի համար: Իսկ wget-ով - խնդրում եմ:

2) Սերվերի կողմից (ես ունեմ Ubuntu) մենք կօգտագործենք 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 վեբ ինտերֆեյսը, ընտրեք ընտրացանկից.
Կարգավորումներ -> Ցանցային հանգույցներ -> Ստեղծեք ցանցային հանգույց: Այստեղ բավական է նշել ցանցի հոսթի անունը, նրա խումբը և լռելյայն գործակալի միջերեսը.

Lunix/OpenWrt/Lede-ի վրա հիմնված սարքերի հեռակա մոնիտորինգ և կառավարում 80 պորտի միջոցով…

Այժմ մենք պետք է ավելացնենք տվյալների տարր այս ցանցային հանգույցի համար: Ուշադրություն դարձրեք երկու դաշտին. «բանալին» - սա հենց այն պարամետրն է, որը մենք գրել ենք /etc/zabbix/zabbix_agentd.conf ֆայլում (մեր դեպքում դա թեստ է) և «թարմացման ընդմիջում» - ես այն սահմանել եմ 5 րոպե: , քանի որ և սարքավորումները նույնպես գրանցվում են սերվերում հինգ րոպեն մեկ։

Lunix/OpenWrt/Lede-ի վրա հիմնված սարքերի հեռակա մոնիտորինգ և կառավարում 80 պորտի միջոցով…

Դե, եկեք ավելացնենք գրաֆիկ: Ես խորհուրդ եմ տալիս ընտրել «Լրացնել»՝ որպես մատուցման ոճ:

Lunix/OpenWrt/Lede-ի վրա հիմնված սարքերի հեռակա մոնիտորինգ և կառավարում 80 պորտի միջոցով…

Արդյունքը շատ լակոնիկ բան է, օրինակ՝ այսպես.

Lunix/OpenWrt/Lede-ի վրա հիմնված սարքերի հեռակա մոնիտորինգ և կառավարում 80 պորտի միջոցով…

Խելամիտ հարցին՝ «արժե՞ր», ես կպատասխանեմ՝ լավ, իհարկե, տես հոդվածի սկզբում «հեծանիվ ստեղծելու պատճառները»։

Եթե ​​իմ առաջին գրաֆոմանական փորձը առաջացնում է ընթերցողների հետաքրքրությունը, ապա հաջորդ հոդվածներում ես ուզում եմ նկարագրել, թե ինչպես կարելի է հրամաններ ուղարկել հեռավոր սարքավորումներին: Մեզ հաջողվեց նաև իրականացնել RouterOS-ի (Mikrotik) վրա հիմնված սարքերի ամբողջ սխեման:

Source: www.habr.com

Добавить комментарий