00:00:00هذا هو Headscale، نسخة مجانية ومفتوحة المصدر من Tailscale يمكنك تثبيتها على أي خادم،
00:00:06مما يمنحك تحكماً كاملاً في شبكتك المشفرة في حال انقطع الإنترنت أو رفعت Tailscale أسعارها فجأة.
00:00:13لكن الغريب هو أن Headscale تم بناؤه بواسطة موظف في شركة Tailscale.
00:00:18لماذا يدفعون لشخص ما لبناء منافس لهم؟
00:00:22اضغط على زر الاشتراك ولنكتشف ذلك معاً.
00:00:25دعونا نرى Headscale وهو يعمل قبل الدخول في أي تفاصيل.
00:00:30حسناً، لدي حالياً ثلاثة خوادم من Hetzner، واحد لمنصة التحكم الرئيسية لـ Headscale، وعقدتان هنا أريد توصيلهما ببعضهما البعض.
00:00:40هاتان العقدتان تشكلان حالياً جزءاً من شبكتي المشفرة.
00:00:44إذا قمت بتشغيل هذا الأمر، وبما أن كل شيء يعمل على Docker، يمكنني رؤية العقد الحالية لدي، وهي Ubuntu Test و Ubuntu Test 2.
00:00:53وهذه هي عناوين الـ IP التي يمكنني استخدامها للاتصال بهما.
00:00:56الآن، لنقم بالاتصال بهاتين العقدتين من داخل بعضهما البعض.
00:00:59أولاً، سأنسخ عنوان الـ IP هذا.
00:01:02والآن داخل Ubuntu Test 2، سأقوم بالدخول عبر SSH كـ root.
00:01:07نعم، لا ينبغي لي استخدام حساب root، لكن هذا لأغراض الاختبار فقط.
00:01:09وهذا هو عنوان الـ IP الخاص بـ Headscale.
00:01:11وإذا ضغطت إدخال ومسحت الشاشة، كما ترون، أنا الآن داخل Ubuntu Test 1.
00:01:17لقد دخلت إلى Ubuntu Test 1 من Ubuntu Test 2، ويمكنني الخروج للعودة إلى Ubuntu Test 2.
00:01:24ويمكنني فعل الشيء نفسه في Ubuntu Test 1 إذا قمت بـ SSH root ولصقت عنوان IP الخاص بـ Ubuntu Test 2.
00:01:31وإذا مسحت الشاشة، يمكننا أن نرى أنني في Ubuntu Test 2 من Ubuntu Test 1.
00:01:36لكن إذا كنت خارج الـ tail net، أي إذا فتحت علامة تبويب جديدة وهي جهاز الماك الخاص بي، ثم حاولت الدخول عبر SSH ولصقت عنوان IP الخاص بـ Ubuntu Test 2...
00:01:48سترون أنه يتوقف تماماً لأنني خارج الـ tail net.
00:01:52كما رأيتم للتو، يمنحكم Headscale وصولاً كاملاً لشبكتكم.
00:01:56يمكنكم التحكم في كل تفصيل صغير وإضافة أي عدد تريدونه من العقد دون التقيد بمزود خدمة معين.
00:02:03ويمكنه العمل بدون إنترنت إذا قمت بتوصيله بجهاز NAS أو Raspberry Pi قديم.
00:02:08لكن الإعداد معقد بعض الشيء.
00:02:11في الواقع، دعوني أريكم كيف يعمل.
00:02:13لقد أنشأت خادماً جديداً باسم Ubuntu Test 3، وسأقوم بإنشاء tail net جديد أو خادم مشفر جديد مع مستخدم جديد سيقوم بتوصيل عقدتين.
00:02:24أي Ubuntu Test 3 و Ubuntu Test 1، فقط لأغراض الاختبار.
00:02:29داخل منصة تحكم Headscale الخاصة بي، قمت بالفعل بتثبيت التطبيق، لكنني سأمر سريعاً على الخطوات التي قمت بها.
00:02:37حالياً، لدي ثلاث حاويات Docker قيد التشغيل.
00:02:40واحدة لواجهة Headscale UI، وواحدة لـ Headscale، والأخرى لـ Caddy.
00:02:45إذا ألقينا نظرة على ملف Docker compose الخاص بذلك، سنرى أن هذا التكوين مشابه جداً للموجود في توثيق Headscale الخاص بـ Docker compose.
00:02:56على الرغم من أنني غيرت بعض الأشياء مثل إصدار Headscale ومسارات المجلدات الخاصة بي.
00:03:03لدي أيضاً حاوية لواجهة Headscale UI، وهي واحدة من العديد من واجهات الويب مفتوحة المصدر التي يمكن استخدامها مع Headscale.
00:03:11وسأريكم إياها لاحقاً.
00:03:13ثم هناك Caddy ليعمل كوكيل عكسي (reverse proxy).
00:03:16سأضع رابطاً لملف Docker compose هذا في الوصف إذا كنتم مهتمين.
00:03:21يوجد أيضاً في هذا المجلد مجلد lib ومجلد config.
00:03:26مجلد lib، كما ترون هنا، مخصص بشكل أساسي للاحتفاظ بقاعدة بيانات SQLite، التي تتحكم في معلومات المستخدمين والعقد والـ DNS وأشياء أخرى كثيرة.
00:03:36لكن في التكوين، يمكنك تغيير هذا إلى قاعدة بيانات Postgres إذا كنت لا ترغب في استخدام SQLite.
00:03:43أما مجلد config، فيحتوي على إعدادات tailscale وسياسة قائمة التحكم في الوصول (ACL) في ملف JSON سهل القراءة.
00:03:52سنتحدث عن هذا لاحقاً، ولكن دعونا نلقي نظرة على هذا أولاً، والذي يمكنك الحصول عليه من توثيق tailscale أو حتى سحبه مباشرة إلى خادمك، وهو ما فعلته.
00:04:01ولكن إذا ألقينا نظرة على التكوين التجريبي في GitHub، يمكننا رؤية كل ما يمكننا تغييره، من الخادم إلى البادئات وإضافة موقع ملف السياسة الخاص بنا.
00:04:11هذا مشابه جداً لإعداداتي، لكن كل ما قمت بتغييره هو رابط الخادم (server URL)، الذي يرتبط بنطاق Cloudflare حتى تتمكن العقد في شبكتي من الوصول إليه ومعرفة مكان العقد الأخرى.
00:04:23أضفت أيضاً مساراً لموقع ملف السياسة الخاص بي، وهذا كل ما في الأمر تقريباً.
00:04:28النطاق هو نطاق Cloudflare عادي مع سجل A يربط عنوان IP لمنصة تحكم headscale تحت النطاق الفرعي headscale.
00:04:37بمجرد وضع ذلك، إذا قمت بفتح ملف caddy، سترون أن لدينا رابطين مستخدمين، واحد لواجهة headscaled تحت مسار /web والآخر لوكيل headscale.
00:04:49بمجرد ضبط هذه الأمور، فإن أول ما يجب فعله هو إنشاء مستخدم جديد، وهو ما يمكننا القيام به عبر كتابة هذا الأمر.
00:04:56سأقوم بإنشاء مستخدم باسم Tom، ولكن يمكن أن يكون أي اسم تريده.
00:05:00الآن بعد إنشاء المستخدم، يمكننا تشغيل أمر عرض المستخدمين لرؤية جميع مستخدمينا، ولدينا مستخدمنا الجديد هنا بمعرف (ID) رقم 6.
00:05:08لكن الآن مستخدمنا ليس لديه أي عقد مرتبطة به.
00:05:11لذا لنعطِ Tom بعض العقد.
00:05:13داخل Ubuntu test 3، وهو الخادم الجديد الذي أنشأته، أول شيء علينا فعله هو إضافة عميل Tailscale، وهو ما يمكننا فعله بتشغيل هذا الأمر في خادمنا.
00:05:23وهذا يمنحنا الآن الوصول إلى ملف Tailscale البرمجي.
00:05:27ملاحظة، إذا لم تكن مستخدماً بصلاحيات root، فقد تضطر لاستخدام sudo لتشغيل Tailscale.
00:05:31لكن قبل تشغيل أي من هذه الأوامر لتشغيل Tailscale أو تسجيل الدخول، نحتاج إلى القيام بذلك بطريقة معينة تعمل مع headscale.
00:05:38للقيام بذلك، سيتعين علينا إنشاء مفاتيح مصادقة مسبقة (pre-auth keys)، والتي يمكننا العثور على أمرها في صفحة البداية في توثيق headscale.
00:05:46سأقوم بالتمرير لأسفل ونسخ هذا الأمر.
00:05:49ثم داخل منصة تحكم headscale، سأكتب docker exec، وألصق الأمر.
00:05:54وهنا في مكان معرف المستخدم (user ID)، سنضيف المعرف الخاص بـ Tom، وهو 6.
00:05:59وقبل فعل ذلك، عليّ إضافة كلمة headscale ثانية لأننا ندخل إلى حاوية headscale.
00:06:04والآن لدينا مفتاح المصادقة المسبق الخاص بنا.
00:06:07ثم سننسخ هذا الأمر ونلصقه في Ubuntu test 3.
00:06:11سنقوم بعد ذلك بنسخ مفتاح المصادقة المسبق ولصقه هنا.
00:06:15وبعد ذلك علينا تغيير خادم تسجيل الدخول هنا إلى خادم headscale الخاص بنا، والذي قمنا بتهيئته ليكون headscale.pandor.css.
00:06:23اسم Pandora كان محجوزاً، وإلا لكنت قد أخذته.
00:06:26الآن إذا ضغطنا إدخال، يجب أن تضاف عقدة جديدة إلى شبكة headscale الخاصة بنا.
00:06:31الآن إذا عدنا إلى منصة التحكم وشغلنا أمر عرض العقد، يجب أن نرى Ubuntu test 3 هنا، وهو ينتمي للمستخدم Tom مع عنوان IP هذا وعنوان IPv6 هذا.
00:06:44الآن لنقم بإضافة Ubuntu test 1 للمستخدم Tom.
00:06:47لكن أولاً سأقوم بحذف عقدة Ubuntu test الموجودة التي تحمل المعرف 1، وسأقوم بحذفها قسراً لتجاوز أي تأكيدات.
00:06:56الآن بعد أن تم ذلك، سأقوم بإنشاء مفتاح مصادقة مسبق آخر وإضافته إلى Ubuntu test، مع عدم نسيان تفعيل SSH باستخدام علامة SSH بما أنها مفعلة مسبقاً.
00:07:06لنذهب أيضاً إلى Ubuntu test 3 ونقوم بإعداد SSH، وهو ما يفعّل ببساطة القدرة على الاتصال عبر SSH.
00:07:13الآن، إذا نظرت إلى قائمة العقد المتاحة، لدي Ubuntu test 1 هنا و Ubuntu test 3، وكلاهما تحت المستخدم Tom.
00:07:20لنتصل بكليهما.
00:07:21سأقوم بأخذ عنوان IP الخاص بـ Ubuntu test 3 والدخول إلى Ubuntu test 1، ثم تشغيل SSH root مع عنوان IP.
00:07:30بمجرد تفعيل المفتاح، يمكننا رؤية أنني داخل Ubuntu test 3 من Ubuntu test 1.
00:07:35ويمكنني أيضاً فعل الشيء نفسه من Ubuntu test 3 إلى Ubuntu test 1.
00:07:41الآن، إذا اتبعت خطواتي بالضبط، فهناك احتمال كبير ألا يعمل هذا معك لأنك بحاجة إلى إضافة سياسة تحكم في الوصول (access control policy).
00:07:49لذا دعوني أريكم سياستي.
00:07:51إذا مسحت الشاشة ودخلت إلى مجلد headscale، يمكننا أن نرى في مجلد التكوين أن لدينا ملف ACL بتنسيق JSON سهل القراءة.
00:08:01وإذا دخلت إليه، فهذا تكوين بسيط جداً يقبل أساساً أي مصدر، أي شخص من شبكتي، إلى أي وجهة أو أي منفذ.
00:08:11وأيضاً تحت SSH، يقبل أي عقدة داخل tail net الخاص بي ويسمح لها بالاتصال بأي عقدة أخرى عبر SSH دون أي موافقة، ولكن فقط لمستخدم root.
00:08:24بالطبع، بناءً على شبكتك ووضعك، قد ترغب في جعل هذا أكثر صرامة أو أماناً بحيث لا يمكن لبعض العقد الاتصال إلا بعقد أخرى عبر منفذ محدد.
00:08:33لكن هذا تكوين بسيط جداً لتبدأ به.
00:08:37ومرة أخرى، سأضع الرابط في الوصف.
00:08:40الآن، قد تتساءلون ماذا عن واجهة Headscale UI؟
00:08:43هل تجعل هذه العملية برمتها أسهل؟
00:08:45أود أن أقول نعم ولا.
00:08:47دعوني أريكم.
00:08:48هذا هو رابط واجهة Headscale UI الخاصة بي، وحالياً يمكنك رؤية كلا المستخدمين، Tess و Tom، مع بعض المعلومات عنهما.
00:08:57المفاتيح والعقد المتصلة ليعمل هذا.
00:09:01في البداية، عليك إضافة مفتاح API لـ Headscale، والذي يمكنك الحصول عليه بتشغيل هذا الأمر.
00:09:06لكن المشكلة التي واجهتها كانت في عرض الأجهزة (device view).
00:09:09كما ترون، لا توجد معلومات كافية هنا، وهو أمر متعلق بخطأ في TypeScript في الكونسول، والذي لا ينبغي أن يكون خطئي لأنني لم أقم بتعديل الكود المصدري.
00:09:22ولكن عند هذه النقطة، يميل التطبيق إلى التجميد، فلا يعمل أي شيء.
00:09:26ومن المفترض أن أتمكن من إضافة جهاز جديد من هنا وتغيير بعض الإعدادات أيضاً.
00:09:32ولكن نظراً لكثرة الأخطاء البرمجية (bugs)، لم أجدها مفيدة جداً.
00:09:35هناك العديد من واجهات Headscale UI الأخرى، بعضها يسهل إضافة سياسات التحكم في الوصول.
00:09:42لكن في رأيي، لم أجد واجهة Headscale UI مفيدة بشكل كبير.
00:09:46نعم، الإعداد معقد قليلاً.
00:09:49حسناً، إنه معقد حقاً.
00:09:51أي شخص ليس لديه خلفية تقنية أو حتى مطور مبتدئ سيعاني في إعداد هذا بمفرده.
00:09:57وهذا على الأرجح هو السبب في أن فريق Tailscale سمح لموظفهم بالعمل على هذا المشروع لأنه لا يشكل تهديداً كبيراً لشركتهم في الوقت الحالي.
00:10:07أعني، كل ما يتطلبه الأمر هو أن يستخدم شخص ما Claude Opus لإنشاء واجهة مستخدم جميلة له وقد يكون لديهم شيء رائع حقاً، وهو ما قد يتم تقييده بواسطة هذا الترخيص.
00:10:18لكن بمجرد أن يعمل كل شيء، فإن Headscale يعمل بشكل مذهل.
00:10:22على الرغم من وجود بعض الميزات التي لا يدعمها بعد، مثل أوامر funnel و serve التي يمكنك استخدامها لعرض خادم بشكل عام أو لشبكتك فقط.
00:10:32إنه لا يدعم شبكات tail nets المتعددة، والعقد المؤقتة، وسجلات تدفق الشبكة الأصلية.
00:10:38لكن بالنسبة لأداة مفتوحة المصدر، فهذا مثير للإعجاب حقاً.
00:10:42وإذا وصلت يوماً إلى مرحلة أريد فيها تشغيل OpenClaw الخاص بي دون اتصال بالإنترنت تماماً مع نموذج لغوي محلي، فقد أفكر في استخدامه.