Il-VpnService ta' Android m'għandux rotta ta' esklużjoni, u l-ebda ammont ta' qari tal-API mhu se jipproduċi waħda. Builder.addRoute() dejjem iżid biss destinazzjonijiet mal-mina, għalhekk li żżomm segment LAN lokali jfisser li dak is-segment qatt ma jidħol fil-lista tar-rotot. Dak li żżid minflok huwa l-kompliment tas-segment, espress bħala prefissi ordinarji. Ix-xogħol huwa aritmetika, u jonqos f'numru żgħir ta' postijiet previdibbli.

Mexxi l-verifiki hawn taħt fl-ordni. Kull waħda tassumi li tal-qabel żammet, għalhekk waqaf fl-ewwel falliment minflok ma ttejjeb sintomi aktar 'l isfel.

Ibda minn dak li tippretendi l-mina

Li tgħaddi 0.0.0.0/0 lil addRoute() tgħid lil Android li kull destinazzjoni IPv4 tappartjeni lill-mina. Huwa għalhekk li ħafna klijenti jidhru inkapaċi għall-mina maqsuma: jitolbu l-ispazju kollu tal-indirizzi u mbagħad jippruvaw inaqqsu minnu. Xejn fil-builder ma jnaqqas. Rotta aktar speċifika għan-netwerk li ridt iżżomm lokali tagħmel l-oppost ta' dak li jistennew in-nies, għax jirbaħ l-itwal prefiss li jaqbel u dak in-netwerk jinżel fil-mina.

Il-lista tar-rotot hija l-politika kollha. M'hemmx veto għal kull destinazzjoni warajha, u r-referenza Builder ma telenkax metodu li jipprovdi waħda.

Iġġenera l-kompliment mill-aritmetika tal-prefissi

Il-kompliment ta' prefiss eskluż huwa s-sett ta' ħutu fit-triq lejn l-għerq tas-siġra tal-indirizzi. Għal kull tul minn 1 sat-tul eskluż, ħu l-blokka ta' dak it-tul li fiha l-prefiss tiegħek, aqleb il-bit eżatt taħt il-prefiss u ħruġ ir-riżultat. Jidher astratt sakemm tmexxih.

L-esklużjoni ta' 10.0.0.0/8 tagħti tmien rotot: 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. Ħadd minnhom ma fih 10.0.0.0/8, u flimkien ikopru kull ħaġa oħra.

Tmien linji jiġġeneraw dik il-lista għal kwalunkwe prefiss:

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

In-numru ta' rotot huwa ugwali għat-tul tal-prefiss, u dak huwa n-numru li għandu jiġi osservat. Esklużjoni waħda /21 tiswa 21 rotta u tibqa' tinqara. Għaxar esklużjonijiet jistgħu jiswew ftit mijiet, li normalment ifisser li d-disinn tan-netwerk jeħtieġ jinbidel, mhux il-ġeneratur.

Iċċekkja l-familja tal-indirizzi u l-ambitu tal-mina

Ir-rotot IPv4 ma jagħmlu xejn għall-IPv6. Jekk il-mina tippretendi indirizz IPv6, prefiss LAN IPv6 jeħtieġ il-kompliment tiegħu stess, iġġenerat bl-istess aritmetika fuq 128 bit. Kawża komuni li l-esklużjoni taħdem fuq il-karta waqt li l-apparat lokali jibqa' ma jintlaħaqx hija din: il-host intlaħaq permezz ta' IPv6, u kien maqtugħ biss IPv4. Iċċekkja ż-żewġ familji qabel ma tikkonkludi li l-matematika hija ħażina.

L-ambitu huwa n-nofs l-ieħor tal-verifika. Android isegwi r-rotta skont in-netwerk u skont l-app, għalhekk l-istess prefiss jista' jgħaddi mill-mina għal app waħda u jkun dirett għal oħra skont kif ġie ddikjarat il-VPN.

Qiegħed ir-regoli DNS u għal kull app fejn jixirqu

L-esklużjonijiet tar-rotot ma jbiddlux is-soluzzjoni. Isem tal-host lokali xorta jista' jiġi mwieġeb mis-server DNS tal-mina waqt li l-indirizz tiegħu jiġi dirett lokalment, u l-inkonsistenza tidher bħala isem li jsolvi f'xi ħaġa li l-LAN ma tistax tilħaq. Issettja l-politika tas-soluzzjoni deliberatament, b'dominju ta' tfittxija jew regola ta' DNS maqsum. Tassumix li r-rotot iddeċidewha għalik.

addDisallowedApplication() iżomm app waħda barra mill-mina; ma jżommx destinazzjoni barra għall-apps li jibqgħu ġewwa. protect() iħalli socket li tiftaħ jaqbeż il-mina, u hekk mina tevita li taqbad it-trasport tagħha stess. L-ebda waħda ma tissostitwixxi l-kompliment.

Ivverifika b'tfittxija, mhux bil-lista tiegħek

Ladarba l-mina tkun 'il fuq, staqsi lill-apparat fejn indirizz tassew imur minflok ma terġa' taqra l-lista li bniet. Fuq build li jġib iproute2, adb shell ip route get 10.1.2.3 isemmi l-interface li għażel il-kernel. Mexxi l-istess kmand għal indirizz pubbliku u kkonferma li jisemmi l-mina.

Żewġ verifiki oħra jagħlqu ċ-ċirku. L-ewwel issolvi isem lokali, imbagħad mexxt adb shell ip route get fuq l-indirizz solvut u titlob interface li mhix il-mina, għax adb shell ping -c 1 host.lan ta' suċċess jipprova l-aċċessibbiltà u mhux it-triq. Erġa' għamel it-test tal-familja tal-indirizzi fuq IPv6 jekk il-mina tippretendi waħda. Ittestja fil-livell tal-API li tibgħat, għax il-mod kif in-netwerks VPN huma esposti lit-tabella tar-rotta nbidel bejn il-verżjonijiet. Lista tar-rotot li tidher tajba fuq il-karta u tfittxija li tagħżel l-interface ħażina huma bug dijversi, u t-tieni biss tasal għall-utenti.

Jekk il-lista tal-esklużjonijiet tkompli tikber, waqaf milli tiġġenera rotot u erġa' nnumerja n-netwerk remot jew dejjaq il-mina minflok. Il-ġeneratur huwa madwar għall-API nieqsa, mhux għodda tad-disinn.

Artikli relatati