استمرت المراقبة والتحكم عن بعد في أجهزة Linux / OpenWrt / Lede عبر المنفذ 80

هذا هو الجزء الأخير من المقال ، ها هي البداية habr.com/ar/post/445568
آخر مرة كتبت فيها عن كيفية تنفيذ مراقبة الجهاز ، سنتحدث الآن عن الإدارة. في المناقشات مع "التقنيين" من جانب العميل ، غالبًا ما ألتقي بتصور محدود لإمكانيات هذه الأجهزة الصغيرة (مع موارد وأداء ذاكرة منخفضين) ، يعتقد الكثيرون أن "الحد الأقصى الذي نحتاجه هو إرسال إعادة تشغيل ، لشيء أكثر خطورة - سنرسل لواء ".
لكن الممارسة تدل على أن هذا ليس صحيحًا تمامًا. فيما يلي قائمة صغيرة بالمهام النموذجية الشائعة:

  1. تشخيصات الشبكة واستكشاف الأخطاء وإصلاحها. خلف منفذ إيثرنت لجهاز التوجيه الخاص بك ، عادة ما "تعيش" قطعة أخرى من الحديد ، ولها عنوان IP داخلي خاص بها. في بعض الأحيان ، يمكن (يجب) أن يتم "إرسال ضجيج". أو إدارة النفق - إذا لم يرتفع النفق فجأة على جهاز التوجيه يعمل من خلال مودم 3G ، لكننا نرى جهاز التوجيه نفسه.
  2. خدمة النظام. تحديث البرامج الثابتة ، ترقية البرامج النصية للخدمة.
  3. التوازن. يمكن أن يسمى هذا "الانحرافات" ، ولكن مفهوم "المشي على الحبل المشدود" كما أقتبس ، "قدرة فناني السيرك على الحفاظ على التوازن في وضع غير مستقر للجسم" - يناسب بشكل أفضل. تنشأ مثل هذه الحالات بسبب الميزانية المحدودة للعميل. أعطيت بعض الأمثلة أدناه ، لكن منذ ذلك الحين لا ترتبط بشكل مباشر بموضوع القصة ، أضعها في الملاحظات

مراقبة واي فايموضوع شائع على مدى السنوات الخمس الماضية ، وخاصة بين سلاسل البيع بالتجزئة الفيدرالية. أنت تتجول ببطء في طوابق التداول ، وهاتفك المحمول المزود بشبكة Wi-Fi قيد التشغيل ، في محاولة "للالتصاق" ببعض خيوط الشبكة ، يرسل بانتظام حزم طلب المسبار التي يمكن تحليلها من أجل الحساب نيابة عنك : كم مرة تأتي إلى هذا المتجر ، وما هي المسارات التي تمشي فيها وما إلى ذلك. علاوة على ذلك ، يتم جمع البيانات وتحليلها ورسم خرائط الحرارة ويقوم المديرون "بضرب" الأموال من الإدارة أو المستثمرين لمثل هذه الصور. في غضون ذلك ... "لا يوجد نقود ، لكنك تنتظر ..." ، والنتيجة (حقيقية) يجب أن تظهر بالفعل ، الأغنية القديمة الجيدة "نعم ، نعم ، بالطبع سنقوم بتزويد ciscos و ما تريده ، لكننا الآن بحاجة إلى إظهار النتيجة للعميل! بالمناسبة ، نسوا أن يقولوا إن العميل سمح بتوصيل أجهزتنا بنقطة الاتصال الخاصة به عبر Wi-Fi ، ولكن بشكل عام ، كما لو كنا عملاء ضيوف. والآن يتعين عليك إنشاء أجهزة توجيه متوازنة - ترتفع العديد من واجهات WiFi الفرعية ، أحدها يتمسك بالنقطة الساخنة ، والثاني يراقب البيئة ، ويفرغ نتيجة tcpdump بشكل محموم في نفسه ، ثم يحزم محتويات الملف في أرشيف و خطر الموت من "الإفراط في الأكل" محاولة بصق المحتويات إلى خادم بروتوكول نقل الملفات. ليس من المستغرب أن "يتعطل" جهاز التوجيه المتزن في كثير من الأحيان ويجب "إعادة تنشيطه" عن بُعد بطريقة ما.

نصف القطرمن الأسهل هنا وصف الموقف بشيء مثل هذا البيان للعميل: نريد شبكة لامركزية من النقاط الساخنة التي من شأنها أن تعمل على المعدات التي لا يعرف طرازها مسبقًا ، من خلال القنوات ، ولكن أي منها لا نعرفه حتى الآن. أوه ، لقد نسينا أن نقول ، نحن لا نريد فقط عرض الإعلانات للعملاء ، ولكن أيضًا نحلل كل شيء حول موقع تثبيت نقطة الاتصال. لا ، لا نعرف السبب حتى الآن ، لكننا سنخرج بها ، لا تتردد ، تمكنا من التوصل إلى هذه الفكرة ".

ويجب ألا ننسى أنه نظرًا لوجود الكثير من الظروف غير المؤكدة مسبقًا ، يجب تنفيذ الإدارة في ظروف غير قياسية ، عندما يتعذر علينا الاتصال بالموجه مباشرة عبر ip: port ونضطر إلى الانتظار ببساطة حتى يظهر النشاط من هو - هي. إذا قمنا بالتجريد ، فيمكن تمثيل الحوار بين الخادم والموجه على النحو التالي:

  • راوتر: مرحبًا. أنا كذا وكذا جهاز توجيه ، فهل هناك أي مهام لي؟
  • الخادم: كذا وكذا جهاز التوجيه ، لقد سجلت لك أنك على قيد الحياة. إليكم التحدي: أرني إخراج الأمر ifconfig؟
  • راوتر: مرحبًا. أنا كذا وكذا جهاز توجيه ، آخر مرة طلبت فيها إظهار نتيجة ifconfig ، ها هي. هل هناك مهام لي؟
  • الخادم: كذا وكذا جهاز التوجيه ، لقد سجلت لك أنك على قيد الحياة. لا توجد مهام لك.

السؤال الأكثر إثارة للاهتمام هو: كيف يمكن لجهاز التوجيه البعيد إرسال قدر معين من المعلومات؟ في الجزء الأخير ، وصفت أن جهاز التوجيه ، نظرًا لموارده المحدودة ، لديه فقط أداة wget "مجردة" ، والتي تعمل فقط من خلال GET ولا شيء آخر ، لا يوجد عميل ftp أو curl. بتعبير أدق ، نحتاج إلى طريقة عالمية ، بغض النظر عن ميزات تجميع الصورة. استقرت على استخدام wget. بتعبير أدق ، كيف "توقفت" - لم يكن لدي خيار

الحجز فورايعمل حل الإدارة الخاص بي ، وليس محدودًا للغاية ، وأنا متأكد من أنه معوج ، حتى لو كان يناسب معظم عملائي. كيف يمكن القيام بذلك بحكمة - اكتب أداة صغيرة ترسل بيانات ثنائية عبر POST عبر المنفذ 80. قم بتضمينه (فائدة) في البرنامج الثابت لجهاز التوجيه واستخدم bash للوصول إليه. لكن الحقيقة هي: أ) تحتاج إلى السرعة ب) ربما تحتاج إلى القيام بكل شيء على "حديقة حيوانات الموجهات" الحالية ج) "لا تسبب أي ضرر!" - إذا كان جهاز التوجيه يعمل ويؤدي مهام أخرى ، فحاول إجراء تغييرات لن تؤثر على الوظائف الحالية.

دعنا ننتقل إلى التنفيذ. لنفترض أن عميلك يريد من zabbix إعادة تشغيل جهاز التوجيه بسهولة وبشكل طبيعي ، من خلال "النقر بالماوس". اليوم سنبدأ وصف التنفيذ مع zabbix.
في قائمة "الإدارة" -> "البرامج النصية" أضف نصًا جديدًا. نسميها "إعادة التشغيل" ، كأمر نكتب "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 = password! & m = $ message - أوراق الاعتماد وقيمة متغير الاستعلام م - يخصص محتويات متغير الرسالة $
-O /tmp/out.txt - لا نحتاج إلى إخراج إلى ملف /tmp/out.txt في هذه الحالة ، ولكن إذا لم يتم تحديد هذه المعلمة ، فلن يعمل wget

لماذا هذا العمل خاطئلأنها ثغرة أمنية محتملة. أكثر الأخطاء غير الضارة التي يمكن أن تحدث هي إذا كان إخراج الأمر ، على سبيل المثال ، يحتوي على الرمز "&". لذلك ، من الضروري تصفية كل ما يتم إرساله من أجهزة التوجيه وكل ما يأتي إلى الخادم. نعم ، أشعر بالخجل حقًا. في دفاعي ، لا يمكنني إلا أن أكتب أن المقالة بأكملها مخصصة لكيفية إدارة أجهزة التوجيه ببرامج ثابتة غير محددة ، مع قنوات اتصال غير محددة.

حسنًا ، لقد تطرقت إلى المستقبل: لم أفهم بعد كيفية عكس النتائج (على سبيل المثال ، نتيجة تنفيذ الأمر) التي تأتي إلى الخادم باستخدام أدوات zabbix القياسية.

أذكرك أنه يمكن الحصول على جميع المصادر من مستودع Git على: github.com/BazDen/iotnet.online.git

المصدر: www.habr.com

إضافة تعليق