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

قرّر لكل اسم، لا لكل بوابة

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

Name kindSource of truthWhere it lives
Connected clientThe address OpenVPN just assignedGenerated hosts file, rewritten per session
Service behind the tunnelA fixed address you choseStatic address= drop-in
Anything with a certificate nameThe certificate, not the poolEither, 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

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

اكتب الفئتين بجانب الإعدادات: أي الأسماء مولَّدة، وأيها مثبتة، وأي شهادة يجب أن يطابقها كل منها. الشخص التالي الذي يضيف خادمًا سينسخ أول نمط يجده.

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