Мониторинг ва назорати дурдасти дастгоҳҳои 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 дақиқа ё ҳар вақте ки шумо мехоҳед, ба сервер бо истифода аз wget дархости http фиристед, натиҷаи дархостро дар файл захира кунед, файлро иҷрошаванда гардонед. , ва онро иҷро кунед.

Хати 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" ин файл дар роутери дурдаст аст, ки дар он вокуниши сервер, масалан фармони аз нав оғоз кардан захира карда мешавад.

Эзоҳ рақами дуюм: Ahhh, чаро мо 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) амалӣ созем.

Манбаъ: will.com

Илова Эзоҳ