ווייַט מאָניטאָרינג און קאָנטראָל פון Lunix / OpenWrt / Lede באזירט דעוויסעס דורך פּאָרט 80 ...

העלא אַלעמען, דאָס איז מיין ערשטער דערפאַרונג אויף Habré. איך ווילן צו שרייַבן וועגן ווי צו פירן נעץ ויסריכט אויף אַ פונדרויסנדיק נעץ אין אַ ניט-נאָרמאַל וועג. וואָס טוט ניט-נאָרמאַל מיינען: אין רובֿ קאַסעס, צו פירן ויסריכט אויף אַ פונדרויסנדיק נעץ איר דאַרפֿן:

  • ציבור IP אַדרעס. נו, אָדער אויב די ויסריכט איז הינטער עמעצער ס NAT, דעמאָלט אַ עפנטלעך IP און אַ "פאָרווערדיד" פּאָרט.
  • טונעל (PPTP/OpenVPN/L2TP+IPSec, אאז"ו ו) צו די הויפט נאָדע דורך וואָס עס וואָלט זיין צוטריטלעך.

דעריבער, איר וועט דאַרפֿן "מיין בייק" ווען נאָרמאַל מעטהאָדס טאָן ניט פּאַסן איר, למשל:

  1. די ויסריכט איז ליגן הינטער NAT און, אַחוץ פֿאַר די געוויינטלעך http (פּאָרט 80), אַלץ איז פֿאַרמאַכט. דאָס איז אַ גאָר נאָרמאַל סיטואַציע פֿאַר גרויס פעדעראלע פֿירמע נעטוואָרקס. זיי קענען פאַרשרייַבן פּאָרץ, אָבער נישט גלייך, נישט געשווינד און נישט פֿאַר איר.
  2. Нестабильный и/или «узкий» канал связи. Маленькая скорость, постоянные потери. Боль и разочарование при попытке организовать туннель.
  3. Дорогой канал связи, где буквально каждый мегабайт на счету. Например спутниковая связь. Плюс большие задержки и «узкая» полоса.
  4. Ситуация, когда Вам надо «жонглировать» большим количеством маленьких роутеров, на которых с одной стороны установлена OpenWrt/Lede для расширения возможностей, а с другой стороны ресурсов (памяти) роутера хватает далеко не на все.

באַמערקונג נומער מאל וואָס פּריווענץ איר צו ינסטאַלירן אַ בליץ פאָר אין די וסב פּאָרט פון די ראַוטער און יקספּאַנד די זכּרון פון די ראַוטער?

רובֿ אָפט, די רעקווירעמענץ זענען פֿאַר די פּרייַז פון די לייזונג ווי אַ גאַנץ, אָבער מאל די פאָרעם פאַקטאָר אויך פיעסעס אַ שליסל ראָלע. צום ביישפּיל, עס איז אַ TP-Link ML3020 אויף דעם פּלאַץ, זיין בלויז וסב פּאָרט איז געניצט פֿאַר אַ 2G/3G מאָדעם, אַלע דעם איז אלנגעוויקלט אין אַ קליין פּלאַסטיק פאַל און געשטעלט ערגעץ הויך, הויך (אויף די מאַסטבוים), ווייַט, ווייַט אַוועק (אין פעלד, 30 קילאמעטער פון די ניראַסט רירעוודיק אָפּעראַטאָר באַזע סטאַנציע). יאָ, איר קענען צאַפּן אַ וסב כאַב און יקספּאַנד די נומער פון פּאָרץ, אָבער דערפאַרונג ווייזט אַז דאָס איז קאַמבערסאַם און אַנרילייאַבאַל.

אַזוי, איך געפרוווט צו באַשרייַבן צו איר מיין טיפּיש סיטואַציע: "ערגעץ ווייַט, ווייַט אַוועק, עס איז אַ זייער וויכטיק, עלנט און קליין ראַוטער פליסנדיק לינוקס. עס איז וויכטיק צו וויסן בייַ מינדסטער אַמאָל אַ טאָג אַז ער איז "לעבעדיק" און, אויב נייטיק, קאַמאַנדז זענען געשיקט צו אים, למשל, "האָניק, רעבאָאָט!"

לאָמיר גיין צו די ימפּלאַמענטיישאַן:

1) На стороне роутера по cron-у каждые 5/10/1440 минут, или когда угодно необходимо отсылать http-запрос на сервер с помощью wget, результат запроса сохранять в файл, файл делать исполняемым, и исполнять его.

מיין קרון שורה קוקט עפּעס ווי דאָס:

Файл /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 - נאמען, ייַזנוואַרג לאָגין
פּ - פּאַראָל
„-O /tmp/wa.sh“ — файл на удаленном роутере, куда будет сохранятся ответ сервера, например команда reboot.

Примечание номер два: אההה, פארוואס נוצן מיר wget און נישט קערל, ווייַל דורך קערל איר קענען שיקן https ריקוועס נישט מיט GET, אָבער מיט POST? אההה ווייל ווי אין דער אלטער וויץ "נע קריכט אריין אין סלוי!" קערל כולל ענקריפּשאַן לייברעריז פון וועגן 2 מב אין גרייס, און ווייַל פון דעם עס איז אַנלייקלי אַז איר קענען אַסעמבאַל אַ בילד פֿאַר אַ קליין TP-LINK ML3020, למשל. און מיט וגט - ביטע.

2) אויף די סערווער זייַט (איך האָבן ובונטו) מיר וועלן נוצן 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-ов).

מקור: www.habr.com

לייגן אַ באַמערקונג