VpnService protect() eða útilokun apps: hvað lagar leiðsögnina
Verndaðu socketið sem ber göngin, eða útilokaðu allt appið: skilyrðin þrjú sem ákvarða hvaða umfang Android-VPNið þitt þarf.
Þú hefur tvær leiðir til að halda eigin pakkum ganganna utan gangsins: vernda flutningssocketið eða taka allt appið út úr VPNinu. Þær leysa mismunandi vandamál, og að velja þá víðari vegna þess að auðveldara er að tengja hana er einmitt leiðin sem öpp missa aðgang að staðarnetinu og skiptri DNS án þess að taka eftir því. Byrjaðu á því sem verður að vera utan gangsins og veldu svo minnsta umfangið sem nær því.
Hvað protect() fjarlægir úr göngunum
VpnService.protect() er kall fyrir hvert socket. Þú gefur því socketið eða lýsinguna sem ber göngin, og Android merkir það socket svo umferð þess noti undirliggjandi netið í stað VPN-viðmótsins. Allt annað sem appið sendir fylgir venjulegri VPN-leið áfram.
Einmitt þetta þrönga umfang er málið. Verndað socket breytir ekki hvernig HTTP-viðskiptavinurinn þinn leysir nöfn, hvaða viðmót greiningarköllin þín nota eða hvað verður um aðra tengingu sem opnuð er síðar.
Þrjú skilyrði sem ákvarða umfangið
Fyrsta skilyrðið er hvort aðeins flutningur gangsins þurfi að komast út. Ef önnur umferð appsins á að fara í gegnum VPNið áfram er socketvernd rétta umfangið. Annað skilyrðið er hvort þú stjórnir stofnun socketsins. Safn sem opnar eigið socket djúpt inni gefur þér engan stað til að kalla á protect() nema það bjóði upp á krók eða þiggi tilbúið socket. Þriðja skilyrðið er hvort appið þurfi að ná beint til staðarnetsins eða captive portal, sem er önnur krafa en að halda göngunum lifandi.
Að útiloka appið með addDisallowedApplication() er grófa verkfærið. Það fjarlægir hverja tengingu sem appið gerir úr VPNinu, þar á meðal þær sem þú vildir skoða, og á sumum tækjum breytir það líka hegðun staðbundinnar uppgötvunar.
Þriðji valkosturinn er að binda flutninginn við valið net með bindProcessToNetwork() eða net-handfangi á socketstigi. Það er gagnlegt þegar tækið er bæði á Wi-Fi og farsímaneti og þú vilt að göngin fari um ákveðna uppstreymisleið.
Kallaðu á það meðan flutningurinn er búinn til
Kallaðu á protect() í sama blokk og býr til flutninginn, fyrir connect() eða send(). Ef kallið skilar false skaltu loka socketinu og láta uppsetninguna mistakast; að halda áfram skilur þig eftir með flutning sem pakkarnir geta farið aftur inn í þitt eigið viðmót.
Formið er nógu lítið til að halda því á einum stað:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Þrír smáatriðir bíta hér. Í fyrsta lagi,boolean er eina merkið sem þú fær, svo skráðu mistökin með nægu samhengi til að greina afturkallað samþykki frá synjuðu kalli. Í öðru lagi,protect() nær yfir socketið, ekki númer lýsingarinnar: ef þú lokar socketinu og notar seinna sama heiltöluna fyrir annað socket er nýja socketið ekki verndað. Í þriðja lagi, þegar nativt safn opnar flutninginn skaltu vernda lýsinguna áður en nativi kóðinn tengist, annars gæti leiðin þegar vera valin.VpnService-viðmiðið er staðurinn þar sem þú staðfestir hvaða ofhleðslur API-stigið þitt býður í raun upp á.
Prófaðu lokaðu leiðina, ekki bara hina hamingjusömu
Staðfestu með göngin uppi, því það er eina ástandið þar sem leiðirnar tvær geta verið ólíkar. Sendu eina beiðni um verndaða flutninginn og aðra frá kóðaleið sem kallaði aldrei á protect(), og berðu svo saman það sem fjarlægi endinn sér: verndaða tengingin ætti að koma með undirliggjandi netið sem uppruna, á meðan hin óverndaða sýnir eigið heimilisfang gangsins og hreyfir bætateljara þess. Á tækinu sýna ss eða netstat sömu skiptingu áður en nokkuð fer út úr útvarpinu.
Prófaðu afturköllun sérstaklega, því breyting á samþykki rífur niður viðmótið án þess að snerta socketkóðann þinn. Afturkallaðu VPN-samþykkið eða stöðvaðu þjónustuna, byggðu flutninginn upp að nýju og staðfestu að protect() skilar enn true og að flutningurinn tengist aftur um leið og samþykki er veitt aftur.
Ef verndaða beiðnin fylgir göngunum engu að síður gerist verndarkallið líklega eftir að socketinu hefur þegar verið beint. Færðu það fyrr og prófaðu aftur.
Haltu ákvörðuninni skrifaðri við uppsetningu flutningsins: hvaða socket eru vernduð, hvaða appumferð er útilokuð og hvað appið gerir þegar vernd bregst. Einmitt þessi lína kemur í veg fyrir að síðari endurskipulagning víkki útilokunina út í allt appið vegna þess að eitt próf mistókst. Hún gefur næsta manni líka leið til að athuga áformið án öfugverkunar á manifestinu.