الوصول الآمن إلى المنزل الذكي في حالة عدم وجود IP عام (الجزء 1)

المقدمة


من الصعب اختيار عنوان كبير يعكس المعنى ، لذلك سأصف على الفور المهمة التي حددتها لنفسي.

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

الشيء المعتاد. ولكن هناك فروق دقيقة:

  • ليس لدى الموفر طريقة لإعطائي عنوان IP عام. ولا يوجد مزودون آخرون.
  • لا أحب الارتباط بخدمات سحابية محددة. قد يتم أيضًا إغلاق خدمة خارجية (حيث أرسل gbridge إشعارًا مؤخرًا). وفقط في حالة الفشل ليس من الواضح ما يجب فعله. أنا أفضل بلدي ، والتي يمكن نقلها ، وإعادة بنائها مع القليل من الدم إذا حدث شيء ما.
  • السلامة مهمة. ليس جنون العظمة ، ولكن وضع ioBroker على الإنترنت ، خاصة بالنظر إلى وجود العديد من الخدمات المعروضة (flot ...). لا حقا.

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

العنوان العام لمقت


في المنزل ، لا يتألق IP العام على جهاز التوجيه (أنا لا أتحدث عن ثابت ، يمكن حل هذا من خلال dyndns و نظائرها) ، أي أن الموفر يعطي 10.x.x.x ، بدون خيارات. لذا ، تحتاج إلى استئجار VPS صغير ، وإجراء probros من خلاله.

أسهل طريقة هي النفق عبر ssh. على الخادم المنزلي (سأطلق عليه iob.xxx.xx) أقوم بتنفيذ:

ssh -N -T -R pub.xxx.xx:1883:127.0.0.1:1883 a@iob.xxx.xx 

عند الاتصال بالمنفذ 1883 للخادم الخارجي pub.xxx.xx ، في الواقع تجد نفسك في منزلك iob: 1883 مع تشغيل حاوية mqtt (البعوض).

بطبيعة الحال ، من الضروري أن يبدأ هذا تلقائيًا ، ويتم استعادة الاتصال بعد الفشل. لذلك ، استخدمت autossh ، وقمت بتصميمها كخدمة.

/etc/systemd/system/ssh_mqtt.service:

[Unit]
Description=SSH Tunnel mqtt
After=network.target

[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NR pub.xxx.xx:1883:127.0.0.1:1883 -i /home/a/.ssh/id_rsa a@pub.xxx.xx

[Install]
WantedBy=multi-user.target

تمكين / إعادة تشغيل جميع أنواع systemctl ، إلخ. لن أصف.

لسوء الحظ ، على الرغم من autossh ، كنت تلاحقني التجميد المستمر. لذلك قررت أنه ليست هناك حاجة لإنتاج الكيانات واستقرت على ssh المعتاد:

/etc/systemd/system/ssh_mqtt.service:

[Unit]
Description=SSH Tunnel mqtt
After=network.target

[Service]
Restart=always
RestartSec=20
User=anri
ExecStart=/bin/ssh -N -T -R pub.xxx.xx:1883:127.0.0.1:1883 -i /home/a/.ssh/id_rsa a@pub.xxx.xx

[Install]
WantedBy=multi-user.target

في وقت لاحق ، بالمناسبة ، اتضح أن هذا المزود مائل جدًا. حسنًا ، أو أرخص سعر لـ 45 روبل / شهر ، لذا فهو يعمل بشكل مخادع. يتم تعليق الجلسة بشكل دوري ، حتى عندما تكون متصلة ببساطة عبر ssh (MobaXterm). لذا في النهاية طلبت نفسي من VPS من آخر (55 روبل / شهر) ، واختفت مشاكل التجميد.

بالمناسبة ، اخترت لنفسي أين يمكنني استخدام VPS ليس فقط على أساس السعر ، ولكن أيضًا مع مراعاة ping (10-20ms).

بشكل عام ، يعد هذا الخيار طبيعيًا تمامًا ، خاصةً مع الأخذ في الاعتبار أنني قمت بعد ذلك باتصال بالإنترنت حصريًا بالمنفذ 8883 عبر TLS. أولئك. تم إرسال كلمة مرور البعوض مشفرة.

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

نظرًا لأنني عملت في هذه العملية أيضًا على البرنامج لـ ESP32 ، فقد لاحظت (أو فكرت فقط ، لم أعد أتذكر) أنه عندما تكون هناك مشكلات في اتصال VPN ، سيتم استهلاك البطارية بشكل أسرع. أثناء التشغيل العادي ، الدورة: الاستيقاظ ، تطبيق الطاقة على المستشعرات ، الاتصال بشبكة WiFi ، إنشاء اتصال بخادم mqtt ، قراءة قراءات المستشعر عندما تكون جاهزة ، التحويل إلى mqtt ، إيقاف الطاقة من المستشعرات ، الدخول في نوم عميق لمدة 10 دقائق.

عادة ، تستغرق هذه الدورة حوالي 4 ثوانٍ. 1.5-2 ثانية - اتصال بشبكة WiFi ، ثانية إضافية بسبب الانتقال إلى mqtt عبر TLS. تناسبك لمدة 4 ثوان ، مع ذلك ، تحتاج المستشعرات إلى وقت للاستيقاظ. ولكن إذا تعطلت الشبكة الافتراضية الخاصة (كان من الواضح أنها كانت واضحة عندما سقطت autossh) ، فماذا أفعل؟ بالطبع ، قمت بإعداده حتى بعد 20 ثانية سوف ينام النظام على أي حال. لكن 20 ثانية بدلاً من 4 ملحوظة للغاية.

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

العنوان العام لـ Vis


Vis هو نظام مرئي شائع في ioBroker. لا يمكنك أن تزعج نفسك ، وقم بتكوينه بنفسك على https وبالمثل قم بإعادة توجيه المنفذ. علاوة على ذلك ، يمكنها طلب كلمة مرور على مستوى التطبيق.

لكن هذا ليس رائعًا. خاصة بالنظر إلى أنه يربط خدمات إضافية للعمل. لنفترض أنني أرسم رسومًا بيانية في flot ، نسبيًا ، أقوم بالاتصال بـ vis.xxx.xx : 8082 / vis / index.html ، ولكن في الداخل هناك روابط إلى الرسوم البيانية vis.xxx.xxx : 8082 / flot / index.html. في مرحلة ما ، اتضح أنه عند الاتصال بـ / vis ، يتم طلب كلمة مرور ، ويمكن الوصول إلى واجهة الرسم البياني بدون كلمة مرور.

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

لذلك قررت على نفس الخادم الخارجي رفع nginx في وضع الوكيل العكسي. وجعل بالفعل التفويض على ذلك.

من المتصفح عملت. لكن التطبيق الأصلي iobroker.vis من سوق Play لا يمكنه تسجيل الدخول بهذه الطريقة. وأردت استخدامه. على الرغم من أن هذا في الواقع متصفح في النافذة ، إلا أنه يحتوي على عدد من الميزات الرائعة. لنفترض ضبط المقياس (93٪ في الوضع الرأسي) ، والصورة ملائمة. على جهاز آخر بدقة شاشة مختلفة ، ما عليك سوى تحديد المعامل ، وهذا كل شيء. وفي المتصفح تحتاج إلى ضبط في كل مرة ...

حسنًا ، أعتقد. سأضيف رمزًا صعبًا في عنوان URL بدلاً من كلمة المرور. اكتب vis.xxx.xx : 8082 / <long sequence> /vis/index.html. في كثير من الأحيان يتم استخدام هذه الخدعة.

حصل تقريبا. ولكن مع وجود مواطن الخلل ، أظهر الحفر أن تطبيق الويب هذا لم يكتب بشكل صحيح. العديد من الروابط داخلها ليست نسبية ، ولكن من الجذر.

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

VPN


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

أبسط طريقة بالنسبة لي كانت Zerotier. بالنسبة لنظام التشغيل (Windows و Android و Linux) ، هناك عملاء. وهناك حتى الجاهزة في عامل الميناء. نعم. أجري كل شيء في عامل الميناء ، حول ميزات هذا لاحقًا.

يمكنك تثبيت العميل وإدخال رمز فريد لشبكتك ، ثم تأكيده في واجهة الويب على my.zerotier.com ، إذا لزم الأمر ، قم بتعيين عنوان ثابت من شبكتك الخاصة الشخصية (la 10.20.30.0) ، وهذا كل شيء. يرى كل العملاء المتصلين بعضهم البعض.

الشيء الوحيد الذي كان عليّ التعامل معه قليلاً هو "كيفية الاتصال بخادم بعيد من جهاز في شبكة WiFi المنزلية دون بدء تشغيل العميل". حسنًا ، خادم المنزل لدي عميل بالفعل ، حتى إذا كان يوجه نفسه. اتضح أن كل شيء بسيط. يجب أن تكون الشبكة المنزلية 192.168.x.0 مسجلة على my.zerotier.com في قسم المسارات المدارة ، مع تحديد أنها البوابة الخاصة بي ، بالطبع ، هذا هو خادم المنزل. حسنًا ، في شبكة WiFi ، قم بتكوين المسار وفقًا لذلك (على موجه WiFi ، الإحصائيات 10.20.30.0 على الخادم المنزلي).

عند توصيل عميل Zerotier ، يمكنك تحديد خادم DNS مختلف. أولئك. لقد قمت بتوصيل العميل ، ولا يحل اسم المجال إلى عنوان عام ، بل إلى عنوان خاص ، لأن DNS يشير الآن إلى الخادم الرئيسي ، حيث يتم إيقاف dnsmasq لسجلات IP الفردية من شبكة Zerotier الخاصة.

حتى Zerotier راضٍ عن الاختيار الفعال لطريق الاتصال. إذا قمت بتنشيط عميل Zerotier في شبكة WiFi منزلية ، فإن ping على جهاز الكمبيوتر المنزلي (عنوان IP الخاص به الذي أصدرته Zerotier) هو نفس الملي ثانية كما هو بدون عميل (فقط عبر WiFi). أولئك. يتم الاتصال بالسحابة في اللحظة الأولى فقط. يتم إجراء مزيد من تبادل حركة المرور مباشرة ، وليس من خلال السحابة. إذا قمت بتثبيت OpenVPN على VPS ، على سبيل المثال ، فسيتم تشغيل نفس حركة المرور من العميل إلى VPS ، ثم العودة إلى نفس شبكة WiFi إلى الخادم المنزلي.

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

ما هي النتيجة؟


يرسل ESP32 بياناته إلى خادم mqtt المنشور على VPS. عبر TLS ، شهادة العميل مطلوبة.

يتم تثبيت VPN من خلال Zerotier مع الخادم المنزلي. يتواصل Sonoff rfBridge مع البرامج الثابتة لـ Tasmota من خلال هذا الخادم المنزلي من mqtt إلى VPS. لا توجد طريقة لتعيين TLS مع شهادة العميل ، لذلك تم تكوين MQTT المعتاد لعام 1883. على أي حال ، فإن الخادم المنزلي سيشفر حركة المرور هذه باستخدام Zerotier.

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

كل شيء بسيط للغاية. لكن الدودة ابتلعت الروح. على الرغم من أنني ليس لدي مفاعل نووي ، ولكن فجأة؟ كانت هناك حالة عندما كسروا برنامج TeamViewer (شركة ، وليس برنامج عميل على وجه التحديد) ، ومن خلالهم تمكنوا من الوصول إلى العديد من الحسابات. وبشكل عام ، كتبت في البداية أنني أحب كل شيء يخصني.
لذا في الخطوة التالية ، تحولت من Zerotier إلى OpenVPN. كل شيء في يدي.

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

استنتاج


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

وفقط في حالة ، سؤال لأولئك الذين يعرفون: على الرغم من أن لدي VPS وأخرى صغيرة (512 ميجابايت RAM) ، يتم استخدامه أقل من 1 ٪. إحصائيات docker:

صورة

ولدي فكرة إطلاقها كلها تمامًا مثل الحاوية على بعض Google Cloud Run أو Amazon Fargate أو شيء مماثل. نشر خادم بكل أنواع fail2ban من خلال ansible ليس مشكلة. قم بتثبيت Docker أيضًا. ولكن لماذا ، إذا كنت بحاجة إلى جزء صغير فقط من مواردها؟

ومع ذلك ، وفقًا لحساباتي ، فإن تكلفة Fargate نفسها ستكلفني عدة مرات.

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

All Articles