VPN a bhrath ar Android: cén fáth a gcuireann tun0 agus ping amú
Is coinbhinsiún é ainm comhéadain; cruthaíonn ping go raibh óstach amháin inrochtana. Fiafraigh de NetworkCapabilities cad a dhearbhaíonn líonra, agus ansin freagair do chomhaid ghlao.
Is ainm comhéadain é an seiceáil a úsáideann formhór na n-aipeanna Android chun VPN a bhrath, agus ní raibh sé riamh ina sheiceáil VPN. Tuairiscíonn sé go bhfuil comhéadan éigin ann le teaghrán a raibh súil ag an bhforbróir leis, rud a chiallaíonn OpenVPN ar ghléas amháin agus rud éigin gan bhaint ar ghléas eile. Is é an cineál céanna fianaise é ping: cruthaíonn sé gur fhreagair ceann scríbe amháin, ní gur iompair tollán an paicéad. Is é a nochtann an t-ardán i ndáiríre ná sraith líonraí agus na hiompraíochtaí a dhearbhaíonn gach ceann acu, agus is ceist eile í sin le freagra eile.
Miotas: má tá tun0 ann, tá VPN suas
Is cur i bhfeidhm VpnService iad aipeanna VPN Android a thugann tuairisceoir comhaid tun don chóras. Tagann ainm an chomhéadain ón té a chruthaigh é: cruthaíonn OpenVPN tun0 de ghnáth, cruthaíonn PPTP agus L2TP ppp0, ainmníonn WireGuard a chomhéadan i ndiaidh an tolláin, agus b'fhéidir nach gcuirfidh tollán IPsec aon ainm traidisiúnta i láthair ar chor ar bith. Mar sin féin, cuireann léamh /proc/net/dev nó áireamh na n-ábhar NetworkInterface cuardach ar choinbhinsiún, ní ar fhíric.
Tá an dá threo earráide beo. Is féidir le gléas tun0 a bheith aige le haghaidh tolláin áitiúil nach bhfuil baint ar bith aige le VPN an úsáideora, agus is féidir tollán WireGuard atá go hiomlán sláintiúil a bheith dofheicthe do sheiceáil nach bhfuil aithne aici ach ar an teaghrán tun0. Déanann torthaí dearfacha bréige agus torthaí diúltacha bréige sa phríomhfheidhm chéanna í a bheith dodhéanta mar dhiagnóisic, mar ní féidir muinín a bheith ag ticéad tacaíochta a deir „níor braitheadh aon VPN“ i dtreo ar bith.
Tá an rochtain tar éis cúngú freisin. Cuireann eisiúintí níos nuaí de Android srian ar an méid is féidir le haip choitianta a léamh ó /proc, mar sin féadfaidh seiceáil bunaithe ar ainm a d'oibrigh ar Android 8 liosta folamh a thabhairt ar ghléas níos déanaí gan aon athrú cóid. Nuair a theipeann ar an seiceáil go ciúin ar an taobh oscailte, bíonn an aip den tuairim nach bhfuil VPN ann ar chrua-earraí ina bhfuil an tollán ceart go leor.
Miotas: ciallaíonn ping rathúil go bhfuil an tollán ag iompar tráchta
Éiríonn le ping chuig óstach inmheánach aon uair a bhíonn bealach chuig an óstach sin ann. Le tollán scoilte, féadfaidh an t-óstach a bheith inrochtana trí Wi-Fi agus an tollán suas agus ag déanamh rud éigin eile ar fad. Le VPN in aghaidh an aip, féadfaidh an aip atá ag déanamh an ping a bheith eisiata ón tollán, mar sin téann an macall ICMP amach lasmuigh de agus tagann sé ar ais, rud a chruthaíonn a mhalairt de rud a ghlacann an tseiceáil leis.
Déantar ICMP agus TCP a scagadh ar leith freisin. Rachaidh tollán a cheadaíonn iarratais mhacalla ach a ligeann an port TCP a theastaíonn ó sheirbhís uaidh trí thástáil ping agus teipfidh sé san aip, agus is riail balla dóiteáin ar an taobh thall é sin seachas maoin den ghléas. Is é an t-aon léamh macánta ar ping rathúil ná gur fhreagair an ceann scríbe seo don phrótacal seo ag an nóiméad seo.
Cad a thuairiscíonn an t-ardán i ndáiríre
Ó API 21 ar aghaidh, tugann ConnectivityManager.getAllNetworks() gach líonra atá ar eolas ag an gcóras, agus tuairiscíonn getNetworkCapabilities(network) cad a dhearbhaíonn an líonra sin. Iompraíonn líonra VPN TRANSPORT_VPN. Freagraíonn lúb thar gach líonra ceist amháin: an bhfuil aon VPN suas ar an ngléas seo faoi láthair?
Teastaíonn glao eile do dhara ceist, ceann níos cúinge. Tugann getActiveNetwork() an líonra a d'úsáidfeadh trácht na haipe faoi láthair, agus freagraíonn seiceáil na cumais chéanna air: an rachadh mo thrácht trí VPN? Is féidir leis an dá rud easaontú, agus tá an t-easaontú faisneiseach. Cuireann VPN atá suas ach nach bhfuil gníomhach in iúl ródú in aghaidh an aip nó cumraíocht tolláin scoilte, ní tollán atá ar iarraidh.
Network active = cm.getActiveNetwork();
NetworkCapabilities caps = cm.getNetworkCapabilities(active);
boolean viaVpn = caps != null
&& caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
Cosain an dá ghlao. Is féidir cumais a bheith null do líonra a d'imigh idir an liostú agus an fhiosrú, agus is féidir an líonra gníomhach a bheith null le linn aistrithe. Tá NET_CAPABILITY_NOT_VPN úsáideach sa treo eile, chun a dheimhniú nach tollán é líonra go cinnte seachas gan ach an bhratach iompair VPN a bheith in easnamh air.
Ba é NetworkInfo an miotas céanna le API
Is é ConnectivityManager.TYPE_VPN le NetworkInfo an dara glúin den seiceáil seo, agus tá sé as feidhm ar chúis. Ar eisiúintí nua-aimseartha is féidir leis an réad a thugtar ar ais do VPN a bheith null agus an tollán ceangailte, mar sin tuairiscíonn cód a dhéileálann le null mar „gan VPN“ diúltach bréige go ciúin ar na gléasanna is mó a bhfuil an freagra tábhachtach.
Níl an craoladh a ghabhann leis de ghnáth níos fearr. Tá stair dhoiciméadaithe ag CONNECTIVITY_CHANGE maidir le haistrithe VPN a chailleadh, lena n-áirítear builds inar scaoil sé amháin nuair a cheangail nó nuair a dhícheangail VPN seachas ar gach athrú líonra. Cruthaíonn éisteoir a tógadh air sin athróg stáit a shraonann ó dhearcadh an ardáin go dtí an chéad athnascadh iomlán eile.
Freagair do chomhaid ghlao in ionad pobalbhreith
Cláraigh NetworkRequest a éilíonn TRANSPORT_VPN agus a bhaineann NET_CAPABILITY_NOT_VPN, ansin glaoigh ar registerNetworkCallback leis an iarratas sin. Ansin insíonn onAvailable agus onLost duit cathain a athraíonn an dearbhú, agus sin an teagmhas a bhfuil suim agat ann i ndáiríre. Díchláraigh an comhad glaonna nuair a stopann an chomhpháirt, nó coinníonn an aip tagairt do scáileán marbh agus leanann an comhad glaonna ag scaoileadh.
NetworkRequest req = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();
cm.registerNetworkCallback(req, callback);
Teastaíonn ACCESS_NETWORK_STATE leis seo, ar cead normal é: gan root, gan dialóg toilithe úsáideora, gan cead VPN. Is é pobalbhreith ar thaiméadóir an rogha eile a dtéann daoine ar ais chuici, agus dóitear an ceallra agus í fós ag cailliúint aistrithe níos giorra ná an t-eatramh, agus sin go díreach an t-aistriú a thuairiscíonn úsáideoir.
Cad nach féidir leis an bhfreagra a rá leat fós
Ní thuairiscíonn aon cheann de na APIanna seo an bhfuil an tollán sláintiúil, cén freastalaí ar a gcríochnaíonn sé, ná an bhfuil trácht aip áirithe taobh istigh de. Is féidir líonra VPN a bheith ann gan bealaí inúsáidte, agus is féidir le tollán in aghaidh an aip an aip atá ag cur na ceiste a eisiamh.
Mar sin taifead an méid a chonaic an tseiceáil, ní amháin an boolean. Logáil aitheantas an líonra, na hiompraíochtaí dearbhaithe agus ar bhí an líonra sin gníomhach. Tá tuairisc a deir „níor braitheadh aon VPN“ gan úsáid, agus tuairisc a deir gur dhearbhaigh líonra TRANSPORT_VPN ach gur thug getActiveNetwork() Wi-Fi ar ais díríonn sé go díreach ar ródú nó ar liosta eisiata, agus is ceartú é sin ar féidir le duine oibriú air.