حاوية LXD لا يمكنها فتح /dev/net/tun؟ تحقّق من مدخل unix-char
يجب أن تمرّر LXD جهاز TUN من المضيف إلى الحاوية قبل أن يتمكن عميل VPN من استخدامه. اطّلع على ما يضيفه unix-char وما لا يضيفه وكيف تتحقق منه.
تعرض LXD جهاز أحرف من المضيف لحاوية عبر إضافة عقدة جهاز، لا عبر تعليم الضيف إنشاء واحدة. إذا لم يكن في الحاوية /dev/net/tun، فقد يكون الجهاز موجوداً في المضيف ومع ذلك يعجز الضيف عن فتحه. مدخل unix-char هو النصف الخاص بالمدير من هذا المسار، وهو أضيق عمداً من حاوية مميّزة. لذلك يستحق كل من عقدة المضيف وعقدة الحاوية فحصاً منفصلاً.
الآلية قصيرة بما يكفي للإبقاء عليها في الأفق: تحلّل LXD مساراً في المضيف، وتنشئ عقدة مطابقة داخل النسخة، وتضيف الجهاز إلى مجموعة أجهزة الحاوية. بعد ذلك تحتاج عملية الضيف إلى إذنها وقدرتها الخاصة لاستخدام العقدة في أي شيء.
ما الذي يغيّره مدخل unix-char فعلاً
يخبر جهاز unix-char نظام LXD بعرض جهاز أحرف واحد من المضيف في مسار مختار داخل الحاوية. للمدخل ثلاثة أجزاء مهمة: تسمية الجهاز التي يستخدمها المدير، ومسار source في المضيف، ثم path الذي يراه الضيف. الجزءان الأخيران فقط يصفان الجهاز نفسه. خطأ مطبعي في أي منهما ينتج عقدة في موضع لا يفتحه العميل أبداً.
في المضيف يكون الجهاز عادة /dev/net/tun. داخل الحاوية يمكنك إبقاء المسار نفسه أو اختيار آخر، لكن المسار يجب أن يطابق ما يتوقعه عميل VPN. إبقاء /dev/net/tun يتجنب مشكلة إعداد ثانية، لأن معظم العملاء يفتحون ذلك المسار دون سؤال.
يطبّق المدير المدخل عند بدء النسخة أو عند توصيل الجهاز الساخن. وهو لا ينسخ برنامجاً تشغيلياً إلى الضيف ولا ينشئ واجهة نفق. إنه يجعل العقدة مرئية ويسمح بالوصول عبرها من خلال مجموعة التحكم بالأجهزة في الحاوية.
أعلن الجهاز على النسخة، لا داخل الضيف
أضف المدخل من سياق إدارة LXD، مع تسمية النسخة وتسمية يمكنك التعرف عليها لاحقاً. لحاوية اسمها vpnbox يكون الأمر:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
التسمية tun محلية لإعداد النسخة. وهي ليست اسم واجهة ولا يلزم أن تطابق شيئاً في الضيف. إذا كان ملف تعريف يوفّر الجهاز نفسه بالفعل، فإن إضافة مدخل ثانٍ تنشئ تعارضاً لا تكراراً، لذلك افحص الإعداد الفعلي أولاً.
تحرير الملفات داخل الحاوية هو الطبقة الخاطئة. قد يبدو mknod في نص بدء التشغيل ناجعاً على حاوية مميّزة، ثم يختفي عند إعادة الإنشاء أو يفشل على حاوية أقل تمييزاً. المدير يملك مجموعة أجهزة النسخة؛ دعه يملك العقدة أيضاً.
طابق الملكية والوضع مع عملية الضيف
يمكن لمدخل unix-char تعيين uid و gid و mode للعقدة داخل الحاوية. استخدمها لمطابقة الحساب الذي يشغّل عميل VPN، بدلاً من فتح الجهاز لكل مستخدم أو تحويل الحاوية إلى الوضع المميّز.
الظهور ليس هو الإذن. عقدة يملكها root بالوضع 600 تكون مرئية للخدمة العاملة بحساب غير مميّز وتبقى غير قابلة للفتح من قِبلها. افحص حساب الضيف أولاً، ثم عيّن الملكية لذلك الحساب، وأبقِ الوضع لا أوسع مما يحتاجه العميل.
تحتاج العملية أيضاً إلى القدرة على تكوين واجهة نفق، وعادةً CAP_NET_ADMIN في فضاء الشبكة الخاص بالحاوية. تمرير الجهاز لا يمنح تلك القدرة، ومنح القدرة لا يوفّر الجهاز؛ فهما شرطان مستقلان.
اعرف ما لا يمنحه المدخل
العقدة المرئية ليست VPN عاملاً. ما زال يجب تثبيت حزمة العميل، وما زال يجب أن يكون ملف التعريف صالحاً، وما زال يجب أن تبدأ الخدمة. تبقى المصادقة والمسارات وDNS عمل العميل، وفشل هناك ليس دليلاً على أن مدخل الجهاز خاطئ.
قد يضيف systemd قيداً آخر. وحدة تحتوي DeviceAllow أو سياسة أجهزة مشدّدة يمكنها منع الوصول إلى عقدة وفّرها مدير الحاويات. افحص سياسة أجهزة الوحدة عندما تكون العقدة موجودة لكن الخدمة تبلغ عن خطأ إذن، وغيّر تلك السياسة بدلاً من توسيع الحاوية.
التوصيل الساخن اختياري وصريح. المدخل ذو required=false يحتاج مسار مصدر ويمكن أن يظهر أو يختفي مع تغيّر جهاز المضيف. تلك دورة الحياة تناسب عتاداً يذهب ويجيء؛ أما جهاز TUN يحتاجه VPN عند الإقلاع، فقد يترك المدخل الاختياري الخدمة تبدأ قبل وجود شرطها المسبق.
تحقّق من الظهور والفتح والواجهة بهذا الترتيب
أولاً أكّد وجود العقدة داخل الحاوية المقصودة. يجب أن يطابق المسار ورقم الجهاز الرئيسي والفرعي والملكية جهاز المضيف والمدخل الذي أضفته. غياب العقدة يعني أن المدير لم يطبّق المدخل، أو طبّقه على نسخة أخرى.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
بعد ذلك أكّد أن حساب الخدمة يستطيع فتحه. اختبار قصير بذلك الحساب يفصل مشكلة الملكية عن مشكلة الخدمة. أخيراً ابدأ العميل وأكّد ظهور واجهة نفق؛ تلك الخطوة الثالثة وحدها تثبت المسار كله، لأن الخطوتين الأولى والثانية قد تنجحان بينما ملف تعريف العميل أو قدرته لا يزالان خاطئين.
سجّل النسخة وتسمية الجهاز ومصدر المضيف ومسار الضيف والحساب المالك عند اعتماد التغيير. تلك القيم الخمس هي ما يجب أن تحافظ عليه إعادة إنشاء أو ترحيل أو تغيير ملف تعريف لاحقاً، وهي أسهل بكثير في المقارنة من خطأ إذن بلا سياق.