وفقًا لموقعي ssh.com و Wikipedia ، تم إصدار الإصدار الأول من بروتوكول SSH وتطبيقه في عام 1995. كانت مهمة المؤلف هي تطوير بديل آمن لـ rlogin و telnet و rsh ، والذي تم استخدامه بعد ذلك للإدارة عن بُعد. من الغريب أن ظهور بروتوكول SSH كان سهلاً بسبب حادث أمن المعلومات ، ونتيجة لذلك جمع المهاجم قاعدة بيانات رائعة لأسماء المستخدمين / كلمات المرور من الخوادم ، ببساطة الاستماع إلى شبكة الجامعة واستخراج حزم المصادقة (تم إرسال أزواج اسم المستخدم / كلمة المرور في شكل غير مشفر).
اكتسب البروتوكول شعبية بسرعة ، وبعد فترة طويلة من التحسينات والتحسينات ، تم توحيده بواسطة IETF في عام 2006. منذ ذلك الحين ، تمكن من أن يصبح المعيار الفعلي للإدارة عن بعد لأنظمة النص. بالإضافة إلى وحدة التحكم في النص نفسها ، يوفر البروتوكول مجموعة من الوظائف المفيدة الأخرى ، مثل نقل الملفات وإعادة توجيه المنفذ. إنه يتعلق بإعادة توجيه المنفذ وتطبيقه غير الواضح الذي سيتم مناقشته في هذه المقالة.
يوفر بروتوكول SSH وضعين لإعادة توجيه المنفذ - للأمام والخلف. يتيح لك الوضع المباشر فتح منفذ TCP للاستماع من جانب عميل SSH وإعادة توجيه جميع الاتصالات إلى هذا المنفذ إلى جانب الخادم.

على سبيل المثال ، إذا كان خادم سطح المكتب البعيد (RDS) قيد التشغيل على خادم SSH الخاص بنا ، فيمكننا استخدام بروتوكول SSH للاتصال بهذا الخادم حتى لو لم يكن الاتصال المباشر بالشبكة ممكنًا (على سبيل المثال ، يتم حظره بواسطة جدار الحماية). مثل هذا:

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

عند الجمع بين هذين الوضعين ومثالنا مع خادم سطح المكتب البعيد ، يمكنك الحصول على هذا التكوين:

للوهلة الأولى ، يبدو زائدة عن الحاجة. لكن مع التكرار الظاهر ، حصلنا على خاصيتين مهمتين:
- الشيء الوحيد المطلوب للشبكة حتى يعمل مثل هذا المخطط بشكل صحيح هو التأكد من عنوان الشبكة للمضيف حيث يوجد خادم SSH. يمكن للعُقد التي يعمل عليها خادم RDS والعميل تغيير عناوين شبكتهما على الأقل كل دقيقة (أو يمكن أن يكون لهما عناوين على الشبكة الخاصة ، نحتاج فقط إلى NAT الصادرة ، والتي يشار إليها غالبًا باسم "اتصال الإنترنت").
- على الرغم من حقيقة أن خادم RDS يمكن الوصول إليه من أي مكان على الإنترنت ، لا يمكن للمستخدمين الآخرين الاتصال به (شريطة عدم وجود ثغرات في خادم SSH). ونظرًا لأن بروتوكول RDS له تحكمه في الوصول ، حتى في حالة حدوث هجوم ناجح على خادم SSH ، سيحتاج المهاجم أيضًا إلى تنفيذ هجوم على RDS. إن احتمال وجود ثغرة أمنية في خادم SSH وضعف خادم RDS أقل بكثير من هذا الاحتمال لكل مكون على حدة.
إذا نظرت عن كثب ، في هذا المخطط ، يمكنك رؤية شبكتي كمبيوتر مستقلتين. نقل واحد - يسمح لك بإنشاء اتصالات SSH. آخر - داخلي - يستخدم للأغراض المطبقة. سنحاول استخلاص بعض الاستنتاجات المثيرة للاهتمام من هذه الملاحظة في مقالات لاحقة ، ولكن الآن ، دعونا نعود إلى تجاربنا.
الاتصال بجهاز الكمبيوتر المنزلي الخاص بك
في فناء القرن الحادي والعشرين ، يستغرق تسليم حزمة شبكة من سيبيريا إلى كاليفورنيا 0.1 ثانية ، العالم كله متشابك في شبكات الكمبيوتر ، وحتى TCP / IP في فرشاة الأسنان. يبدو أنه مع مثل هذا الربط بين كل شيء وكل شيء ، كان ينبغي أن نكون قادرين على التحكم في جهاز كمبيوتر منذ وقت طويل ، ليس فقط من خلال التواجد المادي بالقرب من أجهزة الإدخال ، ولكن أيضًا عن بُعد ، عبر الشبكة. علاوة على ذلك ، هناك الكثير من التقنيات والبروتوكولات لهذا الغرض. Microsoft Remote Desktop ، أشكال VNC في أنظمة * nix ، حلول Citrix ، الآلاف منها ... ومع ذلك ، يمكن أن يتباهى القليل منا بالقدرة على الاتصال بجهاز الكمبيوتر المنزلي الخاص بنا من أي مكان في العالم باستخدام أي من هذه التقنيات.
هناك سببان وراء قلة قدرة التباهي بالاتصال بجهاز الكمبيوتر المنزلي الخاص بهم ، وهم متصلون ببعضهم البعض. الأول هو عدم وجود عنوان كمبيوتر منزلي نموذجي في الشبكة العالمية. تعود جذور هذه الحالة إلى عام 1981 ، حيث تم وصف معيار IPv4 لأول مرة ، والذي يستخدم حتى يومنا هذا (بحد ذاته ، مع التغييرات والإضافات) لمعالجة معظم المواقع على الإنترنت. قرر مؤلفو المعيار أن مساحة العنوان بسعة 3.7 مليار عنوان كافية لجميع الأجهزة في العالم ، ولكن تبين أن الواقع قاسي. لا يتوقع أن يكون IPv4 Internet متاحًا بحلول سبتمبر 2019.
بالإضافة إلى ذلك ، قد يتمتع مستخدم الإنترنت المعتاد الذي لا يستضيف مواقع الويب بكل فوائد الحضارة دون وجود عنوان على الشبكة العالمية ، بدلاً من ذلك يقتصر فقط على عنوان على شبكة خاصة ومزود NAT. بمعنى آخر ، بالنسبة لمعظم مستخدمي الإنترنت ، لا يوجد فرق بين وجود وغياب عنوان IP عالمي لمعداتهم. في مثل هذه الظروف ، يتناقص بسرعة عدد الذين يصدر لهم مزود عنوان IP عالمي في الشبكة العالمية. نتيجة لذلك ، يوجد كمبيوتر منزلي نموذجي على شبكة خاصة ، وليس لديه عنوان عالمي. حتى إذا كان الموفر لا يزال يعين جهاز المستخدم عنوانًا في الشبكة العالمية ، فإن هذا الجهاز هو جهاز توجيه منزلي يقوم بإجراء NAT من شبكة منزلية خاصة. يمكن للمستخدم ، بالطبع ، "إعادة توجيه المنفذ" على جهاز التوجيه ، ولكن حتى في أفضل هذه الحالات ، يمكن أن يتغير العنوان العالمي لجهاز التوجيه من يوم لآخر. نعم ، هناك مزوّدون يقدمون خدمة "Static IP" مقابل رسوم متواضعة ، لكن في الممارسة العملية ، بحلول هذا الوقت ، يدرك المستخدم أن اللعبة لا تستحق كل هذا العناء ، وإذا كنت بحاجة إلى القيام بشيء ما باستخدام الكمبيوتر المنزلي ، فيمكنك أيضًا الاتصال للاتصال.
يمكن للأكثر ثباتًا متابعة هذا المسعى حتى النهاية ومواجهة السبب الثاني الذي يجعل فتح الوصول إلى أجهزة الكمبيوتر الخاصة بهم عبر الإنترنت هو الترفيه فقط لأولئك الذين يتمتعون بروح قوية. هذا السبب شائع - أمن المعلومات. الشبكة العالمية عالمية ، عاجلاً أم آجلاً ، شخص ما من الطرف الآخر من العالم وبنوايا سيئة سيطرق بابك. لا يعد مسح المنفذ المفتوح الذي يرد عليه خادم سطح المكتب البعيد مهمة صعبة للغاية ، وتأكد أن TCP SYN سيصل عاجلاً أم آجلاً إلى منفذك السري للغاية 32167 من قرية صينية.
بالعودة إلى إعادة توجيه منفذنا الغريب باستخدام SSH ، ستلاحظ أن ميزاته تلغي كلا السببين.
بناء نفسك TeamViewer
تحتاج إلى إجراء حجز على الفور أن برنامج TeamViewer هو منتج رائع له عدد كبير من القدرات المختلفة جدًا. كجزء من هذه المقالة ، سنجمع فقط لأنفسنا وسيلة للاتصال بأمان عبر الإنترنت عبر بروتوكول سطح المكتب البعيد إلى جهاز كمبيوتر يقع خلف NAT. ومع ذلك ، فإنني أجرؤ على اقتراح أن الاتصال بأي جهاز كمبيوتر مزود بإمكانية الوصول إلى الإنترنت هو الميزة المميزة الرئيسية لبرنامج TeamViewer ، نظرًا لأن هذا المنتج شائع جدًا. وهو بالضبط مثل هذا الاتصال الذي يمكننا تنفيذه بأيدينا ، وذلك باستخدام تكوين SSH الخاص بنا من الجزء الأول من المقال.
لذلك ، شروط المهمة: هناك جهاز كمبيوتر منزلي وجهاز كمبيوتر محمول ، وكلاهما يعمل بنظام Windows 10. من الضروري تمكين الكمبيوتر المحمول من الوصول إلى الكمبيوتر المنزلي باستخدام بروتوكول سطح المكتب البعيد من أي مكان في العالم. سيتضمن نظامنا خادم سطح المكتب البعيد الخاص بالكمبيوتر ، وجهاز كمبيوتر محمول مع عميل سطح المكتب البعيد ، وخادم SSH. خادم SSH هو المكون الوحيد الذي يتطلب عنوان IP عمومي وتوافر دائم. أسهل خيار لتلبية هذه المتطلبات هو استضافة خادم SSH في السحابة. يعد Yandex.Cloud رائعًا (يرجع بشكل أساسي إلى سياسة التسعير الخاصة به) ، لذلك سنستخدمه. والنتيجة هي مثل هذا:

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

بدءًا من أبريل 2018 ، أصبح لدى Windows 10 بالفعل عميل ssh بين الأدوات المساعدة لسطر الأوامر. سيساعدنا ذلك على تقليل انشغالنا عن طريق تثبيت برامج مختلفة والبدء في العمل على الفور. أولاً ، نقوم بإنشاء مفتاح لـ SSH. افتح shell PowerShell وقم بتنفيذ 'ssh-keygen'. عندما يتم سؤالنا عن كلمة المرور للمفتاح ، اتركها فارغة. بعد إنشاء المفتاح ، قم بعرض الجزء المفتوح الخاص به على وحدة التحكم باستخدام الأمر "cat $ HOME / .ssh / id_rsa.pub". نتيجة الأمر مفيدة لنا لبدء خادم SSH في السحابة. يجب أن تحصل على شيء مثل هذا:

نحتاج إلى نسخ الجزء الخاص من مفتاح SSH إلى الكمبيوتر المحمول. يكمن هذا الجزء من المفتاح في الملف "$ HOME / .ssh / id_rsa" (بدون اللاحقة ".pub") ، ويمكننا نسخه على شكل ملف عادي. على سبيل المثال ، باستخدام محرك أقراص فلاش USB (نفترض أنه مثبت على أنه محرك الأقراص F :)
copy $HOME/.ssh/id_rsa f:\
الآن تشغيل خادم SSH لدينا. إنشاء جهاز ظاهري (VM) في Yandex.Cloud. لأغراضنا ، يمكنك اختيار VM "خفيف" مع 1 vCPU و 0.5 غيغابايت من ذاكرة الوصول العشوائي. في قسم إعدادات الشبكة ، حدد الشبكة الافتراضية بعنوان IP تلقائي. في قسم "الوصول" ، أدخل "home" مثل تسجيل الدخول ، في حقل الإدخال بمفتاح SSH ، انسخ ما تم عرضه في وحدة التحكم الخاصة بنا في الخطوة السابقة:

انقر فوق "إنشاء VM" وانتظر الانتهاء. بعد اكتمال إنشاء الجهاز الظاهري ، نحتاج إلى معرفة عنوان IP الخاص به:

سنحتاج إلى عنوان IP الخاص بجهازنا الافتراضي لتشغيل عميل SSH على الكمبيوتر المنزلي والكمبيوتر المحمول. قم بتشغيله على الكمبيوتر بهذه الطريقة (في هذا الأمر والأوامر التالية تحتاج إلى استبدال 84.201.141.36 بعنوان IP الخاص بجهاز VM):
ssh -NR 3389:localhost:3389 home@84.201.141.36
عندما يُسأل عن الاتصال بخادم غير معروف ، نجيب "نعم". إذا لم نر أي نص على وحدة التحكم ، فكل شيء سار على ما يرام. الآن تكوين الكمبيوتر المحمول. انسخ المفتاح الخاص من محرك الأقراص المحمول الخاص بنا:
mkdir -Force $HOME/.ssh copy f:\id_rsa $HOME/.ssh/id_rsa
وتشغيل عميل SSH:
ssh -NL 1025:localhost:3389 home@84.201.141.36
يمكنك الآن تشغيل عميل الوصول إلى سطح المكتب البعيد (mstsc.exe) على الكمبيوتر المحمول ، مع تحديد مضيف محلي: 1025 كعنوان اتصال. الصيحة ، إنها تعمل!
أو تقريبا يعمل. إذا أوقفت عملية SSH على الكمبيوتر المنزلي ، فسيصبح من المستحيل الاتصال. نحتاج إلى جعل هذه العملية تبدأ تلقائيًا عند بدء تشغيل النظام ، وكذلك إعادة التشغيل عند انقطاع الاتصال. يمكن تحقيق ذلك ، على سبيل المثال ، عن طريق إنشاء برنامج نصي PowerShell وتسجيله باعتباره إلزاميًا للتشغيل في "نهج المجموعة" عند بدء تشغيل الكمبيوتر. ما عليك سوى التفكير في أنه سيتم تشغيله نيابة عن حساب النظام ، مما يعني أنك بحاجة إلى التأكد من أن مفتاح SSH الخاص بنا متاح لحساب النظام.
دعنا ننكب على المفتاح أولاً. شغّل PowerShell كمسؤول وقم بتنفيذ الأوامر التالية:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset
في نفس الوقت ، في نفس نافذة PowerShell ، قم بتمكين تنفيذ البرنامج النصي:
Set-ExecutionPolicy RemoteSigned
الآن قم بإنشاء البرنامج النصي الفعلي. لنفتتح محرر النصوص المفضل لدينا (المفكرة مناسبة أيضًا) ، واكتب هذا البرنامج النصي (تذكر أن تستبدل عنوان IP لخادم SSH بالعنوان الصادر عن ياندكس):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NR 3389:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
احفظ البرنامج النصي في الدليل الذي تريده. أخيرًا ، قم بتسجيله للتشغيل التلقائي. للقيام بذلك ، قم بتشغيل محرر نهج المجموعة (Win + R → gpedit.msc) ، وافتح العناصر "تكوين الكمبيوتر" و "تكوين Windows" و "البرامج النصية (البدء / النهاية)" و "بدء التشغيل". في علامة التبويب "PowerShell Scripts" ، استخدم زر "إضافة" وأشير إلى المسار إلى البرنامج النصي المحفوظ.

سنفعل نفس الشيء على جهاز كمبيوتر محمول. أول PowerShell كمسؤول:
copy $HOME/.ssh/id_rsa "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" icacls "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" /reset Set-ExecutionPolicy RemoteSigned
بعد ذلك ، سنقوم بإعداد برنامج نصي في محرر نصوص (يختلف قليلاً عن سابقه ، ولكن كما حدث من قبل ، نستبدل عنوان IP بالعنوان الذي أصدره لك Yandex):
while (1) { & $(get-command ssh |select -expandproperty Path) ` -i "$(gwmi win32_userprofile | where {$_.SID -eq "S-1-5-18"} | select -ExpandProperty LocalPath)/rds_id_rsa" ` -o StrictHostKeyChecking=accept-new -o ExitOnForwardFailure=yes ` -NL 1025:localhost:3389 home@84.201.141.36 Start-Sleep -Seconds 15 }
سوف تقوم الجهة غير المسجلة بتسجيله للبدء عند بدء التشغيل باستخدام "gpedit.msc". إعادة تشغيل الكمبيوتر والكمبيوتر المحمول (للتأكد من أن كل شيء يبدأ بشكل صحيح) وفويلا! الآن أصبح الكمبيوتر المنزلي الخاص بنا وأجهزة الكمبيوتر المحمول الخاصة بنا متصلاً إلى الأبد (طالما أن الجهاز الظاهري في Yandex.Cloud قيد التشغيل ويمكن الوصول إليه).
ماذا بعد؟
حسنًا ، أليس هذا رائعًا؟ في أي مقهى ، في أي مطار ، يمكنك الاتصال بمنزلك ومشاهدة الصور المفضلة لديك مع القطط. أو تفضل بالرجوع إلى المنزل مع تضمين السمفونية الخامسة لبيتهوفن بحجم كبير. أو اهتم بنجاح مزرعة التعدين الخاصة بك. أو شاهد ما يحدث في المنزل باستخدام كاميرا ويب. ولكن كم عدد التطبيقات لديها مثل هذه الفرصة "النقل الفضائي"؟ لكن حلنا له أيضا عيوب.
أولاً ، إن إعداد اتصال ليس أسهل عملية وأكثر متعة. وفي حالة حدوث خطأ ما ، تكون عملية التصحيح أكثر تعقيدًا من الإعداد الأولي. بالطبع ، يتم حل هذه المشكلة عن طريق المثابرة والصبر ، ولكن حتى كمية العمل الصغيرة التي يجب إنفاقها يمكن أن تثير الشكوك حول جدوى الجهود.
ثانياً ، آلة افتراضية في السحابة تكلف مالاً. في حالة ياندكس ، الحد الأدنى الذي يمكنك الاعتماد عليه هو 480 روبل في الشهر. هذا ، بالطبع ، ليس مالاً باهظاً ، لكنه ما زال ملكاً لهم ، مكسبًا من عرق الشخص. ما إذا كان الأمر يستحق مشاهدة الصور مع القطط من هذه الأموال يعود إلى الجميع أن يقرر لنفسه ، ولكن قد يكون تماما أن جميع مزايا حلنا سيتم شطبها بسعره.
يمكن تخفيف مشكلة السعر إلى حد كبير من خلال مشاركة النفقات مع الأصدقاء والأشخاص المتشابهين في التفكير. نظرًا لاستخدام الجهاز الظاهري للمهام التي لا تتطلب أي طاقة حوسبية ملحوظة ، فمن المستبعد للغاية تدهور الأداء. والتأثير الاقتصادي ملحوظ: إذا استأجرت جهازًا افتراضيًا مع عشرة أشخاص ، فسيتعين على الجميع دفع 48 روبل شهريًا فقط. صحيح ، في هذه الحالة يمكن أن ينتهك الانسجام من خلال مسألة الثقة: أي من الأشخاص المتشابهة في التفكير لديهم الفرصة للاتصال بكمبيوتر زميل عبر خادم SSH. في حالة وجود كلمات مرور قوية لكل شخص في حساباتهم ، فإن هذه ليست مشكلة. ولكن ، بصراحة ، كلمة مرور قوية لإدخال الكمبيوتر المنزلي الخاص بك ليست أكثر من قاعدة.
أن تستمر
لذلك ، لنفترض أننا جمعنا 10 أشخاص متشابهين في التفكير ، وأنشأنا كل شيء كما هو موضح أعلاه ، وأن كل شيء يعمل للجميع. يغتنم نادي محبي الصور لدينا مع القطط بأمان الفرصة للذهاب إلى منزلهم عبر الإنترنت مقابل 48 روبل فقط في الشهر دون تسجيل ورسائل نصية قصيرة ، الجميع سعداء وسعداء. السؤال هو - هل إمكانيات "التكنولوجيا" الخاصة بنا تقتصر فقط على القطط وهل من الممكن استخدامها لشيء أكثر خطورة؟
بالطبع يمكنك ذلك. إذا استبدلنا في منطقنا "الكمبيوتر المنزلي" بـ "build server in the cloud" و "laptop" بـ "computer work in the office" ، فإننا نحصل على شيء يستحق لقب "نظام الوصول إلى البنية التحتية للتطوير". وإذا كان لدينا كاميرا IP بدلاً من خادم بناء ، وموقع أمان بدلاً من جهاز كمبيوتر يعمل ، فسنحصل على "نظام مراقبة فيديو".
في كلتا الحالتين ، ومع ذلك ، سيكون من الضروري إيلاء المزيد من الاهتمام لقضايا التحكم في الوصول. على وجه الخصوص ، عند مشاركة خادم SSH بين عدة مستخدمين ، أود عزل هؤلاء المستخدمين عن بعضهم البعض. وحتى مع هذه المشاركة ، فنحن مضطرون إلى تعيين كل مورد منفصل لكل مستخدم إلى منفذ TCP منفصل وتذكر رقمه. يمكن أن تصبح المعالجة بالأرقام قريباً مملة للغاية ، لذا أود أن أكون قادرًا على تعيين أسماء ذات معنى للموارد. لكننا سنتحدث عن كيفية تحسين الوضع في المقالة التالية.
في غضون ذلك ، أشكركم على اهتمامكم ويرجى مشاركة أفكارك في التعليقات.