Mae amddiffyn VpnService yn methu pan fo VPN arall eisoes yn weithredol
Mae Android yn caniatáu un rhyngwyneb VPN i bob defnyddiwr. Rheswch y gwiriadau prepare, establish, protect a pherchnogaeth yn y drefn honno, yna dewiswch ddirymu neu eithrio fesul ap.
Mae eich ap yn galw VpnService.prepare, yn cael null yn ôl, yn adeiladu twnnel, ac mae’r disgrifydd yn edrych yn ddilys, ond nid oes dim yn cyrraedd y gweinydd. Neu mae prepare yn dychwelyd Intent, mae’r defnyddiwr yn ei gymeradwyo, ac mae establish yn dal i fethu. Mae’r ddau ganlyniad fel arfer yn golygu’r un peth: mae ap arall eisoes yn berchen ar y rhyngwyneb VPN ar gyfer y defnyddiwr hwn, ac mae eich galwadau protect yn marcio socedi na all eich twnnel eu defnyddio. Ewch drwy’r gwiriadau isod yn y drefn honno a stopiwch ar yr un cyntaf sy’n methu, oherwydd ni all cam diweddarach drwsio un cynharach.
Gwiriwch y slot VPN cyn i chi gyffwrdd â protect
Mae Android yn rhoi i bob defnyddiwr un rhyngwyneb VPN gweithredol yn union. Rheol platfform yw hon, nid caniatâd y gall eich ap ei ofyn, felly ni all dau gleient sy’n awyddus i fod y twnnel gydfodoli.
VPN bob amser ymlaen a osodwyd ar gyfer ap arall yw’r achos anoddaf, oherwydd mae’r system yn cadw’r ap hwnnw’n gysylltiedig ac yn gwrthod cymryd drosodd. Gall hidlydd traffig fel AdGuard, cleient corfforaethol neu VPN defnyddwyr ddal y slot tra bo’r defnyddiwr wedi anghofio ei fod wedi’i osod. Gofynnwch i’r defnyddiwr agor Gosodiadau a darllen y cofnod a restrir o dan VPN; yr enw yno yw’r perchennog yr ydych yn cystadlu ag ef. Hyd nes y bydd y cofnod hwnnw’n cael ei ddatgysylltu neu’r gosodiad bob amser ymlaen yn cael ei glirio, ni all eich VpnService ddod yn rhyngwyneb.
Cam 1: darllenwch yr hyn y mae prepare yn ei ddychwelyd
Mae VpnService.prepare yn ateb un cwestiwn: a ganiateir i’r ap hwn ddod yn VPN? Mae’n dychwelyd null pan fo cydsyniad eisoes yn bodoli, ac Intent pan fo’n rhaid i’r defnyddiwr ei gymeradwyo o hyd, y mae’n rhaid i chi ei lansio gyda startActivityForResult. Triniwch null a ddychwelwyd fel caniatâd i fwrw ymlaen, nid fel prawf y bydd establish yn llwyddo.
Intent intent = VpnService.prepare(context);
if (intent != null) {
startActivityForResult(intent, REQUEST_VPN);
}Os yw’r llwybr Intent yn dychwelyd ac mae’r defnyddiwr wedi gwrthod, bydd prepare yn dal i ddychwelyd Intent ar yr ymgais nesaf. Cofnodwch y cod canlyniad yn lle ceisio eto mewn dolen, oherwydd penderfyniad defnyddiwr yw cydsyniad a wrthodwyd, nid gwall dros dro.
Cam 2: cadarnhewch fod y rhyngwyneb yn perthyn i’ch ap
Ar ôl establish, eich ParcelFileDescriptor a gewch yw eich prawf perchnogaeth, ac mae’n werth ei wirio cyn unrhyw waith soced. Mae disgrifydd sy’n null neu eisoes ar gau yn golygu na chrëwyd y rhyngwyneb erioed, hyd yn oed os na ymddangosodd unrhyw eithriad. Cymharwch enw’r rhyngwyneb o’r adeiladydd â’r un y mae’r system yn ei adrodd ar gyfer y VPN gweithredol, gan ddefnyddio dumpsys ar ddyfais brawf. Os ydynt yn wahanol, nid y twnnel a adeiladwyd gennych yw’r twnnel sy’n cario traffig.
adb shell dumpsys connectivityMae’r un anghysondeb yn esbonio eicon cysylltiedig â thraffig marw. Mae’r system yn dangos twnnel yr ap arall, tra bo’ch cod yn dal disgrifydd ar gyfer rhyngwyneb nad yw’n berchen arno.
Cam 3: galwch protect cyn connect
Unwaith y bydd y rhyngwyneb yn bodoli, mae socedi y mae’ch ap yn eu hagor yn cael eu cyfeirio i’r twnnel yn ddiofyn. Ni all y transport allanol ddilyn y rheol hon neu byddai’r pecyn wedi’i amgáu yn dychwelyd i’r rhyngwyneb, felly VpnService protect yn marcio soced i osgoi’r VPN a defnyddio’r rhwydwaith sylfaenol. Mae’r alwad yn dychwelyd boolean, a’i anwybyddu yw’r ffordd y cewch soced sy’n edrych yn iach ac nad yw’n cario dim.
Galwch protect cyn connect neu bind, byth ar ôl. Rhaid i amddiffyniad fod yn ei le cyn i’r soced gael ei gysylltu neu ei rwymo, oherwydd mae soced cysylltiedig eisoes wedi dewis ei lwybr ac nid yw protect diweddarach yn ei symud yn ddibynadwy. Os yw protect yn dychwelyd false, stopiwch ac ailwirio perchnogaeth: mae’n methu pan nad yw’r rhyngwyneb yn perthyn i’ch ap, sef yn union y cyflwr y mae VPN arall yn ei adael. Mae dychweliad false yn arwydd i fynd yn ôl i Gam 1, nid i ailgeisio’r un soced.
DatagramSocket socket = new DatagramSocket();
if (!vpnService.protect(socket)) {
return;
}
socket.connect(serverAddress, serverPort);Cam 4: rhwymwch broses pan fo soced yn anghyfleus
Nid yw rhai transportau yn un soced: gall llyfrgell agor sawl un, neu efallai y byddwch am i bob cysylltiad mewn proses gymorth ddefnyddio’r un allanfa. Mae ConnectivityManager.bindProcessToNetwork yn rhwymo’r broses i rwydwaith a ddewiswyd, ac roedd yr hen setProcessDefaultNetwork yn gwneud yr un gwaith cyn iddo gael ei ddibrisio. Gofynnwch am y cysylltiad sylfaenol gyda NET_CAPABILITY_NOT_VPN fel bod y rhwymiad yn dewis y rhwydwaith o dan eich twnnel yn hytrach na’r twnnel ei hun.
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();Nid yw rhwymo proses yn ail VPN. Mae’n dewis allanfa ar gyfer y broses honno, sy’n ddefnyddiol i’ch transport ac yn ddiwerth ar gyfer rhedeg dau dwnnel ar unwaith.
Trwsiwch ddyfais y defnyddiwr, nid llwybr y cod
Nid oes API sy’n gadael i ddau ap rannu’r slot VPN, felly mae’r trwsiad yn perthyn i gyflwr y ddyfais. Cynigiwch ddau lwybr pendant i’r defnyddiwr: datgysylltwch neu gliriwch bob amser ymlaen ar gyfer yr ap arall fel y gall eich prepare gymryd drosodd, neu agorwch osodiadau fesul ap yr ap hwnnw a chau eich ap allan o’i dwnnel. Mae’r eithriad yn cadw’r hidlydd i redeg ar gyfer popeth arall ac yn gadael i’ch ap ddefnyddio’r cysylltiad cyffredin, sef yn aml y canlyniad y mae’r defnyddiwr ei eisiau mewn gwirionedd.
Ysgrifennwch y ddau lwybr yn eich dogfennaeth gymorth, oherwydd anaml y bydd defnyddwyr yn gwybod pa ap sy’n berchen ar y VPN. Gofynnwch iddynt anfon enw’r VPN gweithredol o Osodiadau a chanlyniadau prepare, establish a protect o’ch logiau, a gallwch ddweud mewn munud pa gam a fethodd. Yna gwiriwch gyda thraffig go iawn: chwiliad enw, cysylltiad TCP, ac un cais drwy’r twnnel, nid eicon cysylltiedig yn unig. Mae disgrifydd dilys a dangosydd gwyrdd yn profi perchnogaeth ar y gorau, byth fod y transport wedi goroesi’r rheolau llwybro.
Os bydd y pedwar gwiriad yn pasio ac mae traffig yn dal i farw, nid perchnogaeth yw eich problem mwyach. Ewch ymlaen i lwybro a chyrraedd y gweinydd, a phrofwch yr un manylion mewngofnodi o ddyfais heb ap VPN wedi’i osod.