“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 बन्द” मा मिलाउँदा प्रतिवेदन त्यस्तो टोलीकहाँ जान्छ जसले यसलाई सुधार्न सक्दैन। वर्ग नै उपयोगी आउटपुट हो; निर्णयले नै यसलाई गलत बनाउँछ।

सम्बन्धित लेखहरू