أسماء عملاء OpenVPN في dnsmasq: سكربت أم إعدادات ثابتة؟
عناوين العملاء تتغير، أما أسماء الخدمات فلا. أنشئ أسماء العملاء من جلسة VPN، وثبّت أسماء الخدمات في ملف drop-in، ثم اجعل العملاء يستخدمونه.
تظهر مشكلتا تسمية على كل بوابة OpenVPN صغيرة تقريبًا. لا يمكنك الوصول إلى حاسوب محمول متصل بالاسم الموجود في شهادته، والخدمات خلف النفق لا تملك أسماء على الإطلاق. تبدوان كمشكلة واحدة وتحتاجان إلى معالجتين متعاكستين، لأن أحد العنوانين يتغير مع كل جلسة والآخر لا يتغير. قرّر أي نوع من الأسماء تضيفه قبل أن تعدّل أي شيء.
قرّر لكل اسم، لا لكل بوابة
الاختبار بسيط: هل يتغير هذا العنوان عندما يعيد العميل الاتصال؟ إن كان الجواب نعم، فيجب توليد الاسم من جلسة VPN. وإن كان لا، فهو ينتمي إلى إدخال ثابت يمكنك قراءته ومراجعته.
| Name kind | Source of truth | Where it lives |
|---|---|---|
| Connected client | The address OpenVPN just assigned | Generated hosts file, rewritten per session |
| Service behind the tunnel | A fixed address you chose | Static address= drop-in |
| Anything with a certificate name | The certificate, not the pool | Either, but the name must match the certificate |
خلط النوعين هو الفشل المعتاد. الخدمة المثبتة في الملف المولَّد تختفي في أول مرة يعيد فيها السكربت كتابته، والعميل المكتوب في إدخال ثابت يشير إلى من كان يحمل ذلك العنوان آخر مرة. يبقى الخطآن غير مرئيين حتى يُحلّ الاسم إلى الجهاز الخطأ. وعندها يفترض من يقوم بالتنقيح أن DNS معطوب لا أن الملف هو المشكلة.
المسار الديناميكي: learn-address ومجمّع العناوين
OpenVPN يعرف الإسناد، فدعه يخبرك به. خيارات الخادم هذه تجعل الإسناد دائمًا وقابلًا للبرمجة النصية:
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ip-pool 60
script-security 2
learn-address /etc/openvpn/learn-address.sh
learn-address يشغّل سكربتك كلما أُضيف عنوان أو حُدّث أو حُذف، ويمرّر العملية والعنوان والاسم الشائع. السكربت الأدنى يضيف سطرًا واحدًا لكل عميل ويحذفه عند الحذف:
#!/bin/sh
HOSTS=/etc/openvpn/hosts.lan
case "$1" in
add|update) echo "$2 $3" >> "$HOSTS" ;;
delete) sed -i "/^$2 /d" "$HOSTS" ;;
esac
kill -HUP $(cat /var/run/dnsmasq.pid)
على جهاز tun تكون الوسيطة الثانية هي عنوان النفق الخاص بالعميل، لذا يكون السطر صالحًا للاستخدام مباشرة. أما على جهاز tap فيمرّر OpenVPN عنوان MAC الخاص بالعميل بدلًا من ذلك، لأن مقطع tap يمكنه حمل بروتوكولات غير IPv4، وعندها عليك البحث عن العنوان في ملف المجمّع بالاسم الشائع قبل كتابة أي شيء.
كن واضحًا بشأن ما هو الملف المولَّد: لقطة لمن المتصل الآن. تختفي الأسماء عند قطع الاتصال، وهذا بالضبط ما تريده للحواسيب المحمولة التي تنتقل بين الشبكات، وبالضبط ما لا تريده لخادم يعمل طوال الليل.
المسار الثابت: address= وتوسيع النطاق
وجّه dnsmasq إلى الملف المولَّد بدلًا من ملف hosts في النظام، وأعطه نطاقًا حتى تتوسع الأسماء القصيرة إلى أسماء مؤهلة بالكامل:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
مع ضبط domain، فإن سطرًا مثل 10.8.0.6 alice يستجيب لكل من alice و alice.corp.example. احصر listen-address في بوابة النفق والاسترجاع المحلي، لأن خادم أسماء منشورًا على واجهة الشبكة المحلية بالخطأ هو خدمة لم تقصد تقديمها.
الخدمات التي لا تأتي من المجمّع أبدًا تحصل على إدخالاتها الخاصة. ضعها في ملف drop-in منفصل داخل دليل إعدادات التوزيعة حتى لا تتمكن ترقية الحزم من الكتابة فوقها:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
سلّم خادم الأسماء، أو لن يحدث شيء
خادم أسماء لا يستعلم عنه أحد لا يغيّر شيئًا. على الخادم أن يعلن عنه:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
يطبّق عملاء Windows الخيارين بأنفسهم. معظم عملاء Linux لا يفعلون ذلك: يحتاجون إلى تكامل مدعوم مع خادم الأسماء مثل خطاف update-resolv-conf في التوزيعة أو معالجة DNS في NetworkManager، أو نطاق بحث وخادم أسماء يدويين. تحقّق من خادم الأسماء الفعلي للعميل بدلًا من افتراض أن الدفع قد احتُرم، لأن دفعًا يُتجاهل يبدو تمامًا كخادم لا يستجيب.
تحقّق على ثلاث طبقات
اسأل الخادم مباشرة أولًا، ثم عميلًا، ثم التطبيق:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
إذا أجابت الاستعلامات المباشرة ولم يجب التطبيق، فالخطأ في تسليم العميل لا في المنطقة. وإذا حُلّ الاسم وظل الاتصال يفشل، فالاسم سليم والمسار أو جدار الحماية هو ما يجب النظر إليه تاليًا.
اكتب الفئتين بجانب الإعدادات: أي الأسماء مولَّدة، وأيها مثبتة، وأي شهادة يجب أن يطابقها كل منها. الشخص التالي الذي يضيف خادمًا سينسخ أول نمط يجده.