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

ابدأ من العملية التي فشلت

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

أعد إنتاج الفشل والخدمة متوقفة، ثم شغّلها في المقدمة تحت المستخدم نفسه إن كانت التطبيقة تسمح بذلك. خطأ تراه بعينك أفضل من سطر سجل عليك تخمينه، وهو يجعل الفرق بين مشكلة قدرات ورفض من SELinux أو AppArmor واضحاً.

اربط كل عملية بسلطة واحدة

الجدول خريطة بداية، وليس بديلاً عن وثائق التطبيقة:

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant for most modern tunnel ports

الصفّان في ذلك الجدول هما اللذان يخلط الناس بينهما. فتح /dev/net/tun مسألة أذونات ملفات؛ أما مطالبة النواة بتهيئة ما فتحته فهي مسألة قدرات. منح CAP_NET_ADMIN لا يصلح عقدة جهاز لا يستطيع مستخدم خدمتك قراءتها، وإصلاح العقدة لا يمنحك سلطة المسارات. افحص الاثنين قبل أن تغيّر أياً منهما.

كما أن WireGuard في النواة وبرامج الأنفاق في مساحة المستخدم ليست لها المتطلبات نفسها. مسار وحدة النواة يهيّئ واجهة قائمة عبر netlink، بينما قد تحتاج تطبيقة في مساحة المستخدم إلى الجهاز أيضاً، وإلى مقابس خام في بعض وسائل النقل.

اقرأ السياق: خدمة أم حاوية أم صدفة

قدرة في فضاء شبكة المضيف يمكن أن تؤثر في أكثر بكثير من العملية نفسها داخل مكدس معزول عمداً. يبدأ وقت تشغيل الحاويات عادةً بمجموعة حدودية مخفّضة؛ وإضافة NET_ADMIN إلى حاوية تشترك في شبكة المضيف منحة أكبر بكثير من إضافتها إلى حاوية لها فضاء شبكة خاص بها ولا تحميلات من المضيف.

بالنسبة لوحدات systemd، اقرأ ما يُطبّق فعلاً لا ما يبدو أن ملف الوحدة يقوله: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities يبلّغ بالقيم الفعّالة، وقد تكون مضبوطة من ملف drop-in نسيته. اطلب القيمة الفعّالة، لا القيمة المقصودة أبداً. قدرات Ambient مهمة لأن خدمة تعمل بغير root تفقد القدرات عبر exec دونها.

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

راقب ما يحدث بعد سقوط الامتيازات

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

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

التطبيقات التي تُبقي النفق مفتوحاً عبر تبديل المستخدم تقرن ذلك عادةً بخيارات لحفظ النفق والمفاتيح. أما في جانب systemd، فالسؤال المكافئ هو هل تنجو مجموعة قدرات الوحدة من تبديل المستخدم الذي أعددته.

سجّل المنحة وسببها

اكتب المنحة الدقيقة، والعملية التي تتيحها، والخطأ الذي أصلحته. سطر واحد في ملاحظات النشر — «CAP_NET_ADMIN في فضاء شبكة الوحدة، مطلوب لتغييرات المسار بعد إعادة الاتصال» — يكفي لمنع الشخص التالي من توسيع المنحة مرة أخرى.

ثم أعد قراءة المجموعة الفعّالة بعد كل ترقية. يضيف المورّدون ميزات، وتغيّر الصور الإعدادات الافتراضية، وقد تصبح قدرة لم تكن ضرورية العام الماضي حاملة للحمل دون أن يلاحظ أحد.

مقالات ذات صلة