80 port vasitəsilə Lunix/OpenWrt/Lede əsaslı cihazların uzaqdan monitorinqi və nəzarəti…

Hər kəsə salam, bu mənim Habré ilə bağlı ilk təcrübəmdir. Xarici şəbəkədə şəbəkə avadanlığının qeyri-standart şəkildə idarə edilməsi haqqında yazmaq istəyirəm. Qeyri-standart nə deməkdir: əksər hallarda xarici şəbəkədəki avadanlıqları idarə etmək üçün sizə lazımdır:

  • İctimai IP ünvanı. Yaxşı və ya avadanlıq kiminsə NAT-ın arxasındadırsa, ictimai IP və "yönləndirilmiş" port.
  • Tunel (PPTP/OpenVPN/L2TP+IPSec və s.) onun vasitəsilə əldə edilə biləcəyi mərkəzi node.

Buna görə də, standart üsullar sizə uyğun gəlməyəndə “mənim velosipedim”ə ehtiyacınız olacaq, məsələn:

  1. Avadanlıq NAT-ın arxasında yerləşir və adi http (port 80) istisna olmaqla, hər şey bağlıdır. Bu, böyük federal korporativ şəbəkələr üçün tamamilə normal bir vəziyyətdir. Onlar portları qeydiyyatdan keçirə bilər, lakin dərhal, tez və sizin üçün deyil.
  2. Qeyri-sabit və/və ya “dar” rabitə kanalı. Aşağı sürət, daimi itkilər. Tunel təşkil etməyə çalışarkən ağrı və məyusluq.
  3. Bahalı rabitə kanalı, burada sözün əsl mənasında hər meqabayt sayılır. Məsələn, peyk rabitəsi. Üstəlik uzun gecikmələr və "dar" bant.
  4. Bir tərəfdən imkanları genişləndirmək üçün OpenWrt/Lede quraşdırılmış, digər tərəfdən isə marşrutlaşdırıcının resursları (yaddaş) kifayət qədər olmayan çoxlu sayda kiçik marşrutlaşdırıcı ilə "həqq-hesab etmək" lazım olan bir vəziyyət. hər şey üçün.

Nömrəni qeyd edin Routerin USB portuna bir flash sürücü quraşdırmağa və marşrutlaşdırıcının yaddaşını genişləndirməyə nə mane olur?

Çox vaxt tələblər bütövlükdə həllin dəyərinə aiddir, lakin bəzən forma faktoru da əsas rol oynayır. Məsələn, saytda TP-Link ML3020 var, onun yeganə USB portu 2G/3G modem üçün istifadə olunur, bütün bunlar bir növ kiçik plastik qutuya bükülür və hündür, hündür yerdə (dirəkdə), uzaqda, uzaqda (tarlada, ən yaxın mobil operator baza stansiyasından 30 km). Bəli, siz USB mərkəzini qoşa və portların sayını artıra bilərsiniz, lakin təcrübə göstərir ki, bu, çətin və etibarsızdır.

Beləliklə, mən sizə tipik vəziyyətimi təsvir etməyə çalışdım: “bir yerdə, çox uzaqda, Linux ilə işləyən çox vacib, tənha və kiçik bir marşrutlaşdırıcı var. Gündə ən azı bir dəfə onun "sağ" olduğunu bilmək vacibdir və lazım olduqda ona əmrlər göndərilir, məsələn, "balı, yenidən başladın!"

Gəlin icraya keçək:

1) Router tərəfində, cron vasitəsilə, hər 5/10/1440 dəqiqədən bir və ya istədiyiniz zaman, wget istifadə edərək serverə http sorğusu göndərməli, sorğunun nəticəsini faylda saxlamalı, faylı icra edilə bilən hala gətirməlisiniz. , və icra edin.

Mənim cron xəttim belə görünür:

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

harada:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai mənim serverimin domenidir. Dərhal qeyd edim: bəli, serverin konkret IP ünvanını təyin edə bilərsiniz, biz bunu dövlətimizə qədər, ədalətli mübarizə impulsunda, deyəcəyəm, bilmirəm, aslanın girişini blokladıq. DigitalOcean və Amazon "buludlarının" payı. Əgər simvolik domendən istifadə edirsinizsə, belə bir hadisə baş verərsə, asanlıqla ehtiyat buludunu qaldıra, domeni ona yönləndirə və cihaz monitorinqini bərpa edə bilərsiniz.

a.php server tərəfindəki skriptin adıdır. Bəli, mən dəyişənlərin və fayl adlarının eyni hərflə adlandırılmasının düzgün olmadığını bilirəm... Təklif edirəm ki, bu yolla sorğu göndərən zaman bir neçə bayt qənaət edək :)
u - istifadəçi adı, aparat girişi
p - parol
“-O /tmp/wa.sh” server cavabının, məsələn, yenidən yükləmə əmrinin saxlanacağı uzaq marşrutlaşdırıcıda fayldır.

İkinci qeyd: Ahhh, niyə curl deyil, wget istifadə edirik, çünki curl vasitəsilə https sorğularını GET ilə deyil, POST ilə göndərə bilərsiniz? Ahhh, çünki köhnə zarafatda olduğu kimi "NE bankaya dırmaşır!" curl, təxminən 2MB ölçüsündə şifrələmə kitabxanalarını ehtiva edir və buna görə, məsələn, kiçik bir TP-LINK ML3020 üçün şəkil yığa bilməyəcəksiniz. Və wget ilə - xahiş edirəm.

2) Server tərəfində (Məndə Ubuntu var) biz Zabbix-dən istifadə edəcəyik. Niyə: Mən onun gözəl (qrafiklərlə) və rahat olmasını istəyirəm (kontekst menyusu vasitəsilə əmrlər göndərin). Zabbix-də zabbix agenti kimi gözəl bir şey var. Agent vasitəsilə biz serverdə PHP skriptini çağıracağıq və bu, marşrutlaşdırıcımızın tələb olunan müddət ərzində qeydiyyatdan keçib-keçməməsi barədə məlumatı qaytaracaq. Qeydiyyat vaxtı, cihazlar üçün əmrlər haqqında məlumat saxlamaq üçün mən təxminən aşağıdakı sahələri olan ayrı bir cədvəl istifadəçiləri olan MySQL-dən istifadə edirəm:

		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;

Bütün mənbələri Git deposundan yükləmək olar: https://github.com/BazDen/iotnet.online.git
İndi PHP skriptləri server tərəfində yerləşdirilib (rahatlıq üçün onları /usr/share/zabbix/ qovluğuna yerləşdirmək olar):

a.php faylı:

<?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 faylı (bu, zabbix agentinin skriptidir):

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

Yaxşı, son mərhələ: agentin qeydiyyatı və cədvəllərin əlavə edilməsi.

Zabbix agentini hələ quraşdırmamısınızsa, onda:

apt-get install zabbix-agent

/etc/zabbix/zabbix_agentd.conf faylını redaktə edin.

Xətti əlavə edin:

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

harada:
test agentimizin adıdır
“php /usr/share/zabbix/agent.php istifadəçi parolu” - cihazın qeydiyyat məlumatlarını göstərən adlanan skript.

Diaqramların əlavə edilməsi: zabbix veb interfeysini açın, menyudan seçin:
Parametrlər -> Şəbəkə qovşaqları -> Şəbəkə qovşağı yaradın. Burada şəbəkə hostunun adını, onun qrupunu və standart agent interfeysini təyin etmək kifayətdir:

80 port vasitəsilə Lunix/OpenWrt/Lede əsaslı cihazların uzaqdan monitorinqi və nəzarəti…

İndi bu şəbəkə node üçün məlumat elementi əlavə etməliyik. İki sahəyə diqqət yetirin: "açar" - bu, /etc/zabbix/zabbix_agentd.conf faylında yazdığımız parametrdir (bizim vəziyyətimizdə bu testdir) və "yeniləmə intervalı" - 5 dəqiqəyə təyin etdim. , çünki və avadanlıq da hər beş dəqiqədə bir dəfə serverdə qeydə alınır.

80 port vasitəsilə Lunix/OpenWrt/Lede əsaslı cihazların uzaqdan monitorinqi və nəzarəti…

Yaxşı, bir qrafik əlavə edək. Render üslubu kimi “Doldur” seçimini tövsiyə edirəm.

80 port vasitəsilə Lunix/OpenWrt/Lede əsaslı cihazların uzaqdan monitorinqi və nəzarəti…

Çıxış çox lakonik bir şeydir, məsələn:

80 port vasitəsilə Lunix/OpenWrt/Lede əsaslı cihazların uzaqdan monitorinqi və nəzarəti…

Ağlabatan suala: "buna dəyər idimi?" Cavab verəcəyəm: yaxşı, əlbəttə ki, məqalənin əvvəlində "velosiped yaratmağın səbəbləri"nə baxın.

Əgər mənim ilk qrafoman təcrübəm oxucuların marağına səbəb olarsa, o zaman növbəti məqalələrdə uzaq avadanlıqlara əmrlərin necə göndərilməsini təsvir etmək istəyirəm. Biz həmçinin RouterOS (Mikrotik) əsasında cihazlar üçün bütün sxemi həyata keçirə bildik.

Mənbə: www.habr.com

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