نظارت و کنترل از راه دور دستگاه های Linux/OpenWrt/Lede از طریق پورت 80 ادامه یافت

این قسمت پایانی مقاله است، اینجا شروع است habr.com/fa/post/445568
آخرین باری که در مورد نحوه اجرای مانیتورینگ دستگاه نوشتم، اکنون در مورد مدیریت صحبت خواهیم کرد. در بحث با "تکنولوژیست ها" از طرف مشتری، من اغلب با درک محدودی از قابلیت های چنین دستگاه های کوچکی مواجه می شوم (با منابع حافظه و عملکرد کم)، بسیاری معتقدند که "حداکثر نیاز ما ارسال راه اندازی مجدد است. ، برای چیز جدی تر - ما یک تیپ می فرستیم" .
اما عمل نشان می دهد که این کاملا درست نیست. در اینجا لیست کوچکی از کارهای معمولی رایج است:

  1. عیب یابی و عیب یابی شبکه پشت درگاه اترنت روتر شما، قطعه آهن دیگری معمولاً "زندگی می کند" که آدرس IP داخلی خود را دارد. گاهی اوقات، می توان (باید) "پینگ" کرد. یا مدیریت تونل - اگر تونل به طور ناگهانی روی روتری که از طریق مودم 3G کار می کند بالا نرود، اما ما خود روتر را می بینیم.
  2. سرویس سیستم به روز رسانی سیستم عامل، ارتقاء اسکریپت های سرویس.
  3. تعادل ها این را می‌توان «انحرافات» نامید، اما مفهوم «طناب‌باز» همانطور که نقل می‌کنم، "توانایی یک بازیگر سیرک برای حفظ تعادل در وضعیت بدنی ناپایدار" - مناسب تر است چنین شرایطی به دلیل محدودیت بودجه مشتری ایجاد می شود. من چند مثال در زیر آوردم، اما از آن زمان آنها به طور مستقیم با موضوع داستان مرتبط نیستند، آنها را در یادداشت ها قرار داده ام

نظارت بر وای فایموضوعی مد روز در پنج سال گذشته، عمدتاً در میان زنجیره‌های خرده‌فروشی فدرال. شما به آرامی در اطراف طبقات معاملاتی راه می روید، و تلفن همراه شما با Wi-Fi روشن، در تلاش برای "چسبیدن" به برخی از رشته های شبکه، به طور منظم بسته های Probe Request را ارسال می کند که می تواند تجزیه و تحلیل شود تا برای شما محاسبه شود. : چند وقت یکبار به این فروشگاه می آیید، برای چه مسیرهایی قدم می زنید و غیره. علاوه بر این، داده‌ها جمع‌آوری، تجزیه و تحلیل، نقشه‌های حرارتی ترسیم می‌شوند و مدیران برای چنین عکس‌هایی پول را از مدیریت یا سرمایه‌گذاران خارج می‌کنند. در ضمن .... "هیچ پولی نیست، اما تو دست نگه دار ..."، و نتیجه (واقعی) باید قبلا نشان داده شود، آهنگ خوب قدیمی "بله، بله، پس البته ما سیسکوها و هر چه می خواهید، اما اکنون باید نتیجه را به مشتری نشان دهیم! ضمناً فراموش کردند که بگویند مشتری اجازه داده است که تجهیزات ما از طریق وای فای به هات اسپات او متصل شود، اما به طور کلی، درست مثل اینکه ما مشتری مهمان هستیم. و اکنون باید مسیریاب‌های تعادلی بسازید - چندین زیرواسط وای‌فای بالا می‌آیند، یکی از آنها به هات اسپات می‌چسبد، و دومی محیط را نظارت می‌کند، دیوانه‌وار نتیجه tcpdump را در خود تخلیه می‌کند، سپس محتویات فایل را در یک بایگانی بسته‌بندی می‌کند و خطر مرگ ناشی از "پرخوری" تلاش برای تف کردن محتویات به سرور ftp. تعجب آور نیست که روتر تعادلی اغلب "از کار می افتد" و به نحوی باید از راه دور "احیا مجدد" شود.

شعاعدر اینجا توصیف وضعیت با چیزی شبیه به این اظهارات مشتری آسان تر است: ما یک شبکه غیرمتمرکز از نقاط مهم می‌خواهیم که روی تجهیزاتی کار کند که مدل آن‌ها از قبل شناخته شده نیست، از طریق کانال‌هایی که هنوز نمی‌دانیم. آه، فراموش کردیم بگوییم، ما نه تنها می خواهیم تبلیغات را به مشتریان نشان دهیم، بلکه همه چیز را در اطراف سایت نصب هات اسپات تجزیه و تحلیل می کنیم. نه، ما هنوز نمی‌دانیم چرا، اما به آن می‌رسیم، تردید نکنید، ما توانستیم به این ایده برسیم.»

و ما نباید فراموش کنیم که به دلیل شرایط نامشخص زیادی از قبل، مدیریت باید در شرایط غیر استاندارد انجام شود، زمانی که نمی توانیم مستقیماً از طریق پورت ip: به روتر متصل شویم و مجبور هستیم به سادگی منتظر باشیم تا فعالیت از آن ظاهر شود. آی تی. اگر انتزاع کنیم، دیالوگ بین سرور و روتر می تواند به صورت زیر نمایش داده شود:

  • روتر: سلام. من فلان روتر هستم، آیا وظایفی برای من وجود دارد؟
  • سرور: فلان روتر، من شما را ثبت نام کردم که زنده هستید. چالش اینجاست: خروجی فرمان ifconfig را به من نشان دهید؟
  • روتر: سلام. من فلان روتر هستم، آخرین باری که خواستید نتیجه ifconfig را نشان دهید، اینجاست. آیا وظایفی برای من وجود دارد؟
  • سرور: فلان روتر، من شما را ثبت نام کردم که زنده هستید. هیچ وظیفه ای برای شما وجود ندارد.

جالب ترین سوال این است: چگونه یک روتر از راه دور می تواند مقدار مشخصی اطلاعات را ارسال کند؟ در قسمت آخر، توضیح دادم که به دلیل منابع محدود، روتر فقط یک wget "برداشته شده" دارد که فقط از طریق GET کار می کند و هیچ چیز دیگری، هیچ کلاینت یا curl ftp وجود ندارد. به طور دقیق تر، بدون در نظر گرفتن ویژگی های مونتاژ تصویر، به یک روش جهانی نیاز داریم. من تصمیم گرفتم از wget استفاده کنم. به طور دقیق تر، چگونه "متوقف شد" - من فقط چاره ای نداشتم 🙂

رزرو فوریراه حل مدیریت من کار می کند، نه خیلی محدود، و من مطمئن هستم که کج است، حتی اگر برای اکثر مشتریان من مناسب باشد. چگونه می توان آن را عاقلانه انجام داد - یک ابزار کوچک بنویسید که داده های باینری را از طریق POST از طریق پورت 80 ارسال می کند. آن را در سیستم عامل روتر قرار دهید و از bash برای دسترسی به آن استفاده کنید. اما واقعیت این است که: الف) باید به سرعت ب) احتمالاً باید همه چیز را در "باغ وحش روترهای" موجود انجام دهید ج) "هیچ آسیبی نرسانید!" - اگر روتر کار می کند و وظایف دیگری را انجام می دهد، سعی کنید تغییراتی ایجاد کنید که بر عملکرد موجود تأثیری نگذارد.

بیایید به سمت اجرا برویم. فرض کنید مشتری شما از zabbix می خواهد که روتر را به راحتی و به طور طبیعی با یک "کلیک ماوس" راه اندازی مجدد کند. امروز شرح پیاده سازی را با zabbix آغاز می کنیم.
در منوی "Administration" -> "Scripts" یک اسکریپت جدید اضافه کنید. ما آن را "Reboot" می نامیم، به عنوان یک دستور می نویسیم "php /usr/share/zabbix/reboot.php {HOST.HOST}"

نظارت و کنترل از راه دور دستگاه های Linux/OpenWrt/Lede از طریق پورت 80 ادامه یافت

بعد: منوی "مانیتورینگ" -> "آخرین داده ها" -> "روی میزبان مورد نظر کلیک راست کنید". پس از افزودن اسکریپت، منو به این صورت است.

نظارت و کنترل از راه دور دستگاه های Linux/OpenWrt/Lede از طریق پورت 80 ادامه یافت
بر این اساس، اسکریپت reboot.php را در پوشه /usr/share/zabbix قرار می دهیم (ممکن است برای شما متفاوت باشد، من از دایرکتوری ریشه zabbixa استفاده می کنم).

سلب مسئولیت ایمنیبرای وضوح توضیح در اسکریپت، من فقط از شناسه روتر استفاده می کنم، اما از رمز عبور استفاده نمی کنم. در نسخه کار این توصیه نمی شود! چرا این کار را انجام دادم: زیرا سوال بزرگ این است که رمز عبور روترها را کجا ذخیره کنیم؟ در خود zabbixe در "موجودی"؟ تمرین متناقض به عنوان یک گزینه: دسترسی خارجی را به خود فایل reboot.php محدود کنید

فایل reboot.php

<?php
	// присваиваем параметры с консоли переменным
	$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");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

در واقع همه چیز سوال "چگونه می توان نتیجه اجرای دستور را از سمت دستگاه دریافت کرد" باز باقی می ماند. بیایید کار را با استفاده از دستور ifconfig به عنوان مثال در نظر بگیریم. دستور زیر را می توان به دستگاه ارسال کرد:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

، جایی که:
message=`ifconfig` - نتیجه خروجی دستور ifconfig را به متغیر $message اختصاص می دهیم
wget "xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php - اسکریپت a.php ما که روترها را ثبت می کند و از آنها پیام دریافت می کند
u=user&p=رمز عبور!&m=$پیام - اعتبار و مقدار متغیر query m - محتویات متغیر $message را اختصاص می دهد.
-O /tmp/out.txt - در این مورد نیازی به خروجی فایل /tmp/out.txt نداریم، اما اگر این پارامتر مشخص نشده باشد، wget کار نمی کند.

چرا این کار اشتباه استزیرا یک حفره امنیتی بالقوه است. بی ضررترین اشتباهی که می تواند اتفاق بیفتد این است که خروجی دستور شما مثلاً دارای علامت "&" باشد. بنابراین لازم است هر چیزی که از روترها ارسال می شود و هر چیزی که به سرور می آید فیلتر شود. آره واقعا شرمنده ام در دفاع از خود، فقط می توانم بنویسم که کل مقاله به نحوه مدیریت روترها با سیستم عامل تعریف نشده، با کانال های ارتباطی تعریف نشده اختصاص دارد.

خوب، من به آینده دست زدم: هنوز نفهمیدم که چگونه نتایجی را که با استفاده از ابزارهای استاندارد zabbix به سرور می‌آیند (به عنوان مثال، نتیجه اجرای دستور) منعکس کنم.

به شما یادآوری می کنم که همه منابع را می توان از مخزن Git در آدرس زیر برداشت کرد: github.com/BazDen/iotnet.online.git

منبع: www.habr.com

اضافه کردن نظر