192.0.2.10 को पिंग करने से आपको केवल यह पता चलता है कि किसी एक पते ने ICMP इको का जवाब दिया, बस इतना ही। बिना टनल वाले नेटवर्क पर यह फिर भी सफल हो सकता है, क्योंकि वह पता स्थानीय सबनेट पर हो सकता है; स्वस्थ टनल के साथ यह विफल भी हो सकता है, क्योंकि सर्वर HTTPS परोसते समय ICMP छोड़ देता है। आपकी स्क्रिप्ट को जिस जाँच की ज़रूरत है वह प्लेटफ़ॉर्म स्थिति क्वेरी और ऐप जिस गंतव्य का उपयोग करता है उसके लिए मार्ग परीक्षण है। इन्हें दो अलग फ़ील्ड के रूप में लें, कभी एक बूलियन के रूप में नहीं।

इको उत्तर वास्तव में क्या साबित करता है

ICMP एक पहुँच-योग्यता प्रोटोकॉल है जिसे इंटरफ़ेस या टनल की कोई धारणा नहीं है। जब उत्तर आता है, कर्नेल बताता है कि किसी होस्ट ने जवाब दिया; यह नहीं बताता कि किस मार्ग ने अनुरोध ले जाया या किसने उत्तर लाया। फ़िल्टरिंग संकेत को और अधिक शोरगुल बना देती है, क्योंकि इको अनुरोध रोकने वाला फ़ायरवॉल अपने पीछे के पोर्ट के बारे में कुछ नहीं कहता। और स्प्लिट-टनल प्रोफ़ाइल परीक्षण किए गए पते को जानबूझकर बाहर रख सकती है जबकि बाकी सभी गंतव्य काम करते हैं।

आप वास्तव में यह जानना चाहते हैं कि कोई विशेष सेवा उस मार्ग पर उपयोगी है या नहीं जिससे ऐप गुज़रता है। वह होस्ट और पोर्ट चुनें जिन्हें ऐप कॉल करता है, फिर एप्लिकेशन परत पर उत्तर की माँग करें।

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

Android से पिंग नहीं, ट्रांसपोर्ट पूछें

Android स्थिति के प्रश्न का सीधा उत्तर ConnectivityManager के माध्यम से देता है। सक्रिय नेटवर्क की क्षमताओं में VPN ट्रांसपोर्ट फ़्लैग होता है, जो तब सेट होता है जब ट्रैफ़िक VPN इंटरफ़ेस से रूट होता है। यह कॉल स्थानीय, सस्ती और इस बात से स्वतंत्र है कि कोई दूरस्थ होस्ट जवाब देता है या नहीं।

यह Java संस्करण सक्रिय नेटवर्क न होने पर अपवाद फेंकने के बजाय false लौटाता है। चूँकि यह सक्रिय नेटवर्क पढ़ता है, यह वही प्रोफ़ाइल दर्शाता है जो उपयोगकर्ता ने सेटिंग्स में चुनी है।

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

परिवर्तन सूचनाओं के लिए, टाइमर पर पोल करने के बजाय NetworkCallback पंजीकृत करें। इसे VpnService.prepare से न मिलाएँ, जो केवल बताता है कि उपयोगकर्ता ने VPN के लिए अनुमति दी या नहीं, यह नहीं कि पैकेट बह रहे हैं। रद्दीकरण VpnService.onRevoke से आता है, फिर भी सेटिंग्स में प्रोफ़ाइल भूल जाने से कोई प्रसारण नहीं होता।

iOS: इंटरफ़ेस नाम अनुमान हैं, अनुबंध नहीं

कई iOS स्निपेट प्रॉक्सी सेटिंग्स जाँचते हैं, __SCOPED__ शब्दकोश ढूँढते हैं और tap, tun, utun2, ppp या ipsec जैसी इंटरफ़ेस कुंजियाँ खोजते हैं। यह दृष्टिकोण नामकरण की परंपरा है, प्रलेखित गारंटी नहीं, इसलिए इंटरफ़ेस का नाम बदलने वाला OS अपडेट इसे तोड़ सकता है। यह टनल से अधिक जीने वाली पुरानी प्रविष्टियों के लिए true बताने की प्रवृत्ति भी रखता है।

जब कॉन्फ़िगरेशन आपके ऐप के पास हो, तो NEVPNManager इसके बजाय असली स्थिति देता है। यह उस टनल का वर्णन करता है जो आपके ऐप ने शुरू की; प्रति-ऐप VPN के साथ, अन्य ऐप उस टनल से पूरी तरह बाहर रह सकते हैं।

स्थिति पढ़ने से पहले प्राथमिकताएँ फिर से लोड करें, क्योंकि टनल आने-जाने पर मान बदलता है:

let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
    let up = manager.connection.status == .connected
    print(up)
}

प्लेटफ़ॉर्म स्थिति फ़्लैग फिर भी यह साबित नहीं करता कि ट्रैफ़िक पीयर तक पहुँचता है। वही अंतराल मार्ग परीक्षण भरता है, और इसीलिए सपोर्ट के लिए एक बूलियन पर्याप्त नहीं है।

Windows प्रोफ़ाइल असली स्थिति फ़ील्ड दिखाती हैं

Windows VPN प्रोफ़ाइल को एडाप्टर से अलग ट्रैक करता है, और Get-VpnConnection हर ज्ञात प्रोफ़ाइल के लिए ConnectionStatus दिखाता है। Windows क्लाइंट या प्रोविज़निंग पैकेज से बनी प्रोफ़ाइल यहाँ दिखती हैं। यह cmdlet सामान्य टनल डिटेक्टर नहीं है।

नामित प्रोफ़ाइल के लिए फ़ील्ड पढ़ें, और जब प्रोफ़ाइल सभी उपयोगकर्ताओं की हो तो -AllUserConnection जोड़ें:

Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress

तृतीय-पक्ष क्लाइंट अक्सर इस cmdlet को अदृश्य रहते हैं, तब भी जब उनकी टनल चालू हो, इसलिए खाली परिणाम का अर्थ अज्ञात है, डिस्कनेक्टेड नहीं। एडाप्टर सूचियाँ भी उतनी ही भ्रामक हैं: विक्रेता एडाप्टर निष्क्रिय रहते हुए भी बना रह सकता है, और कुछ एडाप्टर केवल सत्र के दौरान होते हैं। Windows के स्वामित्व वाली प्रोफ़ाइल के लिए rasdial एक एग्ज़िट कोड बताता है जिस पर आप शाखा बना सकते हैं। ये सब स्थानीय विश्वास बताते हैं, पीयर की पहुँच नहीं।

स्थिति और मार्ग: दो-भाग की जाँच

कनेक्टेड प्रोफ़ाइल पैकेट कहाँ जाते हैं इसके बारे में कुछ नहीं कहती। स्प्लिट टनलिंग टनल चालू रखते हुए उस गंतव्य को बाहर कर सकती है जिसकी आपको परवाह है। always-on प्रोफ़ाइल मरे सर्वर के साथ भी कनेक्टेड रहती हैं, और टनल गिरने पर kill switch जानबूझकर ट्रैफ़िक रोकता है।

दोनों परतें जाँचें: पुष्टि करें कि VPN ट्रांसपोर्ट या प्रोफ़ाइल सक्रिय है, फिर पुष्टि करें कि गंतव्य उस मार्ग से हल होता है और जवाब देता है। Linux पर, कर्नेल से पूछें कि वह कौन-सा इंटरफ़ेस उपयोग करेगा:

ip route get 192.0.2.10
resolvectl query intranet.example.test

जब क्लाइंट आपके नियंत्रण से बाहर हो, दोनों परिणाम लॉग करें और पैटर्न को परत की ओर इशारा करने दें। कनेक्टेड और विफल मार्ग परीक्षण स्प्लिट टनलिंग, DNS या नीति की ओर संकेत करता है। डिस्कनेक्टेड और काम करता मार्ग परीक्षण का अर्थ है कि कोई दूसरा मार्ग ट्रैफ़िक ले जा रहा है।

एक परीक्षण जिसे आप क्रम से चला सकते हैं

कोई भी नेटवर्क स्थिति बदलने से पहले प्लेटफ़ॉर्म स्थिति दर्ज करें। होस्टनाम हल करें और पता परिवार नोट करें, क्योंकि AAAA रिकॉर्ड A रिकॉर्ड से अलग मार्ग ले सकता है। सेवा पोर्ट खोलें और केवल हैंडशेक के बजाय एप्लिकेशन उत्तर की माँग करें। हर अवलोकन को अपने लॉग फ़ील्ड में रखें।

dig और curl वाले Linux बॉक्स पर, तीन कमांड रिज़ॉल्यूशन, मार्ग और सेवा को स्वयं कवर करते हैं। उन्हें टनल चालू होने पर चलाएँ और फिर बंद होने पर दोबारा:

dig +short intranet.example.test
ip route get 198.51.100.20
curl -sS -o /dev/null -w "%{http_code}" --max-time 8 https://intranet.example.test/health

चार अलग फ़ील्ड एक बूलियन से बेहतर हैं, क्योंकि स्थिति, DNS, मार्ग और नीति स्वतंत्र रूप से विफल होते हैं और अलग टीमों तक पहुँचते हैं। टर्मिनल पिंग अच्छा मैनुअल जाँच बना रहता है। ऑटोमेशन के लिए यह कनेक्टिविटी की खराब परिभाषा है, जहाँ प्लेटफ़ॉर्म API और मार्ग परीक्षण असली प्रश्न का उत्तर देते हैं।

संबंधित लेख