“क्या VPN चालू है?” वास्तव में एक ही वाक्य में तीन सवाल हैं। आपके कोड को इनमें से कौन-सा चाहिए, यह पहला फ़ैसला है, और ज़्यादातर कार्यान्वयन इसी को छोड़ देते हैं। क्या इस डिवाइस पर टनल मौजूद है, क्या इस गंतव्य की ट्रैफ़िक उससे होकर बाहर जाती है, या दूर का सिरा उस पहचान के साथ उत्तर देता है जिसकी आप अपेक्षा करते हैं। गुण चुनें, फिर वह संकेत चुनें जो उसे मापता है, और अंत में लॉग में लिखें कि आपने वास्तव में किसे मापा।

तीन गुण, तीन संकेत

हर एक को एक पंक्ति में सिकोड़ने पर, तीनों सवालों के तीन अलग जवाब हैं। नीचे दी गई तालिका स्वयं निर्णय है, उसका सारांश नहीं।

PropertySignal that answers itWhat it still leaves open
ExistenceThe platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOSTunnels of a type the platform does not manage, which includes most third-party clients
PathA route lookup for the one destination, or a scoped proxy or interface key that names the tunnelWhether the far end is the peer you trust
IdentityAn authenticated response from the far end, or a source-address policy applied on the serverWhich local interface carried the packets

आखिरी पंक्ति धीरे पढ़ें। उत्तर देने वाला निजी होस्ट यह साबित करता है कि किसी ने उत्तर दिया, यह नहीं कि उत्तर टनल से होकर आया, और यह दूसरे सिरे पर कौन है इस बारे में कुछ नहीं कहता। अगर आपको चाहिए गुण पथ है, तो पथ मापें।

अस्तित्व: प्लेटफ़ॉर्म की अपनी स्थिति

Windows देशी प्रोफ़ाइलों के लिए यह उत्तर Remote Access Service API के ज़रिए देता है। RasEnumConnections सूची बनाता है कि क्या जुड़ा है, RasGetConnectStatus एक प्रविष्टि की स्थिति बताता है, और RasGetLinkStatistics गति, बाइट काउंटर और कनेक्शन की आयु जोड़ता है। सीमाएँ ही मुख्य बात हैं: OpenVPN, WireGuard और विक्रेता क्लाइंट कभी RAS कनेक्शन दर्ज नहीं करते, इसलिए उस प्रकार की स्वस्थ टनल खाली सूची दिखाती है और भोला कोड उसे बंद बता देता है।

Linux डेस्कटॉप वही गुण D-Bus पर NetworkManager के ज़रिए उजागर करते हैं, जहाँ VPN कनेक्शन ऑब्जेक्ट पर PropertiesChanged जाँच को घटना में बदल देता है और State गुण बताता है कि लिंक कब जुड़ी हुई स्थिति तक पहुँचता है। शेल से nmcli connection show --active वही जानकारी पढ़ता है, और डिबगिंग के समय आपको यही चाहिए। macOS वह सूची System Configuration फ़्रेमवर्क में रखता है, और scutil उसका कमांड-लाइन दृश्य है। तीनों एक ऐसे कनेक्शन का वर्णन करते हैं जिसे प्लेटफ़ॉर्म प्रबंधित करता है, और तीनों ऐसी टनल के लिए चुप हो जाते हैं जिसे वह प्रबंधित नहीं करता।

पथ: पैकेट वास्तव में कहाँ जाता है

नाम मिलान वह शॉर्टकट है जिस तक सबसे पहले सब पहुँचते हैं: इंटरफ़ेस की सूची बनाएँ, स्ट्रिंग को tun, tap, ppp या ipsec के सामने जाँचें, और मेल को प्रमाण मानें। यह एक अनुमान-विधि है, और इंटरफ़ेस का समूह एक जैसा दिख सकता है, चाहे उससे होकर कुछ गुज़रे या न गुज़रे। पुराने iOS बिल्ड इस तरह उत्तर देते थे और बाद वाले रुक गए, क्योंकि दिखने वाले इंटरफ़ेस अब दोनों स्थितियों में भेद नहीं करते थे।

वहाँ उसकी जगह सिस्टम प्रॉक्सी शब्दकोश ने ली। जब तक VPN जुड़ा है, प्रॉक्सी सेटिंग्स की कॉल टनल से जुड़े इंटरफ़ेस तक सीमित कुंजियाँ लौटाती है, और जब कुछ भी जुड़ा नहीं है तो शब्दकोश खाली लौटता है। यह सुनने में जितना लगता है उससे कमज़ोर कथन है, क्योंकि यह टनल होने की सिस्टम की मान्यता दर्ज करता है, यह नहीं कि कौन-सा गंतव्य उसका उपयोग करता है।

Android के पास इस जाल का अपना संस्करण है: vpn.connectivity प्रसारण कुछ बिल्ड में मैनिफ़ेस्ट में घोषित रिसीवरों तक पहुँचता है और दूसरों में रनटाइम पर पंजीकृत रिसीवरों तक। इसे सर्वोत्तम प्रयास मानें, और इसके पीछे सीधी जाँच रखें।

जब गंतव्य ही मायने रखता है, तो एडाप्टर सूची के बजाय रूटिंग तालिका से पूछें। डिफ़ॉल्ट-गेटवे अनुमान बहु-नेटवर्क मशीनों पर और ऐसी टनल पर टूट जाते हैं जो अपना गेटवे स्थापित करती हैं।

पहचान: दूर के सिरे की जाँच करें

हर कुछ सेकंड में दूर के सिरे पर ICMP प्रतिध्वनि भेजने वाला लूप इस प्रकार की सबसे सस्ती जाँच है, और यह उपयोगी दिशा में विफल होता है। इसे ऐसे पते पर लक्षित करें जो केवल निजी नेटवर्क के भीतर मौजूद हो, क्योंकि सार्वजनिक पता किसी भी काम करने वाले अपलिंक से उत्तर देता है और कुछ साबित नहीं करता। जहाँ ICMP फ़िल्टर होता है, वहाँ सेवा पोर्ट पर छोटा TCP कनेक्शन वही काम करता है।

सर्वर-पक्ष जाँच के पास ठीक एक संकेत उपलब्ध है: कनेक्शन पर स्रोत पता। रेंज की सूची बनाए रखना रखरखाव का काम है, और यह टनल को किसी भी ऐसे नेटवर्क से अलग नहीं कर सकता जो संयोग से वही ब्लॉक उपयोग करता हो।

मोटी नीति इसके साथ जी सकती है। पहचान नहीं जी सकती, इसलिए क्लाइंट को प्रमाणित करें, इस पर भरोसा करने के बजाय कि उसके पैकेट कहाँ से आते प्रतीत होते हैं।

श्रेणी दर्ज करें, फ़ैसला नहीं

विफलता की श्रेणियाँ लॉग में अलग रखें: कोई इंटरफ़ेस ही नहीं, इंटरफ़ेस मौजूद है पर गंतव्य पहुँच से बाहर, गंतव्य पहुँच में है पर प्रमाणीकरण अस्वीकृत। ये तीन अलग मालिक हैं, और हर एक अलग जाँच खोलता है।

इन्हें एक ही “VPN बंद” में समेट देना रिपोर्ट उस टीम के पास भेजता है जो इसे ठीक नहीं कर सकती। श्रेणी उपयोगी आउटपुट है; फ़ैसला ही इसे ग़लत बनाता है।

संबंधित लेख