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
थेट प्रश्न उत्तर देतात आणि अनुप्रयोग देत नाही, तर दोष झोनचा नाही तर क्लायंटकडे सुपूर्द करण्याचा आहे। नाव सुटते आणि जोडणी तरीही अयशस्वी होते, तर नाव ठीक आहे आणि पुढे मार्ग किंवा फायरवॉल पाहावा।
दोन श्रेणी संरचनेच्या शेजारी लिहा: कोणती नावे तयार होतात, कोणती स्थिर आहेत, आणि प्रत्येकाला कोणत्या प्रमाणपत्राशी जुळावे लागते। पुढे सर्व्हर जोडणारी व्यक्ती पहिले मिळालेले नमुना कॉपी करेल।