VpnService ya Android haina njia ya kukondoa, na hakuna kiwango cha kusoma API kitakachozalisha moja. Builder.addRoute() huongeza tu malengo kwenye handaki, kwa hiyo kuweka sehemu ya LAN ndani kunamaanisha sehemu hiyo haingii kamwe kwenye orodha ya njia. Unachoongeza badala yake ni kikamilisho cha sehemu, kilichoonyeshwa kama viambishi vya kawaida. Kazi ni hesabu, na inashindikana katika maeneo machache yanayotabirika.

Pitia ukaguzi ulio hapa chini kwa mfuatano. Kila mmoja unadhani ule uliopita ulishikilia, kwa hiyo simama kwenye kushindikana kwa kwanza badala ya kufunga dalili chini zaidi.

Anza na kile handaki linachodai

Kupitisha 0.0.0.0/0 kwa addRoute() kunamwambia Android kwamba kila lengo la IPv4 ni la handaki. Ndiyo sababu wateja wengi wanaonekana hawana uwezo wa handaki lililogawanyika: wanadai nafasi yote ya anwani kisha wanajaribu kutoa kutoka humo. Hakuna kinachotoa ndani ya kijenzi. Njia mahususi zaidi kwa mtandao uliotaka kuubakisha ndani hufanya kinyume cha inavyotarajiwa, kwa sababu kiambishi kirefu zaidi kinacholingana kinashinda na mtandao huo unaishia ndani ya handaki.

Orodha ya njia ni sera nzima. Hakuna veto ya kila lengo nyuma yake, na marejeo ya Builder hayataji mbinu yoyote ambayo ingetoa moja.

Tengeneza kikamilisho kutoka hesabu ya viambishi

Kikamilisho cha kiambishi kilichokondolewa ni seti ya ndugu zake kwenye njia kuelekea mzizi wa mti wa anwani. Kwa kila urefu kutoka 1 hadi urefu uliokondolewa, chukua kizuizi cha urefu huo kilicho na kiambishi chako, geuza biti iliyo chini kabisa ya kiambishi na toa matokeo. Inasikika kama dhahania hadi uitumie.

Kukondoa 10.0.0.0/8 kunatoa njia nane: 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. Hakuna hata moja iliyo na 10.0.0.0/8, na kwa pamoja zinafunika kila kitu kingine.

Mistari minane hutengeneza orodha hiyo kwa kiambishi chochote:

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))

Idadi ya njia ni sawa na urefu wa kiambishi, na hiyo ndiyo namba ya kufuatilia. Ukiondoa /21 moja hugharimu njia 21 na hubaki kusomeka. Ukiondoa kumi kunaweza kugharimu mamia kadhaa, ambayo kwa kawaida inamaanisha muundo wa mtandao unahitaji kubadilishwa, si kizalishaji.

Kagua familia ya anwani na wigo wa handaki

Njia za IPv4 hazifanyi kitu kwa IPv6. Ikiwa handaki linadai anwani ya IPv6, kiambishi cha LAN cha IPv6 kinahitaji kikamilisho chake, kilichotengenezwa kwa hesabu hiyo hiyo juu ya biti 128 za anwani. Sababu ya kawaida ya kukondoa kufanya kazi kwenye karatasi wakati kifaa cha ndani kinabaki kisiweze kufikiwa ni hii: mwenyeji alifikiwa kwa IPv6, na ni IPv4 pekee iliyokatwa. Kagua familia zote mbili kabla ya kuhitimisha kwamba hesabu si sahihi.

Wigo ni nusu nyingine ya ukaguzi. Android hufuatilia uelekezaji kwa mtandao na kwa programu, kwa hiyo kiambishi kimoja kinaweza kupita handakini kwa programu moja na kuwa cha moja kwa moja kwa nyingine kulingana na jinsi VPN ilivyotangazwa.

Weka kanuni za DNS na za kila programu mahali zinapostahili

Ukondoshaji wa njia haubadilishi kitatuzi. Jina la mwenyeji la ndani bado linaweza kujibiwa na seva ya DNS ya handaki wakati anwani yake inaelekezwa ndani, na kutokulingana huonekana kama jina linalotatuliwa kuwa kitu ambacho LAN haiwezi kufikia. Weka sera ya kitatuzi kwa makusudi, kwa kikoa cha utafutaji au kanuni ya DNS iliyogawanywa. Usidhani njia zimeamua hilo kwa niaba yako.

addDisallowedApplication() huiweka programu moja nje ya handaki; haizuii lengo kuwa nje kwa programu zinazobaki ndani. protect() huruhusu soketi unayofungua kupita handaki, na hivyo handaki huepuka kukamata usafirishaji wake wenyewe. Hakuna kati yao inayobadilisha kikamilisho.

Thibitisha kwa utafutaji, si kwa orodha yako

Handaki linapoinuka, uliza kifaa anwani inakwenda wapi kwa kweli badala ya kusoma tena orodha uliyoijenga. Kwenye build inayokuja na iproute2, adb shell ip route get 10.1.2.3 hutaja kiolesura kilichochaguliwa na kerneli. Endesha amri hiyo hiyo kwa anwani ya umma na uthibitishe kwamba inataja handaki.

Ukaguzi mwingine mbili hufunga mzunguko. Tatua jina la ndani kwanza, kisha endesha adb shell ip route get kwenye anwani iliyotatuliwa na udai kiolesura ambacho si handaki, kwa sababu adb shell ping -c 1 host.lan iliyofanikiwa huthibitisha ufikikaji na si njia. Rudia jaribio la familia ya anwani juu ya IPv6 ikiwa handaki linadai moja. Jaribu kwa kiwango cha API unachosafirisha, kwa sababu jinsi mitandao ya VPN inavyoonyeshwa kwenye jedwali la uelekezaji imebadilika kati ya matoleo. Orodha ya njia inayoonekana sahihi kwenye karatasi na utafutaji unaochagua kiolesura kibaya ni hitilafu tofauti, na ni ya pili pekee inayowafikia watumiaji.

Ikiwa orodha ya ukondoshaji inaendelea kukua, acha kuzalisha njia na uongeze namba za mtandao wa mbali au punguza upana wa handaki. Kizalishaji ni njia ya kuzunguka API inayokosekana, si chombo cha kubuni.

Makala zinazohusiana