إرجاع عنوان من سكربت client-connect يبدو وكأنه يجب أن يضبط عنوان IP للعميل. لكنه لا يفعل ذلك: القناة الوحيدة للخطاف إلى الخادم هي ملف مؤقت يصل مساره بوصفه الوسيط الأخير للسكربت، ويجب كتابة العنوان هناك بصياغة ifconfig-push. السكربت الذي يطبع العنوان أو يخرج بالرمز صفر دون كتابة أي شيء ينتج عميلاً متصلاً بعنوان من التجمع، ويبدو سجل الخادم سليماً تماماً.

الالتباس مفهوم، لأن خطافات أخرى عدة تتواصل فعلاً عبر رموز الخروج أو متغيرات البيئة. هذا الخطاف له عقد خاص به، والعقد يبدأ باسم ملف.

الخطاف يكتب ملفاً، لا قيمة إرجاع

التصريح سطران: script-security 2 للسماح بالنداء، ثم client-connect /etc/openvpn/server/assign-address.sh. عندما يصادق عميل، يشغّل الخادم ذلك السكربت مع إلحاق مسار الملف المولّد بوصفه الوسيط الأخير، وهو $1 فقط إذا لم يمرر التصريح أي وسائط إضافية خاصة به. كل ما يطبق على ذلك العميل يكتب في ذلك الملف كتوجيهات عادية، واحداً في كل سطر، تماماً كما تظهر في إعداد. الغلاف الذي يضيف معاملاته الخاصة يزيح الموضع، والعرض الكلاسيكي سكربت يكتب إلى مسار يشبه --verbose.

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

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

تصل المدخلات عبر متغيرات البيئة: common_name، trusted_ip، ifconfig_pool_remote_ip والباقي. تعامل معها كلها كنصوص من خارج الخادم، لا كأجزاء من صدفة.

ربط العناوين سياسة، لا حساب

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

من يتحكم في الاسم يتحكم في العنوان، لذا قرر ما يمثله common_name فعلاً في هذا النشر. مع تفعيل username-as-common-name، تكون الهوية اسم الدخول لا موضوع الشهادة. لا تمرر تلك القيمة أبداً إلى تقييم صدفة، ولا تدع العميل يؤثر في مسار ملف.

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

الطوبولوجيا تحدد معنى ifconfig-push

مع topology subnet على 10.77.0.0/24، يكون ifconfig-push 10.77.0.20 255.255.255.0 عنواناً مع قناع شبكته. تحت topology net30 لا يكون الوسيط الثاني قناع شبكة إطلاقاً بل عنوان النظير، لذا فإن نسخ صيغة الشبكة الفرعية إلى خادم net30 يمنحك عميلاً يرتبط ولا يستطيع تمرير حركة. غير الطوبولوجيا عن عمد، لا أبداً لجعل مثال يبدو متسقاً. الخادم الذي يعمل بالفعل على net30 لديه عملاء أحياء على العنونة القديمة، لذا فإن التبديل هو ترحيل مع نافذة صيانة، لا تعديل سطر واحد.

يجب أن تقع العناوين الثابتة خارج التجمع الديناميكي وخارج كل تخصيص ثابت آخر، بما في ذلك تلك التي توزعها ملفات client-config-dir العادية. إذا كان في مقدور آليتين إنتاج العنوان نفسه لعملاء مختلفين، فستفعل إحداهما ذلك في النهاية.

اختبر أربع حالات قبل أن تثق به

شغل الفحوصات نفسها على هوية مربوطة، وهوية غير مربوطة، وإعادة اتصال، وفشل سجل محاكى. يظهر openvpn --config client.ovpn --verb 4 العنوان المعين في رد الدفع، وعلى الخادم يؤكد grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log ما أرسل فعلاً. بالنسبة للهوية غير المربوطة، النتيجة المتوقعة هي اتصال مرفوض، لا عنوان من التجمع.

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

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

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