Mae twnelu hollt mewn ap VpnService yn torri mewn ychydig o fannau penodol, ac mae'r atgyweiriad yn wahanol i bob un. Dim ond un cyrchfan sy'n methu y mae'r cleient yn ei dangos, felly'r dasg gyntaf yw darganfod pa ffin rydych chi'n ei tharo: y llwybrau a gafodd y builder, y proxy na allwch ei ddilysu, y datryswr y gwnaethoch ei hysbysebu'n unig, neu'r rhestr apiau y mae'r platfform yn ei chymhwyso fesul defnyddiwr. Dyna'n union pam rwy'n cadw gwiriad pedwar cam. Mae'n rhedeg yn y drefn isod ac yn stopio ar y methiant cyntaf.

Cadarnhewch beth roddodd y builder i'r platfform

Rhestr o ddatganiadau yw VpnService.Builder. Mae establish() yn dychwelyd ParcelFileDescriptor ar gyfer rhyngwyneb rhithwir, a dim ond traffig sy'n cyfateb i ragddodiadau addAddress ac addRoute y mae'r platfform yn ei anfon i'r disgrifydd hwnnw; mae addDnsServer yn dweud wrth gleientiaid pa ddatryswr i'w holi. Nid yw cyrchfan y tu allan i bob rhagddodiad a ychwanegoch byth yn cyrraedd eich ap, beth bynnag mae'r rhyngwyneb yn ei addo. Mae'r ffaith sengl hon yn esbonio'r rhan fwyaf o adroddiadau am dwnelu hollt wedi torri cyn unrhyw newid cod.

Logiwch y rhestrau cyfeiriadau, llwybrau a DNS a luniwyd gan eich builder, yna cymharwch nhw â'r cyrchfannau sy'n methu. Mae /32 ar goll ar gyfer gwesteiwr rheoli yn llawer mwy cyffredin na thwnnel wedi torri. Os yw'r rhestr yn gywir, ewch ymlaen; os yw'n anghywir, mae gweddill y rhestr wirio yn wastraff ymdrech.

Dim ond o API 33 y mae excludeRoute yn bodoli

Eithrio yn seiliedig ar gyrchfan yw'r cais sy'n troi'n edefyn cymorth amlaf. Daeth builder.excludeRoute(IpPrefix) yn API 33; cyn hynny, yr unig frasamcan a gefnogir yw ychwanegu llwybrau ar gyfer popeth heblaw'r rhagddodiad a eithrir, sy'n golygu cyfrifo'r rhagddodiadau cyflenwol eich hun. Nid yw'r ddau alwad yn ddelweddau drych: mae un yn tynnu o set llwybrau'r rhyngwyneb, mae'r llall yn adeiladu'r set o'r dechrau, a bydd dyfais hŷn yn taflu neu'n anwybyddu alwad nad yw'n ei hadnabod. Canghennwch ar Build.VERSION.SDK_INT a phrofwch y ddwy lwybr ar galedwedd go iawn.

Wrth gyfrifo cyflenwadau, gwyliwch aliniad rhagddodiadau. Mae eithriad /24 o fewn llwybr /16 angen y rhagddodiadau gorchuddio sy'n disgrifio'r gweddill mewn gwirionedd, nid un /8 camffurfiedig. Logiwch y rhestr derfynol a sicrhewch fod y gwesteiwr a eithrir yn dal i ddatrys drwy lwybr y tu allan i'r twnnel.

Ni ellir mynegi manylion mewngofnodi'r proxy

Mae setHttpProxy(ProxyInfo) yn cyfeirio'r rhyngwyneb at proxy HTTP neu SOCKS, a gall URL PAC ddewis rhyngddynt fesul cyrchfan. Nid yw ProxyInfo na fformat PAC yn cario enw defnyddiwr a chyfrinair, felly mae proxy sydd angen dilysu y tu allan i API'r platfform. Mae apiau sydd eu hangen yn ymgorffori stac gofod defnyddiwr, tun2socks neu beiriant tebyg, ac yn ateb yr her 407 eu hunain.

Mae canlyniadau i'r dewis hwnnw. Dim ond y traffig rydych chi'n ei lwybro ato y mae stac gofod defnyddiwr yn ei weld, felly rhaid iddo fyw o fewn yr un ffin disgrifydd, ac mae'n etifeddu'r un gofyniad protect() ar gyfer ei soced uplink ei hun. Os hepgorwch protect(), mae'r twnnel yn dal ei drafnidiaeth ei hun, sy'n ymddangos fel handshake sy'n stelcian ar ôl y pecyn cyntaf. Profwch yn erbyn proxy sy'n mynnu manylion mewngofnodi, oherwydd mae proxy agored yn pasio ar lwybr y platfform ac yn profi dim byd.

Mae rhestrau fesul ap a DNS hefyd yn ddatganiadau

Mae gan Builder addAllowedApplication ac addDisallowedApplication, ac maent yn cau ei gilydd allan: mae galw'r ddau yn taflu eithriad. Naill ffordd neu'r llall, cymhwysir y rhestr fesul defnyddiwr wrth osod y rhyngwyneb, felly mae ap proffil gwaith yn cael ei lywodraethu gan dwnnel y proffil gwaith yn hytrach na'ch un chi. Yr hyn nad yw unrhyw API yn ei roi yw rheolaeth dros benderfyniad ap arall: ni allwch orfodi pecyn i'ch twnnel o'r tu allan, ac ni allwch gau na hailosod VPN sydd eisoes yn weithredol.

Mae DNS yn dilyn yr un patrwm. Mae addDnsServer yn hysbysebu cyfeiriad datryswr; nid yw'n gadael i'ch ap ateb ymholiadau. Os ydych am ddatrys enwau eich hun, rhedwch ddatryswr a llwybrwch ei gyfeiriad i'r twnnel. Gall apiau sy'n defnyddio DoT neu DoH i enw gwesteiwr penodol osgoi'r cyfeiriad a hysbysebwyd gennych, felly triniwch ddatrys enwau fel ymdrech orau oni bai eich bod hefyd yn rhyng-gipio llwybr yr ymholiad.

Maniffest, always-on a'r prawf pedwar cam

Datganir cymhwyster yn y maniffest: BIND_VPN_SERVICE, hidlydd bwriad android.net.VpnService, a gwasanaeth blaendir os oes rhaid i'r twnnel oroesi yn y cefndir. Mae always-on VPN hefyd angen onRevoke glân, oherwydd mae'r system yn ei alw pan fydd y defnyddiwr yn newid gosodiadau neu ap arall yn cymryd rheolaeth.

Rhedwch y gwiriadau yn y drefn a stopiwch ar y methiant cyntaf. Yn gyntaf, dadlwythwch y rhestrau cyfeiriadau, llwybrau a DNS a basiwyd i'r builder. Yn ail, cadarnhewch fod establish() wedi dychwelyd disgrifydd a bod y soced trafnidiaeth wedi'i ddiogelu. Yn drydydd, gofynnwch am un gyrchfan o fewn rhagddodiad wedi'i gynnwys ac un o fewn rhagddodiad wedi'i eithrio. Yn bedwerydd, gwiriwch pa ddatryswr a atebodd mewn gwirionedd drwy holi enw gwesteiwr na all ond eich datryswr chi ei ddatrys.

Nid yw handshake wedi'i gwblhau yn profi unrhyw un o'r camau diweddarach. Mae pob gwiriad yn ynysu un haen, felly nid yw llwyddiant yn ail gam yn dweud dim am y pedwerydd.

Mae cyfeirlyfr VpnService.Builder yn rhestru arwyneb llawn y builder. Unrhyw beth sydd ei angen y tu hwnt i hynny yw API arall, ap arall neu eich stac gofod defnyddiwr eich hun, a phenderfyniad dylunio yw hynny yn hytrach na nam twnelu hollt.

Erthyglau cysylltiedig