टनेल सक्रिय हुँदा एउटा स्क्रिनले फरक व्यवहार गर्नुपर्छ, र त्यो भन्ने कुनै कल छैन। यही शिपिङ सीमा हो: macOS मा कुनै सार्वजनिक फ्रेमवर्कले कुनै पनि VPN जोडिएको छ कि छैन भनी जानकारी दिँदैन, र iOS मा स्थिति कन्फिगरेसन स्थापना गर्ने एपको हुन्छ। तलका जाँचहरू त्यो सीमाबाट तपाईंले शिप गर्न सक्ने कुरासम्म पुर्याउँछन्, र तीमध्ये कुनैले पनि खोज चाँडै अन्त्य गर्न सक्छ।

जाँच 1: यो प्रश्नको उत्तर दिन सकिन्छ त?

स्यान्डबक्सले कुनै पनि API भन्दा अघि प्रश्न टुङ्गो लगाउँछ। तेस्रो पक्षको प्रक्रियाले अर्को विक्रेताको एक्सटेन्सन सूचीबद्ध गर्न सक्दैन, र त्यो एक्सटेन्सनको कन्फिगरेसन पनि पढ्न सक्दैन, त्यसैले सोध्न कुनै समर्थित वस्तु छैन।

हरेक बाइपास एउटै पर्खालमा ठोकिन्छ। इन्टरफेस सूचीहरू, scutil --nc list र सिधै सिस्टम-कन्फिगरेसन पढ्ने काम या त स्यान्डबक्सले रोक्ने अधिकार माग्छ वा Apple ले कहिल्यै वाचा नगरेको व्यवहारमा निर्भर हुन्छ। यदि योजनालाई यीमध्ये कुनै चाहिन्छ भने, समस्या योजनामै छ। अभिलेख नगरिएको विवरणमा बनेको सुविधा डेलिभरी मिति भएको सपोर्ट टिकट हो।

जाँच 2: तपाईंको एपले टनेल आफै व्यवस्थापन गर्छ?

यदि गर्छ भने, तपाईंको आफ्नै कन्फिगरेसनका लागि समर्थित उत्तर छ। प्राथमिकताहरू लोड गर्नुहोस्, त्रुटि सम्हाल्नुहोस्, त्यसपछि स्थिति पढ्नुहोस् र पोलिङको सट्टा परिवर्तनहरूमा सदस्यता लिनुहोस्:

vpnManager.loadFromPreferences { error in
    // handle a load failure before reading status
}

NotificationCenter.default.addObserver(
    forName: .NEVPNStatusDidChange,
    object: nil,
    queue: nil
) { note in
    let status = (note.object as? NEVPNConnection)?.status
}

यसले के फर्काउँछ भन्नेमा सटीक हुनुहोस्: तपाईंले स्थापना गरेको टनेलको अवस्था। अर्को क्लाइन्ट चलाउने प्रयोगकर्ता विच्छेदित देखिन्छ, र त्यो तपाईंको कोडमा बग होइन। उत्तरमा निर्माण गर्नु अघि तपाईंको सुविधाले यी दुई प्रश्नमध्ये कुन सोधिरहेको छ भनेर निर्णय गर्नुहोस्।

जाँच 3: ह्युरिस्टिकले वास्तवमा तपाईंलाई के भन्छ?

व्यापक रूपमा प्रतिलिपि गरिएको दृष्टिकोणले सिस्टम प्रोक्सी शब्दकोशलाई यसका स्कोप गरिएका प्रविष्टिहरू सोध्छ र कुञ्जीहरू पढ्छ, जो संयोगवश इन्टरफेस नाम हुन्छन्:

let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []

जुन कुञ्जी tap, tun, ppp, ipsec वा utun बाट सुरु हुन्छ, त्यसले टनेल-स्कोप गरिएको इन्टरफेस रहेको सङ्केत गर्छ। पूरा नाम मिलाउनु तुरुन्तै असफल हुन्छ, किनकि iOS 12 utun1 र utun2 सँग आयो र केही प्रोफाइल ipsec4, ppp0 वा utun0 को रूपमा देखिन्छन्। यसको सट्टा प्रिफिक्सहरू तुलना गर्नुहोस्।

तैपनि नामले कुनै मालिक पहिचान गर्दैन। सिस्टम सुविधाहरू र अन्य विक्रेताका एक्सटेन्सनहरूले पनि utun इन्टरफेस बनाउँछन्, र तपाईंको ट्राफिकको केही पनि नबोकी एउटा अस्तित्वमा हुन सक्छ। यसलाई नजिकै टनेल-आकारको केही छ भन्ने सङ्केतको रूपमा पढ्नुहोस्, त्यसभन्दा बलियो केही होइन। यहाँ झुटो पोजिटिभ सस्तो छ यदि तपाईं एउटा मात्र सुविधा गेट गर्नुहुन्छ, र महँगो छ यदि लगइन स्क्रिन गेट गर्नुहुन्छ।

जाँच 4: यसको सट्टा गन्तव्य परीक्षण गर्न सकिन्छ?

यदि एपले आन्तरिक सेवा पुग्न सकिन्छ कि भन्ने मात्र जान्नुपर्छ भने, त्यो सेवा परीक्षण गर्नुहोस्। टाइमआउटसहितको छोटो प्रोबले सुविधा वास्तवमा निर्भर हुने प्रश्नको उत्तर दिन्छ, र प्रयोगकर्ताले क्लाइन्ट बदल्दा वा टनेलको आकार बदल्दा पनि यो काम गर्छ।

पहुँचयोग्यता तपाईंको मार्गको बारेमा एउटा अवलोकन हो। इन्टरफेसको नाम तपाईंको मार्गसँगै रहेको कुनै कुराको बारेमा एउटा अनुमान हो, त्यसैले ह्युरिस्टिकले बग रिपोर्टमा बहस उत्पन्न गर्छ र प्रोबले प्रमाण। यदि प्रयोगकर्ताले VPN सक्रिय छ भनी जिद्दी गर्दा प्रोब असफल भयो भने, अब डिबग गर्न तपाईंसँग ठोस मार्ग छ: नाम-समाधान, मार्ग वा सेवा अनुमति।

जाँच 5: प्लेटफर्मले तपाईंलाई चाहिने कुरा लागू गर्न सक्छ?

जब आवश्यकता टनेलबाट केही पनि भाग्ने छैन भन्ने ग्यारेन्टी हो, प्रोफाइल त्यसको ठाउँ हो, डिटेक्टर होइन। includeAllNetworks लाई iOS 14 वा पछिको संस्करणमा पूर्ण-टनेल कन्फिगरेसनमा सक्रिय गर्दा तपाईंको एपलाई अनुमान गर्न भन्नुको सट्टा प्लेटफर्मको व्यवहार बदलिन्छ। यो फ्ल्याग NEVPNProtocol सन्दर्भमा अभिलेख गरिएको छ।

यो फरक प्रकारको उत्तर हो: अवलोकनको सट्टा प्रवर्तन। यो पनि तपाईंले नियन्त्रण गर्ने प्रोफाइलमा मात्र लागू हुन्छ, त्यसैले अरू कसैको टनेल हेरिरहेको उपभोक्ता एपलाई यसले मद्दत गर्दैन।

जाँच 6: असफलतालाई सुरक्षित र अवलोकनयोग्य बनाउनुहोस्

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

तपाईंले के अवलोकन गर्नुभयो लग गर्नुहोस्: इन्टरफेस नामहरू, प्लेटफर्म संस्करण र एउटा प्रोबको नतिजा। यसले अर्को रिपोर्टलाई बहसबाट जाँचमा बदल्छ। त्यसपछि जहाँ समर्थित घोषणा छ त्यसलाई प्राथमिकता दिनुहोस्, किनकि व्यवस्थित कन्फिगरेसनले मनसाय स्पष्ट रूपमा बोक्न सक्छ र नाम जाँच्ने अधिकांश कारण हटाउन सक्छ।

यदि 1 देखि 5 सम्मका जाँचहरूले तपाईंलाई समर्थित उत्तरबिना छोडे, प्रोब शिप गर्नुहोस् र नतिजालाई इमानदारीसाथ लेबल गर्नुहोस्। अभिलेख गरिएको उत्कृष्ट-प्रयास सङ्केत अर्को रिलिजमा टुट्ने निजी API भन्दा राम्रो उत्पादन-निर्णय हो।

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