tinc-boot - شبكة كاملة بدون ألم


تلقائي وآمن وموزع ، مع اتصالات متعدية (مثل إعادة توجيه الرسائل عندما لا يكون هناك وصول مباشر بين المشتركين) ، دون نقطة واحدة من الفشل ، نظير ، تم اختباره على مدار الوقت ، استهلاك منخفض للموارد ، شبكة VPN كاملة الشبكات مع القدرة على "التثقيب" NAT - هل هو ممكن؟


الإجابات الصحيحة هي:


  • نعم ، مع الألم إذا كنت تستخدم الخندق.
  • نعم ، من السهل إذا كنت تستخدم tinc + tinc-boot

تمهيد تخطي الارتباط


وصف تينك


لسوء الحظ ، تم نشر القليل من المعلومات حول Tinc VPN على Habré ، ولكن لا يزال من الممكن العثور على مقالتين ذات صلة:



من المقالات باللغة الإنجليزية يمكن تمييزها:



المصدر الأصلي هو الأفضل للنظر في وثائق رجل Tinc الأصلي


لذلك (إعادة طبع مجانية من الموقع الرسمي) ، Tinc VPN هي خدمة ( tincd daemon) تضمن تشغيل شبكة خاصة عن طريق حفر وتشفير حركة المرور بين العقد. شفرة المصدر مفتوحة ومتاحة بموجب ترخيص GPL2. مثل الحل الكلاسيكي (OpenVPN) ، تتوفر الشبكة الافتراضية التي تم إنشاؤها على مستوى IP (OSI 3) ، مما يعني ، في الحالة العامة ، إجراء تغييرات على التطبيقات غير مطلوب.


الميزات الرئيسية:


  • تشفير وتوثيق وضغط حركة المرور ؛
  • حل شبكة كاملة تلقائيًا ، والذي يتضمن إنشاء اتصالات لعقد الشبكة في وضع الكل مع الكل أو إعادة توجيه الرسائل بين المضيفين الوسيطين ، إذا لم يكن ذلك ممكنًا ؛
  • لكمة NAT.
  • القدرة على توصيل الشبكات المعزولة على مستوى الإيثرنت (التبديل الظاهري) ؛
  • دعم أنظمة تشغيل متعددة: Linux ، FreeBSD ، OS X ، Solaris ، Windows ، إلخ.

هناك نوعان من فروع تطوير القصدير: 1.0.x (في جميع المستودعات تقريبًا) و 1.1 (تجريبي أبدي). يستخدم المقال الإصدار 1.0.x في كل مكان.


يوفر Tinc 1.1x العديد من الميزات الرئيسية الجديدة: أمان أمامي مثالي واتصال عميل مبسط (يستبدل فعليًا tinc-boot ) وتصميم أكثر tinc-boot بشكل عام.

ومع ذلك ، في الوقت الحالي ، تتم الإشارة إلى إصدار ثابت - 1.0.x وتمييزه على الموقع الرسمي ، لذلك عند استخدام جميع مزايا الفرع 1.1 ، يجب عليك تقييم جميع مزايا وعيوب استخدام إصدار غير نهائي.

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



النظر في الموقف مع ثلاثة خوادم (الصين وروسيا وسنغافورة) وثلاثة عملاء (روسيا والصين والفلبين):


  • خوادم لديها عنوان عام ، عملاء وراء NAT.
  • ILV خلال الحظر التالي للوكيلين المحتملين قامت Telegram بحظر جميع المضيفين باستثناء الصين "الودية" ؛
  • حدود شبكة الصين <-> RF غير مستقرة وقد تقع (بسبب ILV و / أو بسبب الرقابة الصينية) ؛
  • الاتصالات إلى سنغافورة مستقرة مشروطة (تجربة شخصية) ؛
  • مانيلا (الفلبين) ليست تهديدًا لأحد ، وبالتالي فهي مسموح للجميع (بسبب المسافة من الجميع وكل شيء).

على سبيل المثال ، تبادل الحركة بين شنغهاي وموسكو ، خذ بعين الاعتبار سيناريوهات Tinc (تقريبًا):


  1. الوضع الأصلي: موسكو <-> russia-srv <-> china-srv <-> Shanghai
  2. اتصال ILV مغلق مع الصين: موسكو <-> russia-srv <-> Manila <-> Singapore <-> Shanghai
  3. (بعد 2) في حالة فشل الخادم في سنغافورة ، يتم نقل حركة المرور إلى الخادم في الصين والعكس.

كلما كان ذلك ممكنًا ، يحاول Tinc تأسيس اتصال مباشر بين العقدتين خلف NAT عن طريق التثقيب.


مقدمة موجزة لتكوين الخندق


يتم وضع Tinc كخدمة سهلة التكوين. ومع ذلك ، حدث خطأ ما - لإنشاء عقدة جديدة ، فمن الضروري الحد الأدنى:


  • وصف تكوين المضيف (النوع ، الاسم) ( tinc.conf ) ؛
  • وصف ملف التكوين (الشبكات الفرعية المقدمة والعناوين العامة) ( hosts/ ) ؛
  • إنشاء مفتاح ؛
  • إنشاء برنامج نصي يحدد عنوان العقدة والمعلمات ذات الصلة ( tinc-up ) ؛
  • من المستحسن إنشاء برنامج نصي يقوم بمسح المعلمات التي تم إنشاؤها بعد التوقف ( tinc-down ).

بالإضافة إلى ذلك ، عند الاتصال بشبكة حالية ، يجب عليك الحصول على مفاتيح المضيف الحالية وتوفير مفاتيحك الخاصة.


أي: للعقدة الثانية



للثالث



عند استخدام المزامنة ثنائية الاتجاه (على سبيل المثال ، unison ) ، يزيد عدد العمليات الإضافية إلى N pieces ، حيث N هو عدد العقد العامة.


يجب أن نشيد بمطوري Tinc - لتضمينهم في الشبكة ، فقط تبادل المفاتيح
مع واحد فقط من العقد (bootnode). بعد بدء الخدمة والاتصال بالمشارك ، ستحصل على خصلة طوبولوجيا
شبكة وسوف تكون قادرة على العمل مع جميع المشتركين.

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

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


أسباب إنشاء tinc-boot


إذا قمنا بتعميم المشكلات الموضحة أعلاه وصياغةها كمهام ، فسنحصل على:


  1. هناك حاجة إلى إنشاء موقع جديد بأقل جهد ممكن ؛
    • يحتمل أن يكون من الضروري إتاحة الفرصة للمتخصص المتوسط ​​(enikey) لخط صغير واحد لإنشاء عقدة جديدة والاتصال بالشبكة ؛
  2. من الضروري توفير التوزيع التلقائي للمفاتيح بين جميع العقد النشطة ؛
  3. من الضروري توفير إجراء تبادل مفتاح مبسط بين bootnod والعميل الجديد.

bootnode - عقدة ذات عنوان عام (انظر أعلاه) ؛

بسبب متطلبات المطالبة 2 ، يمكن القول أنه بعد تبادل المفاتيح بين bootnode والعقدة الجديدة ، وبعد
عند توصيل العقدة بالشبكة ، سيتم توزيع المفتاح الجديد تلقائيًا.


هذه هي المهام التي يؤديها tinc-boot .


tinc-boot هو تطبيق مفتوح المصدر tinc بذاته ، بصرف النظر عن tinc ، يوفر:


  • إنشاء بسيط لعقدة جديدة ؛
  • اتصال تلقائي إلى شبكة موجودة ؛
  • وضع غالبية المعلمات بشكل افتراضي ؛
  • التوزيع الرئيسي للعقد العسل.

هندسة معمارية


يتكون الملف القابل للتنفيذ tinc-boot من أربعة مكونات: خادم bootnode ، خادم إدارة التوزيع الرئيسي وأوامر إدارة RPC الخاصة به ، بالإضافة إلى وحدة إنشاء عقدة.


وحدة توليد العقدة


تقوم وحدة إنشاء العقدة ( tinc-boot gen ) بإنشاء جميع الملفات اللازمة لتشغيل tinc بنجاح.


مبسطة ، ويمكن وصف خوارزمية لها على النحو التالي:


  1. حدد اسم المضيف ، الشبكة ، معلمات IP ، المنفذ ، قناع الشبكة الفرعية ، إلخ.
  2. تطبيعها (القصدير له حد على بعض القيم) وإنشاء القيم المفقودة
  3. تحقق المعلمات
  4. إذا لزم الأمر ، قم بتثبيت tinc-boot على النظام (غير قابل للتخصيص)
  5. قم tinc-up و tinc-down و subnet-up و subnet-down
  6. إنشاء tinc.conf التكوين tinc.conf
  7. إنشاء hosts/
  8. أداء جيل المفتاح
  9. إجراء تبادل المفتاح مع bootnode
    1. تشفير ملف المضيف الخاص بك وتوقيعه باستخدام مفتاح عمومي ، وموجه التهيئة العشوائي (nounce) واسم المضيف باستخدام xchacha20poly1305 ، حيث يكون مفتاح التشفير هو نتيجة وظيفة sha256 من الرمز المميز
    2. إرسال البيانات عبر بروتوكول HTTP إلى bootnode
    3. فك تشفير الإجابة المتلقاة ورأس X-Node يحتوي على اسم عقدة التمهيد باستخدام nounce الأصلي والخوارزمية نفسها
    4. إذا نجحت ، فاحفظ المفتاح المستلم في hosts/ وأضف إدخال ConnectTo إلى ملف التكوين (مثل التوصية التي يجب الاتصال بها)
    5. وإلا ، استخدم العنوان التالي في قائمة عقدة التمهيد وكرر من الخطوة 2
  10. عرض التوصيات بشأن بدء الخدمة

يتم استخدام التحويل عبر SHA-256 فقط لتطبيع المفتاح إلى 32 بايت

بالنسبة للعقدة الأولى (أي عندما لا يوجد شيء لتحديده كعنوان التمهيد) ، يتم تخطي الخطوة 9. العلم - --standalone .


مثال 1 - إنشاء أول موقع عام


العنوان العام هو 1.2.3.4


sudo tinc-boot gen --standalone -a 1.2.3.4


  • يسمح لك العلم -a بتحديد العناوين المتاحة للجمهور

مثال 1 - إضافة عقدة غير عامة إلى الشبكة


سيتم أخذ عقدة التمهيد من المثال أعلاه. يجب أن يكون لدى المضيف bootnode tinc-boot (الموصوف لاحقًا).


sudo tinc-boot gen --token "MY TOKEN" http://1.2.3.4:8655


  • علامة - العلامة تعيين رمز التفويض

وحدة التمهيد


تثير tinc-boot bootnode خادم HTTP مع API لتبادل المفاتيح الأساسية مع عملاء جدد.


افتراضيًا ، 8655 المنفذ 8655 .


المبسطة ، يمكن وصف الخوارزمية على النحو التالي:


  1. قبول طلب من عميل
  2. فك تشفير والتحقق من الطلب باستخدام xchacha20poly1305 ، باستخدام متجه التهيئة الذي تم تمريره أثناء الطلب ، وحيث يكون مفتاح التشفير هو نتيجة وظيفة sha256 من الرمز المميز
  3. تحقق الاسم
  4. احفظ الملف إذا لم يكن هناك ملف يحمل نفس الاسم حتى الآن
  5. تشفير وتوقيع ملف المضيف الخاص بك واسم باستخدام الخوارزمية المذكورة أعلاه
  6. العودة إلى البند 1

معًا ، تكون عملية تبادل المفاتيح الأساسية كما يلي:



مثال 1 - بدء عقدة التنزيل


من المفترض أن التهيئة الأولية للعقدة تم تنفيذها ( tinc-boot gen )


tinc-boot bootnode --token "MY TOKEN"


  • علامة - العلامة تعيين رمز التفويض. يجب أن تكون هي نفسها للعملاء المتصلين بالمضيف.

مثال 2 - بدء عقدة التنزيل كخدمة


tinc-boot bootnode --service --token "MY TOKEN"


  • --service علامة --service إلى إنشاء خدمة systemd (بشكل افتراضي ، على سبيل المثال ، tinc-boot-dnet.service )
  • علامة - العلامة تعيين رمز التفويض. يجب أن تكون هي نفسها للعملاء المتصلين بالمضيف.

وحدة التوزيع الرئيسية


تقوم وحدة توزيع المفاتيح ( tinc-boot monitor ) برفع خادم HTTP مع واجهة برمجة التطبيقات لتبادل المفاتيح مع العقد الأخرى داخل VPN . تم إصلاحه على العنوان الصادر عن الشبكة (المنفذ الافتراضي هو 1655 ، ولن يكون هناك أي تعارض مع العديد من الشبكات ، لأن كل شبكة لها / يجب أن يكون لها عنوانها الخاص).


تبدأ الوحدة وتعمل تلقائيًا بالكامل: لا تحتاج إلى العمل معها في الوضع اليدوي.


تبدأ هذه الوحدة تلقائيًا عندما تكون الشبكة في وضع التشغيل (في البرنامج النصي tinc-up ) وتتوقف تلقائيًا عند توقفها (في البرنامج النصي tinc-down ).


يدعم العمليات:


  • GET / - إعطاء ملف العقدة الخاص بك
  • POST /rpc/watch?node=<>&subnet=<> - التقط ملفًا من عقدة أخرى ، مع افتراض وجود خدمة مماثلة تعمل عليه. بشكل افتراضي ، يتم إنهاء المحاولات في 10 ثوانٍ ، كل 30 ثانية حتى النجاح أو الإلغاء.
  • POST /rpc/forget?node=<> - اترك محاولات (إن وجدت) لالتقاط الملف من عقدة أخرى
  • POST /rpc/kill - ينهي الخدمة

بالإضافة إلى ذلك ، كل دقيقة (بشكل افتراضي) وعندما يتم استلام ملف تكوين جديد ، يتم فهرسة العقد المحفوظة للعقد العامة الجديدة. عند اكتشاف العقد ذات علامة Address ، تتم إضافة إدخال إلى ملف تكوين tinc.conf للتوصية بالاتصال عند إعادة التشغيل.


وحدة توزيع المفاتيح (الإدارة)


يتم تنفيذ أوامر الطلب ( tinc-boot watch ) وإلغاء طلب ( tinc-boot forget ) لملف التكوين من العقد الأخرى تلقائيًا عند اكتشاف عقدة جديدة (البرنامج النصي subnet-up ) وإيقافها (البرنامج النصي subnet-down ) ، على التوالي.


في عملية إيقاف الخدمة ، يتم tinc-down البرنامج النصي tinc-down والذي يتوقف فيه الأمر tinc-boot kill عن وحدة توزيع المفاتيح.


بدلا من المجموع


تم إنشاء هذه الأداة تحت تأثير التنافر المعرفي بين عبقرية مطوري Tinc والتعقيد الخطي المتزايد لإنشاء عقد جديدة.


كانت الأفكار الرئيسية في عملية التطوير:


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

القليل من التسلسل الزمني:


  • أول مرة اعتدت فيها على الخندق منذ أكثر من 4 سنوات. درس كمية كبيرة من المواد. قم بإعداد شبكة مثالية (في رأيي)
  • بعد نصف عام ، تم استبدال القصدير لصالح zerotier ، كأداة أكثر ملاءمة / مرونة
  • منذ عامين ، قدمت كتاب قواعد اللعبة ansible لنشر tinc
  • بعد شهر ، تعطل البرنامج النصي الخاص بي عند النشر التزايدي (أي عندما يكون من المستحيل الوصول إلى جميع عقد الشبكة ، مما يعني توزيع المفاتيح)
  • قبل أسبوعين ، كتبت نصًا نصيًا عن bash-script كان النموذج الأولي لـ tinc-boot
  • قبل 3 أيام من التكرار الثاني ، وُلدت النسخة الأولى (0.0.1 على وجه الدقة) من الأداة
  • منذ يوم واحد ، قمت بتخفيض تثبيت عقدة جديدة إلى سطر واحد: curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot curl -L https://github.com/reddec/tinc-boot/releases/latest/download/tinc-boot_linux_amd64.tar.gz | sudo tar -xz -C /usr/local/bin/ tinc-boot
  • قريباً ، ستتم إضافة إمكانية اتصال أبسط بالشبكة (دون التضحية بالأمان)

أثناء التطوير ، قمت باختبار فعال على خوادم حقيقية وعملاء (الصورة مأخوذة من وصف tinc أعلاه مأخوذة من الحياة الحقيقية). يعمل النظام الآن بلا عيوب ، ويتم الآن تعطيل جميع خدمات VPN التابعة لجهات أخرى.


رمز التطبيق مكتوب في GO وهو مفتوح تحت رخصة MPL 2.0. يسمح الترخيص (ترجمة مجانية) للاستخدام التجاري (إذا احتاج شخص ما فجأة) دون فتح المنتج المصدر. الشرط الوحيد هو أنه يجب نقل التغييرات إلى المشروع.


تجمع الطلبات هي موضع ترحيب.


روابط مفيدة


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


All Articles