المراقبة عن بُعد وإدارة الأجهزة التي تستند إلى Linux / OpenWrt / Lede من خلال المنفذ 80 ...

مرحباً بالجميع ، هذه هي تجربتي الأولى في حبري. أريد أن أكتب عن كيفية إدارة معدات الشبكات غير القياسية في شبكة خارجية. ماذا يعني غير قياسي: في معظم الحالات ، للتحكم في المعدات في شبكة خارجية تحتاج إلى:

  • عنوان 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 دقيقة ، أو كلما احتجت إلى إرسال طلب http إلى الخادم باستخدام wget ، احفظ نتيجة الطلب إلى ملف ، وجعل الملف قابل للتنفيذ ، وقم بتنفيذه.

يبدو خطي في cron شيئًا مثل هذا:

ملف / الخ / كرونتاب / الجذر:

*/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 - اسم البرنامج النصي على جانب الخادم. نعم ، أعلم أنه من الخطأ تسمية المتغيرات وأسماء الملفات بحرف واحد ... أقترح أن نحفظ بضع بايت عند إرسال طلب :)
ش - اسم المستخدم ، تسجيل الدخول إلى الأجهزة
ع - كلمة المرور
"-O /tmp/wa.sh" هو الملف الموجود على جهاز التوجيه البعيد حيث سيتم حفظ استجابة الخادم ، على سبيل المثال ، أمر إعادة التشغيل.

ملاحظة رقم اثنين:
آه ، لماذا نستخدم wget ، وليس curl ، لأنه من خلال curl يمكنك إرسال طلبات https وليس الحصول عليها ، ولكن 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("Ymd 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 ، حدد من القائمة:
الإعدادات -> المضيفين -> إنشاء مضيف. يكفي تحديد اسم المضيف ، مجموعته ، واجهة الوكيل الافتراضية:



نحتاج الآن إلى إضافة عنصر بيانات لهذا المضيف. انتبه إلى حقلين: "المفتاح" هو بالضبط المعلمة التي حددناها في ملف /etc/zabbix/zabbix_agentd.conf (في حالتنا إنه اختبار) ، و "الفاصل الزمني للتحديث" - لقد قمت بتعيين 5 دقائق ، لأن ويتم تسجيل الجهاز على الخادم مرة واحدة كل خمس دقائق.



حسنا ، أضف الجدول. أوصي باختيار "Fill" كنمط الرسم.



الإخراج شيء موجز للغاية ، على سبيل المثال مثل هذا:



بالنسبة للسؤال المعقول: "هل كان يستحق كل هذا العناء؟" ، سأجيب: حسنًا ، بالطبع ، راجع "أسباب إنشاء دراجة" في بداية المقال.

إذا كانت تجربتي الأولى في الرسم البياني ستثير اهتمام القراء ، فأريد في المقالات التالية وصف كيفية إرسال الأوامر إلى المعدات عن بُعد. كان من الممكن أيضًا تنفيذ المخطط بالكامل للأجهزة القائمة على RouterOS (Mikrotiks).

Source: https://habr.com/ru/post/ar445568/


All Articles