dnsmasq मा OpenVPN क्लाइन्ट नामहरू: स्क्रिप्ट कि स्थिर प्रविष्टि?
क्लाइन्टका ठेगाना बदलिन्छन्, सेवाका नाम बदलिँदैनन्। 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= र डोमेन विस्तार
प्रणालीको hosts फाइलको सट्टा dnsmasq लाई बनाइएको फाइलतर्फ देखाउनुहोस्, र त्यसलाई डोमेन दिनुहोस् ताकि छोटा नाम पूर्ण योग्य नाममा विस्तार हुन्छन्:
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 लाई सुरुङ गेटवे र loopback मा मात्र सीमित राख्नुहोस्, किनकि LAN इन्टरफेसमा दुर्घटनावश प्रकाशित रिजोल्भर त्यस्तो सेवा हो जुन दिने इरादा तपाईंको थिएन।
पूलबाट कहिल्यै नआउने सेवाले आफ्नै प्रविष्टि पाउँछन्। तिनलाई वितरणको कन्फिगरेसन डाइरेक्टरीमा छुट्टै 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 हुक वा NetworkManager को DNS व्यवस्थापन, वा हातले सेट गरिएको खोज डोमेन र नेमसर्भर। push पालना भयो भनी ठान्नुको सट्टा क्लाइन्टको वास्तविक रिजोल्भर जाँच्नुहोस्, किनकि बेवास्ता गरिएको push जवाफ नदिने सर्भरजस्तै देखिन्छ।
तीन तहमा प्रमाणित गर्नुहोस्
पहिले सिधै सर्भरलाई सोध्नुहोस्, त्यसपछि क्लाइन्टलाई, त्यसपछि एप्लिकेसनलाई:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
सिधा प्रश्नले जवाफ दिन्छ र एप्लिकेसनले दिँदैन भने दोष क्षेत्रको होइन, क्लाइन्टलाई हस्तान्तरणको हो। नाम समाधान हुन्छ र जडान अझै असफल हुन्छ भने नाम ठीक छ र अब हेर्नुपर्ने मार्ग वा फायरवाल हो।
दुई वर्ग कन्फिगरेसनको छेउमा लेख्नुहोस्: कुन नाम बन्छन्, कुन स्थिर छन्, र प्रत्येकले कुन प्रमाणपत्रसँग मिल्नुपर्छ। अब सर्भर थप्ने व्यक्तिले पहिलो भेटिएको ढाँचा प्रतिलिपि गर्नेछ।