Ufuatiliaji na udhibiti wa mbali wa vifaa vya msingi vya Lunix/OpenWrt/Lede kupitia bandari 80…

Hamjambo nyote, hii ni uzoefu wangu wa kwanza kwenye Habre. Ninataka kuandika kuhusu jinsi ya kusimamia vifaa vya mtandao kwenye mtandao wa nje kwa njia isiyo ya kawaida. Inamaanisha nini isiyo ya kawaida: katika hali nyingi, ili kudhibiti vifaa kwenye mtandao wa nje unahitaji:

  • Anwani ya IP ya umma. Naam, au ikiwa vifaa viko nyuma ya NAT ya mtu, basi IP ya umma na bandari "iliyotumwa".
  • Handaki (PPTP/OpenVPN/L2TP+IPSec, n.k.) hadi nodi ya kati ambayo ingepatikana.

Kwa hivyo, utahitaji "baiskeli yangu" wakati njia za kawaida hazikufaa, kwa mfano:

  1. Vifaa viko nyuma ya NAT na, isipokuwa kwa http ya kawaida (bandari 80), kila kitu kimefungwa. Hii ni hali ya kawaida kabisa kwa mitandao mikubwa ya ushirika ya shirikisho. Wanaweza kusajili bandari, lakini si mara moja, si haraka, na si kwa ajili yako.
  2. Njia ya mawasiliano isiyo imara na/au "nyembamba". Kasi ya chini, hasara za mara kwa mara. Maumivu na kuchanganyikiwa wakati wa kujaribu kuandaa handaki.
  3. Njia ya mawasiliano ya gharama kubwa, ambapo kila megabyte inahesabu. Kwa mfano, mawasiliano ya satelaiti. Pamoja na ucheleweshaji wa muda mrefu na bendi "nyembamba".
  4. Hali wakati unahitaji "juggle" idadi kubwa ya ruta ndogo, ambayo, kwa upande mmoja, OpenWrt / Lede imewekwa ili kupanua uwezo, na kwa upande mwingine, rasilimali (kumbukumbu) ya router haitoshi. kwa kila kitu.

Kumbuka nyakati za nambari Ni nini kinakuzuia kufunga gari la flash kwenye bandari ya USB ya router na kupanua kumbukumbu ya router?

Mara nyingi, mahitaji ni kwa gharama ya suluhisho kwa ujumla, lakini wakati mwingine sababu ya fomu pia ina jukumu muhimu. Kwa mfano, kuna TP-Link ML3020 kwenye tovuti, bandari yake pekee ya USB hutumiwa kwa modem ya 2G/3G, yote haya yamefungwa katika aina fulani ya kesi ndogo ya plastiki na kuwekwa mahali fulani juu, juu (kwenye mlingoti), mbali, mbali (katika shamba, kilomita 30 kutoka kituo cha karibu cha waendeshaji wa rununu). Ndiyo, unaweza kuunganisha kitovu cha USB na kupanua idadi ya bandari, lakini uzoefu unaonyesha kuwa hii ni ngumu na haiaminiki.

Kwa hiyo, nilijaribu kukuelezea hali yangu ya kawaida: "mahali fulani mbali, mbali, kuna router muhimu sana, ya upweke na ndogo inayoendesha Linux. Ni muhimu kujua angalau mara moja kwa siku kuwa "hai" na, ikiwa ni lazima, amri hutumwa kwake, kwa mfano, "asali, reboot!"

Wacha tuendelee kwenye utekelezaji:

1) Kwa upande wa router, kupitia cron, kila dakika 5/10/1440, au wakati wowote unataka, unahitaji kutuma ombi la http kwa seva kwa kutumia wget, kuokoa matokeo ya ombi kwa faili, fanya faili itekelezwe. , na kuitekeleza.

Mstari wangu wa cron unaonekana kitu kama hiki:

Faili /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

, ambapo:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai ni kikoa cha seva yangu. Nitakumbuka mara moja: ndio, unaweza kutaja anwani maalum ya IP ya seva, tulikuwa tukifanya hivi hadi hali yetu, kwa msukumo wa haki wa mapambano, nitasema, sijui, imezuia ufikiaji wa sehemu kubwa ya "mawingu" ya DigitalOcean na Amazon. Ikiwa unatumia kikoa cha mfano, tukio kama hilo likitokea, unaweza kuongeza wingu chelezo kwa urahisi, uelekeze kikoa kwake na urejeshe ufuatiliaji wa kifaa.

a.php ni jina la hati ya upande wa seva. Ndio, najua kuwa ni makosa kutaja vijiumbe na majina ya faili na herufi sawa... Ninapendekeza kwamba kwa njia hii tuhifadhi ka chache wakati wa kutuma ombi :)
u - jina la mtumiaji, kuingia kwa vifaa
p - nenosiri
"-O /tmp/wa.sh" ni faili kwenye kipanga njia cha mbali ambapo jibu la seva, kwa mfano amri ya kuwasha upya, itahifadhiwa.

Kumbuka namba mbili: Ahhh, kwa nini tunatumia wget na sio curl, kwa sababu kupitia curl unaweza kutuma maombi ya https sio na GET, lakini na POST? Ahhh kwa sababu, kama katika mzaha wa zamani "NE anapanda kwenye jar!" curl inajumuisha maktaba ya usimbaji fiche ya takriban 2MB kwa ukubwa, na kwa sababu hii hakuna uwezekano kwamba utaweza kukusanya picha kwa TP-LINK ML3020 ndogo, kwa mfano. Na na wget - tafadhali.

2) Kwa upande wa seva (nina Ubuntu) tutatumia Zabbix. Kwa nini: Nataka iwe nzuri (na grafu) na rahisi (tuma amri kupitia menyu ya muktadha). Zabbix ina kitu cha ajabu kama wakala wa zabbix. Kupitia wakala, tutaita hati ya PHP kwenye seva, ambayo itarejesha habari kuhusu ikiwa kipanga njia chetu kilisajiliwa katika muda unaohitajika. Ili kuhifadhi habari kuhusu wakati wa usajili, amri za vifaa, mimi hutumia MySQL, watumiaji wa jedwali tofauti na takriban sehemu zifuatazo:

		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;

Vyanzo vyote vinaweza kupakuliwa kutoka kwa hazina ya Git kwa: https://github.com/BazDen/iotnet.online.git
Sasa maandishi ya PHP yaliyowekwa kwenye upande wa seva (kwa urahisi, yanaweza kuwekwa kwenye /usr/share/zabbix/ folda):

a.php faili:

<?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();
	?>

Faili ya Agent.php (hii ni hati ya wakala wa zabbix inayoitwa):

<?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();
?>		

Kweli, hatua ya mwisho: kusajili wakala na kuongeza ratiba.

Ikiwa bado haujasakinisha wakala wa zabbix, basi:

apt-get install zabbix-agent

Hariri faili /etc/zabbix/zabbix_agentd.conf.

Ongeza mstari:

UserParameter=test,php /usr/share/zabbix/agent.php user password

, ambapo:
mtihani ni jina la wakala wetu
"php /usr/share/zabbix/agent.php nenosiri la mtumiaji" - hati inayoitwa inayoonyesha data ya usajili wa kifaa.

Kuongeza chati: fungua kiolesura cha wavuti cha zabbix, chagua kutoka kwenye menyu:
Mipangilio -> Nodi za mtandao -> Unda nodi ya mtandao. Hapa inatosha kutaja jina la mwenyeji wa mtandao, kikundi chake, na kiolesura cha wakala chaguo-msingi:

Ufuatiliaji na udhibiti wa mbali wa vifaa vya msingi vya Lunix/OpenWrt/Lede kupitia bandari 80…

Sasa tunahitaji kuongeza kipengele cha data kwa nodi hii ya mtandao. Zingatia sehemu mbili: "ufunguo" - hii ndio parameta ambayo tuliandika kwenye faili ya /etc/zabbix/zabbix_agentd.conf (kwa upande wetu ni mtihani), na "muda wa kusasisha" - niliiweka kwa dakika 5. , kwa sababu na vifaa pia vimesajiliwa kwenye seva mara moja kila dakika tano.

Ufuatiliaji na udhibiti wa mbali wa vifaa vya msingi vya Lunix/OpenWrt/Lede kupitia bandari 80…

Naam, hebu tuongeze grafu. Ninapendekeza kuchagua "Jaza" kama mtindo wa uwasilishaji.

Ufuatiliaji na udhibiti wa mbali wa vifaa vya msingi vya Lunix/OpenWrt/Lede kupitia bandari 80…

Pato ni kitu cha laconic sana, kwa mfano kama hii:

Ufuatiliaji na udhibiti wa mbali wa vifaa vya msingi vya Lunix/OpenWrt/Lede kupitia bandari 80…

Kwa swali la busara: "ilikuwa na thamani?", Nitajibu: vizuri, bila shaka, angalia "sababu za kuunda baiskeli" mwanzoni mwa makala.

Ikiwa uzoefu wangu wa kwanza wa graphomaniac huleta maslahi ya wasomaji, basi katika makala zifuatazo nataka kuelezea jinsi ya kutuma amri kwa vifaa vya mbali. Pia tuliweza kutekeleza mpango mzima wa vifaa kulingana na RouterOS (Mikrotik).

Chanzo: mapenzi.com

Kuongeza maoni