Kif teskludi subnetwork minn mina VPN Android
VpnService ma jistax jeskludi rotta, għalhekk iżżid il-kompliment: tmien prefissi ġġenerati għal /8, flimkien mal-verifiki IPv6, DNS u tfittxija li jaqbdu l-bqija.
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.