Sut i eithrio is-rwydwaith o dwnnel VPN Android
Ni all VpnService eithrio llwybr, felly rydych yn ychwanegu'r cyflenwad: wyth rhagddodiad a gynhyrchwyd ar gyfer /8, ynghyd â'r gwiriadau IPv6, DNS ac ymchwil sy'n dal y gweddill.
Nid oes gan VpnService Android lwybr eithrio, ac ni fydd unrhyw faint o ddarllen API yn cynhyrchu un. Builder.addRoute() dim ond yn ychwanegu cyrchfeydd at y twnnel, felly mae cadw segment LAN yn lleol yn golygu nad yw'r segment hwnnw byth yn mynd i mewn i'r rhestr llwybrau. Yr hyn a ychwanegwch yn lle hynny yw cyflenwad y segment, wedi'i fynegi fel rhagddodiaid cyffredin. Gwaith rhifyddeg yw hi, ac mae'n methu mewn ychydig o leoedd rhagweladwy.
Ewch drwy'r gwiriadau isod yn eu trefn. Mae pob un yn tybio bod y blaenorol wedi dal, felly stopiwch ar y methiant cyntaf yn lle clwtio symptomau ymhellach i lawr.
Dechreuwch o'r hyn y mae'r twnnel yn ei hawlio
Mae trosglwyddo 0.0.0.0/0 i addRoute() yn dweud wrth Android bod pob cyrchfan IPv4 yn perthyn i'r twnnel. Dyna pam mae cymaint o gleientiaid yn edrych yn analluog i dunelu hollt: maent yn hawlio'r gofod cyfeiriad cyfan ac yna'n ceisio tynnu ohono. Nid oes dim yn yr adeiladydd yn tynnu. Mae llwybr mwy penodol ar gyfer y rhwydwaith roeddech am ei gadw'n lleol yn gwneud y gwrthwyneb i'r disgwyl, oherwydd y rhagddodiad hiraf sy'n cyfateb sy'n ennill ac mae'r rhwydwaith hwnnw'n glanio y tu mewn i'r twnnel.
Y rhestr llwybrau yw'r polisi cyfan. Nid oes feto fesul cyrchfan y tu ôl iddi, ac nid yw cyfeirlyfr Builder yn rhestru unrhyw ddull a fyddai'n darparu un.
Cynhyrchwch y cyflenwad o rifyddeg rhagddodiaid
Cyflenwad rhagddodiad a eithrir yw set ei frodyr ar y llwybr i wraidd coeden y cyfeiriadau. Ar gyfer pob hyd o 1 hyd at yr hyd a eithrir, cymerwch y bloc o'r hyd hwnnw sy'n cynnwys eich rhagddodiad, troi'r did yn union o dan y rhagddodiad, a rhoi'r canlyniad allan. Mae'n swnio'n haniaethol nes i chi ei redeg.
Mae eithrio 10.0.0.0/8 yn cynhyrchu wyth llwybr: 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8. Nid oes yr un ohonynt yn cynnwys 10.0.0.0/8, ac gyda'i gilydd maent yn gorchuddio popeth arall.
Mae wyth llinell yn cynhyrchu'r rhestr honno ar gyfer unrhyw rhagddodiad:
import ipaddress
def complement(addr, length):
base = int(ipaddress.IPv4Address(addr))
out = []
for k in range(1, length + 1):
block = base & (0xFFFFFFFF << (32 - k))
sibling = block ^ (1 << (32 - k))
out.append(f"{ipaddress.IPv4Address(sibling)}/{k}")
return out
print(complement("10.0.0.0", 8))
Mae nifer y llwybrau'n hafal i hyd y rhagddodiad, a dyna'r rhif i'w wylio. Mae un eithriad /21 yn costio 21 llwybr ac yn aros yn ddarllenadwy. Gall deg eithriad gostio rhai cannoedd, sy'n golygu fel arfer bod angen newid dyluniad y rhwydwaith yn hytrach na'r generadur.
Gwiriwch y teulu cyfeiriadau a chwmpas y twnnel
Nid yw llwybrau IPv4 yn gwneud dim i IPv6. Os yw'r twnnel yn hawlio cyfeiriad IPv6, mae angen ei gyflenwad ei hun ar rhagddodiad LAN IPv6, wedi'i gynhyrchu â'r un rifyddeg dros 128 did. Achos cyffredin dros i'r eithriad weithio ar bapur tra bo'r ddyfais leol yn parhau'n anghyrraeddadwy yw hwn: cyrhaeddwyd y gwesteiwr drwy IPv6, a dim ond IPv4 a dorrwyd allan. Gwiriwch y ddau deulu cyn dod i'r casgliad bod y mathemateg yn anghywir.
Cwmpas yw hanner arall y gwiriad. Mae Android yn olrhain llwybro fesul rhwydwaith a fesul ap, felly gall yr un rhagddodiad gael ei dunelu ar gyfer un ap ac yn uniongyrchol ar gyfer un arall yn dibynnu ar sut y datganwyd y VPN.
Rhowch reolau DNS a fesul ap lle maent yn perthyn
Nid yw eithriadau llwybr yn newid y datryswr. Gall gwesteiwr lleol o hyd gael ei ateb gan weinydd DNS y twnnel tra bo ei gyfeiriad yn cael ei lwybro'n lleol, ac mae'r camgymariaeth yn ymddangos fel enw sy'n datrys i rywbeth na all y LAN ei gyrraedd. Gosodwch bolisi'r datryswr yn fwriadol, gyda pharth chwilio neu reol DNS hollt. Peidiwch â thybio bod y llwybrau wedi penderfynu hynny drosoch.
Mae addDisallowedApplication() yn cadw un ap y tu allan i'r twnnel; nid yw'n cadw cyrchfan allan ar gyfer yr apiau sy'n aros i mewn. Mae protect() yn gadael i soced a agorwch osgoi'r twnnel, a dyna sut mae twnnel yn osgoi dal ei drafnidiaeth ei hun. Nid yw'r naill na'r llall yn disodli'r cyflenwad.
Gwiriwch ag ymchwiliad, nid â'ch rhestr eich hun
Unwaith y bydd y twnnel i fyny, gofynnwch i'r ddyfais i ble mae cyfeiriad yn mynd mewn gwirionedd yn lle ail-ddarllen y rhestr a adeiladwyd gennych. Ar adeilad sy'n cludo iproute2, mae adb shell ip route get 10.1.2.3 yn enwi'r rhyngwyneb a ddewiswyd gan y cnewyllyn. Rhedwch yr un gorchymyn ar gyfer cyfeiriad cyhoeddus a chadarnhau ei fod yn enwi'r twnnel.
Mae dau wiriad arall yn cau'r ddolen. Datryswch enw lleol yn gyntaf, yna rhedwch adb shell ip route get ar y cyfeiriad a ddatryswyd a mynnu rhyngwyneb nad yw'r twnnel, oherwydd mae adb shell ping -c 1 host.lan llwyddiannus yn profi cyrhaeddedd ac nid y llwybr. Ailadroddwch y prawf teulu cyfeiriadau dros IPv6 os yw'r twnnel yn hawlio un. Profwch ar y lefel API rydych yn ei chludo, oherwydd mae'r ffordd y mae rhwydweithiau VPN yn cael eu hamlygu i'r tabl llwybro wedi newid rhwng rhyddhau. Mae rhestr llwybrau sy'n edrych yn gywir ar bapur ac ymchwiliad sy'n dewis y rhyngwyneb anghywir yn wahanol bygiau, a dim ond yr ail un sy'n cyrraedd defnyddwyr.
Os yw'r rhestr eithrio'n parhau i dyfu, stopiwch gynhyrchu llwybrau ac ail-rifo'r rhwydwaith o bell neu gulhewch y twnnel yn lle hynny. Mae'r generadur yn ateb dros dro i'r API sydd ar goll, nid yn offeryn dylunio.