Hvernig á að útiloka undirnet frá Android VPN göngum
VpnService getur ekki útilokað leið, svo þú bætir við fyllingunni: átta mynduð forskeyti fyrir /8, auk IPv6-, DNS- og uppflettingarprófana sem grípa afganginn.
VpnService Android hefur enga útilokunarleið, og engin magn af API-lestri mun framleiða eina. Builder.addRoute() bætir alltaf aðeins við áfangastöðum í göngin, svo að halda LAN-hluta staðbundnum þýðir að sá hluti kemst aldrei í leiðarlistann. Það sem þú bætir við í staðinn er fylling hlutans, tjáð sem venjuleg forskeyti. Vinnan er stærðfræði, og hún bregst á nokkrum fyrirsjáanlegum stöðum.
Farðu í gegnum prófanirnar hér að neðan í röð. Hver þeirra gerir ráð fyrir að sú fyrri hafi staðist, svo stöðvaðu við fyrstu bilun í stað þess að bæta einkenni neðar.
Byrjaðu á því sem göngin fullyrða
Að senda 0.0.0.0/0 í addRoute() segir Android að hver IPv4-áfangastaður tilheyri göngunum. Þess vegna virðast svo margir biðlarar ófærir um klofin göng: þeir krefjast alls vistfangarýmisins og reyna síðan að draga frá því. Ekkert í byggingunni dregur frá. Nákvæmari leið fyrir netið sem þú vildir halda staðbundnu gerir hið gagnstæða við það sem fólk á von á, því lengsta samsvarandi forskeytið vinnur og það net lendir inni í göngunum.
Leiðarlistinn er öll stefnan. Það er ekkert neitunarvald fyrir hverja áfangastöð á bak við hann, og Builder-tilvísunin telur enga aðferð sem myndi veita slíkt.
Búðu til fyllinguna úr forskeytastærðfræði
Fylling útilokaðs forskeytis er mengi systkina þess á leiðinni að rót vistfangatrésins. Fyrir hverja lengd frá 1 upp að útilokuðu lengdinni skaltu taka blokkina af þeirri lengd sem inniheldur forskeytið þitt, snúa við bitanum rétt undir forskeytinu og gefa út niðurstöðuna. Það hljómar óhlutbundið þar til þú keyrir það.
Útilokun 10.0.0.0/8 gefur átta leiðir: 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. Engin þeirra inniheldur 10.0.0.0/8, og saman þekja þær allt annað.
Átta línur búa til þann lista fyrir hvaða forskeyti sem er:
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))
Fjöldi leiða jafngildir lengd forskeytisins, og það er talan sem þarf að fylgjast með. Ein /21 útilokun kostar 21 leiðir og helst læsileg. Tíu útilokanir geta kostað nokkur hundruð, sem þýðir venjulega að breyta þarf netkerfishönnuninni en ekki rafallanum.
Athugaðu vistfangafjölskylduna og umfang ganganna
IPv4-leiðir gera ekkert fyrir IPv6. Ef göngin krefjast IPv6-vistfangs þarf IPv6 LAN-forskeyti sína eigin fyllingu, myndaða með sömu stærðfræði yfir 128 bitum. Algeng ástæða þess að útilokunin virkar á pappír á meðan staðbundna tækið er áfram óaðgengilegt er þessi: náð var í hýsilinn í gegnum IPv6, og aðeins IPv4 hafði verið skorið út. Athugaðu báðar fjölskyldur áður en þú ályktar að stærðfræðin sé röng.
Umfangið er hinn helmingur prófsins. Android fylgist með leiðsögn eftir neti og eftir appi, svo sama forskeytið getur farið í gegnum göngin fyrir eitt app og verið beint fyrir annað eftir því hvernig VPN-ið er lýst.
Setja DNS- og appreglur þar sem þær eiga heima
Leiðarútilokanir breyta ekki leysinum. Staðbundið hýsilnafn getur enn fengið svar frá DNS-þjóni ganganna á meðan vistfang þess er leiðbeint staðbundið, og misræmið birtist sem nafn sem leysist í eitthvað sem LAN-ið nær ekki. Stilltu stefnu leysisins viljandi, með leitarléni eða reglu um klofið DNS. Ekki gera ráð fyrir að leiðirnar hafi ákveðið það fyrir þig.
addDisallowedApplication() heldur einu appi utan ganganna; það heldur ekki áfangastað utan fyrir þau öpp sem vera inni. protect() leyfir sokk sem þú opnar að fara fram hjá göngunum, og þannig forðast göng að grípa eigin flutning. Hvorugt kemur í stað fyllingarinnar.
Sannreyndu með uppflettingu, ekki með eigin lista
Þegar göngin eru komin upp skaltu spyrja tækið hvert vistfang fer í raun í stað þess að lesa listann sem þú byggðir aftur. Á byggingunni sem fylgir iproute2 nefnir adb shell ip route get 10.1.2.3 viðmótið sem kjarninn valdi. Keyrðu sömu skipun fyrir almennt vistfang og staðfestu að hún nefni göngin.
Tvö próf til viðbótar loka hringnum. Leystu fyrst staðbundið nafn, keyrðu síðan adb shell ip route get á leysta vistfangið og krefst viðmóts sem er ekki göngin, því vel heppnuð adb shell ping -c 1 host.lan sannar aðgengi en ekki leiðina. Endurtaktu vistfangafjölskylduprófið yfir IPv6 ef göngin krefjast einnar. Prófaðu á því API-stigi sem þú sendir frá þér, því hvernig VPN-net eru afhjúpuð fyrir leiðatöflunni hefur breyst milli útgáfa. Leiðarlisti sem virðist réttur á pappír og uppfletting sem velur rangt viðmót eru mismunandi villur, og aðeins sú seinni nær til notenda.
Ef útilokunarlistinn heldur áfram að stækka skaltu hætta að búa til leiðir og endurnúmera fjarnetið eða þrengja göngin í staðinn. Rallarinn er krókaleið fyrir API-ið sem vantar, ekki hönnunartæki.