மற்றொரு VPN ஏற்கனவே செயலில் இருக்கும்போது VpnService பாதுகாப்பு தோல்வியடைகிறது
Android ஒவ்வொரு பயனருக்கும் ஒரு VPN இடைமுகத்தை அனுமதிக்கிறது. prepare, establish, protect மற்றும் உரிமை சோதனைகளை வரிசையாகச் செய்து, பின்னர் ரத்து அல்லது ஆப் வாரியாக விலக்கைத் தேர்ந்தெடுக்கவும்.
உங்கள் ஆப் VpnService.prepare ஐ அழைக்கிறது, null பெறுகிறது, ஒரு சுரங்கப்பாதையை உருவாக்குகிறது, விவரிப்பான் செல்லுபடியாகத் தெரிகிறது, ஆனால் சேவையகத்தை எதுவும் அடையவில்லை. அல்லது prepare ஒரு Intent ஐத் திருப்பித் தருகிறது, பயனர் அதை அனுமதிக்கிறார், establish இன்னும் தோல்வியடைகிறது. இரண்டு முடிவுகளும் பொதுவாக ஒரே விஷயத்தைக் குறிக்கின்றன: வேறொரு ஆப் ஏற்கனவே இந்தப் பயனரின் VPN இடைமுகத்தை வைத்திருக்கிறது, உங்கள் protect அழைப்புகள் உங்கள் சுரங்கப்பாதை பயன்படுத்த முடியாத சாக்கெட்டுகளைக் குறிக்கின்றன. கீழே உள்ள சோதனைகளை வரிசையாகச் செய்து தோல்வியடையும் முதல் சோதனையில் நிறுத்துங்கள், ஏனெனில் பிந்தைய படி முந்தையதைச் சரிசெய்ய முடியாது.
protect ஐத் தொடுவதற்கு முன் VPN இடத்தைச் சரிபார்க்கவும்
Android ஒவ்வொரு பயனருக்கும் சரியாக ஒரு செயலில் உள்ள VPN இடைமுகத்தை வழங்குகிறது. இது தளத்தின் விதி, உங்கள் ஆப் கேட்கக்கூடிய அனுமதி அல்ல, எனவே இருவரும் சுரங்கப்பாதையாக விரும்பும் இரு வாடிக்கையாளர்கள் ஒன்றாக இருக்க முடியாது.
வேறொரு ஆப்பிற்கு அமைக்கப்பட்ட எப்போதும் இயங்கும் VPN மிகக் கடினமான நிலை, ஏனெனில் கணினி அந்த ஆப்பை இணைத்தே வைத்து கைப்பற்றலை மறுக்கிறது. AdGuard போன்ற போக்குவரத்து வடிகட்டி, நிறுவன வாடிக்கையாளர் அல்லது நுகர்வோர் VPN ஆகியவை பயனர் அது நிறுவப்பட்டதை மறந்திருக்கும் போது இடத்தைப் பிடித்திருக்கலாம். பயனரை அமைப்புகளைத் திறந்து VPN கீழ் பட்டியலிடப்பட்ட உள்ளீட்டைப் படிக்கச் சொல்லுங்கள்; அங்குள்ள பெயரே நீங்கள் போட்டியிடும் உரிமையாளர். அந்த உள்ளீடு துண்டிக்கப்படும் வரை அல்லது எப்போதும் இயங்கும் அமைப்பு அழிக்கப்படும் வரை உங்கள் VpnService இடைமுகமாக முடியாது.
படி 1: prepare எதைத் திருப்பித் தருகிறது என்பதைப் படியுங்கள்
VpnService.prepare ஒரே கேள்விக்குப் பதிலளிக்கிறது: இந்த ஆப் VPN ஆக முடியுமா? ஒப்புதல் ஏற்கனவே இருந்தால் அது null திருப்பித் தருகிறது, பயனர் இன்னும் அனுமதிக்க வேண்டும் என்றால் Intent தருகிறது, அதை நீங்கள் startActivityForResult மூலம் தொடங்க வேண்டும். null திரும்புவதைத் தொடர்வதற்கான அனுமதியாகக் கருதுங்கள், establish வெற்றிபெறும் என்பதற்கான ஆதாரமாக அல்ல.
Intent intent = VpnService.prepare(context);
if (intent != null) {
startActivityForResult(intent, REQUEST_VPN);
}Intent பாதை திரும்பி பயனர் மறுத்திருந்தால், அடுத்த முயற்சியில் prepare மீண்டும் Intent திருப்பித் தரும். சுழற்சியில் மீண்டும் முயல்வதற்குப் பதிலாக முடிவுக் குறியீட்டைப் பதிவு செய்யுங்கள், ஏனெனில் மறுக்கப்பட்ட ஒப்புதல் பயனரின் முடிவு, தற்காலிக பிழை அல்ல.
படி 2: இடைமுகம் உங்கள் ஆப்பிற்குச் சொந்தமானது என்பதை உறுதிசெய்யுங்கள்
establish க்குப் பிறகு பெறும் ParcelFileDescriptor உங்கள் உரிமைக்கான ஆதாரம், எந்தச் சாக்கெட் வேலைக்கும் முன் அதைச் சரிபார்ப்பது மதிப்புள்ளது. null அல்லது ஏற்கனவே மூடப்பட்ட விவரிப்பான் என்பது இடைமுகம் ஒருபோதும் உருவாக்கப்படவில்லை என்பதைக் குறிக்கிறது, எந்த விதிவிலக்கும் தோன்றாவிட்டாலும். builder இன் இடைமுகப் பெயரை கணினி செயலில் உள்ள VPN க்கு அறிவிக்கும் பெயருடன் ஒப்பிடுங்கள், சோதனைச் சாதனத்தில் dumpsys பயன்படுத்தி. அவை வேறுபட்டால், நீங்கள் கட்டிய சுரங்கப்பாதை போக்குவரத்தைச் சுமக்கும் சுரங்கப்பாதை அல்ல.
adb shell dumpsys connectivityஅதே முரண்பாடு இணைக்கப்பட்ட ஐகானுடன் இறந்த போக்குவரத்தை விளக்குகிறது. கணினி மற்ற ஆப்பின் சுரங்கப்பாதையைக் காட்டுகிறது, உங்கள் குறியீடு தனக்குச் சொந்தமில்லாத இடைமுகத்தின் விவரிப்பானை வைத்திருக்கிறது.
படி 3: connect க்கு முன் protect ஐ அழைக்கவும்
இடைமுகம் இருந்ததும், உங்கள் ஆப் திறக்கும் சாக்கெட்டுகள் இயல்பாக சுரங்கப்பாதைக்கு வழிமாற்றப்படும். வெளிப்புறப் போக்குவரத்து அந்த விதியைப் பின்பற்ற முடியாது, இல்லையெனில் உறைந்த பொதி இடைமுகத்திற்குத் திரும்பும், எனவே VpnService protect ஒரு சாக்கெட்டை VPN ஐத் தவிர்த்து கீழ்நிலை வலையமைப்பைப் பயன்படுத்தக் குறிக்கிறது. அழைப்பு boolean திருப்பித் தருகிறது, அதைப் புறக்கணிப்பதே ஆரோக்கியமாகத் தெரிந்தும் எதையும் சுமக்காத சாக்கெட்டை அடையும் வழி.
connect அல்லது bind க்கு முன் protect ஐ அழைக்கவும், ஒருபோதும் பின்னர் அல்ல. சாக்கெட் இணைக்கப்படும் அல்லது பிணைக்கப்படும் முன் பாதுகாப்பு இருக்க வேண்டும், ஏனெனில் இணைக்கப்பட்ட சாக்கெட் ஏற்கனவே அதன் பாதையைத் தேர்ந்தெடுத்துவிட்டது, பின்னர் வரும் protect அதை நம்பகமான முறையில் நகர்த்தாது. protect false திருப்பித் தந்தால், நிறுத்தி உரிமையை மீண்டும் சரிபாருங்கள்: இடைமுகம் உங்கள் ஆப்பிற்குச் சொந்தமில்லாதபோது அது தோல்வியடைகிறது, அதுதான் மற்றொரு VPN விட்டுச் செல்லும் நிலை. false திரும்புவது படி 1 க்குத் திரும்புவதற்கான சமிக்ஞை, அதே சாக்கெட்டை மீண்டும் முயல்வதற்கல்ல.
DatagramSocket socket = new DatagramSocket();
if (!vpnService.protect(socket)) {
return;
}
socket.connect(serverAddress, serverPort);படி 4: சாக்கெட் சிரமமாக இருக்கும்போது ஒரு செயல்முறையைப் பிணைக்கவும்
சில போக்குவரத்துகள் ஒரு சாக்கெட் அல்ல: ஒரு நூலகம் பலவற்றைத் திறக்கலாம், அல்லது உதவி செயல்முறையில் உள்ள ஒவ்வொரு இணைப்பும் ஒரே வெளியேற்றத்தைப் பயன்படுத்த வேண்டும் என நீங்கள் விரும்பலாம். ConnectivityManager.bindProcessToNetwork செயல்முறையைத் தேர்ந்தெடுத்த வலையமைப்புடன் பிணைக்கிறது, பழைய setProcessDefaultNetwork அது வழக்கொழிந்ததாக அறிவிக்கப்படும் முன் அதே வேலையைச் செய்தது. கீழ்நிலை இணைப்பை NET_CAPABILITY_NOT_VPN உடன் கோருங்கள், பிணைப்பு உங்கள் சுரங்கப்பாதையின் கீழ் உள்ள வலையமைப்பைத் தேர்ந்தெடுக்கும், சுரங்கப்பாதையை அல்ல.
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();செயல்முறையைப் பிணைப்பது இரண்டாவது VPN அல்ல. அது அந்தச் செயல்முறைக்கு ஒரு வெளியேற்றத்தைத் தேர்ந்தெடுக்கிறது, இது உங்கள் போக்குவரத்திற்குப் பயனுள்ளது, ஒரே நேரத்தில் இரு சுரங்கப்பாதைகளை இயக்குவதற்குப் பயனற்றது.
குறியீட்டுப் பாதையை அல்ல, பயனரின் சாதனத்தைச் சரிசெய்யுங்கள்
இரு ஆப்கள் VPN இடத்தைப் பங்கிட அனுமதிக்கும் API எதுவும் இல்லை, எனவே திருத்தம் சாதனத்தின் நிலையைச் சார்ந்தது. பயனருக்கு இரண்டு தெளிவான வழிகளை வழங்குங்கள்: மற்ற ஆப்பின் இணைப்பைத் துண்டிக்கவும் அல்லது அதன் எப்போதும் இயங்கும் அமைப்பை அழிக்கவும், உங்கள் prepare கைப்பற்ற முடியும், அல்லது அந்த ஆப்பின் ஆப் வாரியான அமைப்புகளைத் திறந்து உங்கள் ஆப்பை அதன் சுரங்கப்பாதையிலிருந்து விலக்குங்கள். விலக்கல் மற்ற அனைத்திற்கும் வடிகட்டியை இயக்கத்தில் வைத்து உங்கள் ஆப் சாதாரண இணைப்பைப் பயன்படுத்த அனுமதிக்கிறது, இது பெரும்பாலும் பயனர் உண்மையில் விரும்பும் முடிவு.
இரு வழிகளையும் உங்கள் ஆதரவு ஆவணங்களில் எழுதுங்கள், ஏனெனில் எந்த ஆப் VPN ஐ வைத்திருக்கிறது என்பதைப் பயனர்கள் அரிதாகவே அறிவார்கள். அமைப்புகளிலிருந்து செயலில் உள்ள VPN பெயரையும், உங்கள் பதிவுகளிலிருந்து prepare, establish மற்றும் protect முடிவுகளையும் அனுப்பச் சொல்லுங்கள், ஒரு நிமிடத்தில் எந்தப் படி தோல்வியடைந்தது என்று சொல்ல முடியும். பின்னர் உண்மையான போக்குவரத்துடன் சரிபாருங்கள்: பெயர் தேடல், TCP இணைப்பு மற்றும் சுரங்கப்பாதை வழியாக ஒரு கோரிக்கை, இணைக்கப்பட்ட ஐகான் மட்டுமல்ல. செல்லுபடியான விவரிப்பானும் பச்சைக் குறியும் அதிகபட்சம் உரிமையை நிரூபிக்கின்றன, போக்குவரத்து வழிமாற்றல் விதிகளிலிருந்து தப்பியது என்பதை ஒருபோதும் அல்ல.
நான்கு சோதனைகளும் தேர்ச்சியடைந்தும் போக்குவரத்து இன்னும் இறந்தால், உரிமை இனி உங்கள் பிரச்சினை அல்ல. வழிமாற்றல் மற்றும் சேவையக அணுகலுக்குச் செல்லுங்கள், VPN ஆப் நிறுவப்படாத சாதனத்திலிருந்து அதே சான்றுகளைச் சோதியுங்கள்.