VPN क्लाइंट की स्क्रिप्टिंग: पासवर्ड से पहले परत चुनें
विक्रेता की CLI, rasdial, ऐप का इरादा या UI ऑटोमेशन हर एक अलग तरह से विफल होते हैं। परत चुनें, गोपनीय को argv से बाहर रखें, और स्थिति का इंतज़ार करें, निकास कोड का नहीं।
स्क्रिप्ट VPN क्लाइंट को उसी परत पर शुरू करती हैं जो लेखक ने चुनी थी, और वह परत शायद ही वह होती है जिसकी काम को ज़रूरत थी। विक्रेता की कमांड लाइन, ऑपरेटिंग सिस्टम का डायलर और मोबाइल ऐप का इरादा सभी कनेक्शन के जीवन के अलग-अलग बिंदुओं पर लौटते हैं। वे गोपनीय को भी अलग तरह से संभालते हैं, और यही अंतर तय करता है कि पासवर्ड मशीन पर हर उपयोगकर्ता को दिखता है या नहीं। स्क्रिप्ट की पहली पंक्ति लिखने से पहले परत चुनें।
परत 1: विक्रेता की कमांड लाइन
अधिकांश डेस्कटॉप क्लाइंट एक कमांड लाइन देते हैं जो प्रोफ़ाइल का नाम और, बहुत बार, पासवर्ड लेती है। Cisco का पुराना क्लाइंट उपयोगकर्ता और पासवर्ड तर्कों के साथ connect क्रिया स्वीकार करता था; macOS अंतर्निहित सेवा को networksetup के ज़रिए प्रस्तुत करता है; NetworkManager nmcli को जवाब देता है। ये कॉल कमांड खत्म होने पर लौटती हैं, जो वह क्षण नहीं है जब टनल उपयोग करने योग्य होती है। अपने तैनात संस्करण के लिए विक्रेता का अपना दस्तावेज़ पढ़ें, क्योंकि ये इंटरफ़ेस बदलते हैं और कुछ पूरी तरह हटा दिए जाते हैं।
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
फ़ायदा यह है कि विक्रेता अपना प्रोफ़ाइल स्टोर जानता है, इसलिए कॉल वही कॉन्फ़िगरेशन उपयोग करती है जो GUI उपयोग करता। नुकसान यह है कि हर विक्रेता अपनी क्रियाएँ गढ़ता है, और एक क्लाइंट के लिए लिखी स्क्रिप्ट दूसरे पर नहीं जाती। जब क्लाइंट तय हो और संस्करण पिन हो तो इस परत को सबसे छोटा रास्ता मानें।
परत 2: ऑपरेटिंग सिस्टम की अपनी सेवा
Windows में डायलर ऑपरेटिंग सिस्टम का हिस्सा है, और यह विक्रेता के प्रोफ़ाइल स्टोर के बजाय फ़ोनबुक प्रविष्टि के विरुद्ध काम करता है। इससे यह क्लाइंट्स के बीच अधिक पोर्टेबल और सेवा खाते से स्क्रिप्ट करने में आसान हो जाता है। इसका यह भी अर्थ है कि कनेक्शन एक जगह मौजूद हो सकता है और दूसरी जगह नहीं, जो गलत सूची में देखने वालों को उलझाता है।
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
जब प्रविष्टि बनानी या हटानी हो तो उसे डायल करने के बजाय PowerShell सतह का उपयोग करें। WMI और cmdlet परतें वही वस्तुएँ अलग नामों से प्रस्तुत करती हैं, और हटाना डिस्कनेक्ट से अलग क्रिया है। केवल डायल करने वाली स्क्रिप्ट माइग्रेशन के बाद पुरानी प्रविष्टियाँ छोड़ देगी। सफ़ाई होने का वादा करने से पहले जाँचें कि आपका ऑटोमेशन किस स्टोर में लिखता है।
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
macOS में समकक्ष नेटवर्क सेवाओं की सूची है, जहाँ मौजूदा सेवा नाम से जुड़ती है, मौके पर बनाई नहीं जाती।
क्रेडेंशियल हर परत पर लीक होते हैं, इसलिए चैनल चुनें
कमांड लाइन पर जो कुछ भी गुज़ारते हैं वह हर स्थानीय उपयोगकर्ता के लिए प्रोसेस तालिका में दिखता है, और आम तौर पर शेल इतिहास में भी बच जाता है। OpenVPN का समर्थित विकल्प यह है कि गोपनीय को फ़ाइल से पढ़ें --askpass के साथ, और फ़ाइल को स्वयं ऐसी अनुमतियाँ चाहिए जो उस पर रखे भरोसे से मेल खाएँ। नामित पाइप गोपनीय को डिस्क पर लिखने से बचाता है लेकिन हर उस प्रक्रिया को जो इसे खोल सकती है वहाँ लिखने देता है। Windows में गोपनीय को क्रेडेंशियल प्रबंधक में, या ऐसी फ़ाइल में रखें जिसे केवल सेवा खाता पढ़ सके, और कभी भी बैच फ़ाइल में शाब्दिक रूप में न रखें।
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
यही नियम टोकन और एक बार उपयोग होने वाले कोड पर भी लागू है: अगर ऑटोमेशन को इनकी ज़रूरत है तो ऑटोमेशन को ऐसा चैनल चाहिए जो कमांड लाइन तर्क न हो। जब तंत्र बदलें तो गोपनीय को घुमाएँ, क्योंकि पुराना मान कहीं लॉग में पड़ा रहा है। काम करने वाली और लीक होने वाली स्क्रिप्ट काम करने वाली स्क्रिप्ट नहीं है।
स्थिति का इंतज़ार करें, फिर एक ही स्वामी की निगरानी करें
इनमें से हर कॉल टनल तैयार होने से पहले लौटती है, इसलिए वह स्थिति पूछें जो क्लाइंट प्रस्तुत करता है या उसके भीतर किसी गंतव्य को समय-सीमा के साथ जाँचें। कनेक्शन कॉल के तुरंत बाद फ़ाइलें कॉपी करना या डेटाबेस कनेक्शन खोलना एक दौड़ है, और यह रुक-रुक कर ऐसे विफल होती है जो नेटवर्क खराबी जैसा लगता है।
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
डिस्कनेक्ट का उलटी दिशा में वही समस्या है: प्रक्रिया रास्तों के जाने से पहले निकल सकती है। क्लाइंट के हुक जहाँ मौजूद हों वहाँ उपयोग करें, जैसे OpenVPN के up और down स्क्रिप्ट या systemd इकाई का ExecStartPost, क्योंकि वे उसी बिंदु पर चलते हैं जो वास्तव में आपके लिए मायने रखता है। हुक उन्हें बुलाने वाले के विशेषाधिकारों से चलते हैं, इसलिए नेटवर्क फिर से शुरू करने वाले हुक को धारणा के बजाय स्पष्ट नियम चाहिए। कनेक्शन के पूरे जीवन में ठीक एक स्वामी रखें।
जब दो पर्यवेक्षक एक ही प्रोफ़ाइल शुरू और बंद करते हैं, परिणाम पुनः कनेक्ट का लूप होता है जो प्रदाता की बाधा जैसा पढ़ा जाता है। रनबुक तब खत्म होती है जब परत प्रलेखित हो, गोपनीय के पास ऐसा चैनल हो जो argv न हो, इंतज़ार की शर्त समय-सीमा के साथ स्थिति जाँच हो, और एक प्रक्रिया जीवन-चक्र की स्वामी हो।