VpnService-ka Android ma laha waddo ka-reebid, mana jirto qadar akhrin API oo mid soo saari doonta. Builder.addRoute() waxa uu tunnellka ku darayaa oo keliya bartilmaameedyo, markaas haysashada qayb LAN oo maxalli ah waxay ka dhigan tahay in qaybtaas ayna waligeed gelin liiska waddooyinka. Waxa aad beddelkeeda ku darsato waa dhammaystirka qaybta, oo lagu muujiyay horfiiryo caadi ah. Shaqadu waa xisaab, waxayna ku guuldareysataa dhowr meelood oo la saadaalin karo.

Hubinta hoose si taxane ah u mar. Mid kastaa waxa uu u qaataa in tii hore xasilloonayd, markaas joogso kulanka ugu horreeya halkii aad ka hagaajin lahayd calaamadaha hoose.

Ka bilow waxa tunnellku sheeganayo

U gudbinta 0.0.0.0/0 oo loo diro addRoute() waxay Android u sheegtaa in bartilmaameed kasta oo IPv4 uu ka tirsan yahay tunnellka. Taasi waa sababta ay macaamiil badan ugu muuqdaan kuwo aan karti u lahayn tunnell qaybsan: waxay sheegtaan dhammaan booska cinwaannada ka dibna isku dayaan in ay ka jaraan. Waxba kuma jiraan dhismaha wax jara. Waddo gaar ah oo loogu talagalay shabakadda aad rabtay in ay maxalli ahaato waxay samaysaa lidka waxa dadku filayaan, sababtoo ah horfiirka ugu dheer ee u dhigma ayaa guuleysta shabakaddaasna waxay gashaa gudaha tunnellka.

Liiska waddooyinku waa siyaasadda oo dhan. Ma jiro veto bartilmaameed kasta oo ka dambeeya, oo tixraaca Builder ma taxo hab kasta oo mid bixin lahaa.

Soo saar dhammaystirka xisaabta horfiirka

Dhammaystirka horfiir la reebay waa qaybta walaalihiis ee ku yaal waddada loo maro xididka geedka cinwaannada. Dherer kasta oo ka bilaabma 1 ilaa dhererka la reebay, qaado qaybta dhererkaas oo ay ku jirto horfiirkaaga, rog bidda si toos ah horfiirka hoostiisa, oo soo saar natiijada. Waxay u muuqataa mid aan la taaban karin ilaa aad fuliso.

Ka-reebidda 10.0.0.0/8 waxay soo saartaa sideed waddo: 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. Midkoodna ma hayo 10.0.0.0/8, oo si wadajir ah waxay daboolaan wax kasta oo kale.

Sideed sadar ayaa soo saara liiskaas horfiir kasta:

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

Tirada waddooyinku waxay la mid tahay dhererka horfiirka, taasna waa lambarka la fiirinayo. Hal ka-reebid /21 wuxuu qaataa 21 waddo oo wuu ahaanayaa mid la akhriyi karo. Toban ka-reebid waxay qaadan karaan dhawr boqol, taas oo caadi ahaan macneheedu yahay naqshadda shabakadda ayaa beddelmi doonta, ma aha soo-saaraha.

Hubi qoyska cinwaanka iyo baaxadda tunnellka

Waddooyinka IPv4 waxba ma qabtaan IPv6. Haddii tunnellku sheegto cinwaan IPv6, horfiirka LAN ee IPv6 wuxuu u baahan yahay dhammaystirkiisa, oo lagu soo saaray isla xisaabta 128 bid. Sababta caadiga ah ee ka-reebidda ay ka shaqeyso warqad halka aaladda maxalliga ah ay sii ahaanayso mid aan la gaadhi karin waa tan: martigeliyaha waxaa lagu gaaray IPv6, oo kaliya IPv4 ayaa la gooyay. Hubi labada qoys ka hor inta aadan go'aan ka gaarin in xisaabtu khaldan tahay.

Baaxaddu waa qaybta kale ee hubinta. Android wuxuu la socdaa waddo-marinta shabakad kasta iyo app kasta, markaas isla horfiirku wuxuu tunnellka mari karaa hal app oo toos u noqon karaa mid kale, taas oo ku xidhan sida VPN loo dhawaaqay.

Dhig xeerarka DNS iyo mid kasta oo app ah meesha ay ku habboon yihiin

Ka-reebidda waddooyinku ma beddesho xalliyaha. Magaca martigeliyaha maxalliga ah waxaa weli ka jawaabi kara serverka DNS ee tunnellka halka cinwaankiisu maxalli ahaan loo waddo-marinayo, oo is-qabka ahi wuxuu u muuqdaa magac ku xallinaya wax aan LAN gaadhi karin. U dhig siyaasadda xalliyaha si ula kac ah, oo leh domain raadin ama xeer DNS qaybsan. Ha u qaadan in waddooyinku ay taas kuu go'aamiyeen.

addDisallowedApplication() wuxuu hal app ka ilaaliyaa tunnellka; ma ilaaliyo bartilmaameed bannaanka u ah app-yada gudaha ku hadha. protect() wuxuu u oggolaanayaa socket aad furto in uu ka baxsado tunnellka, sidaasna tunnellku wuu ka fogaadaa qabashada gaadiidkiisa. Labaduba ma beddelaan dhammaystirka.

Ku xaqiiji raadin, ma aha liiskaaga

Marka tunnellku kor yimaado, waydii aaladda halka cinwaanku dhab ahaan u socdo halkii aad dib u akhrin lahayd liiska aad dhistay. Dhismaha iproute2 keenaya, adb shell ip route get 10.1.2.3 wuxuu magacaabaa interface-ka kernel-ku doortay. Ku socodsii isla amarka cinwaan dadweyne oo xaqiiji in uu tunnellka magacaabo.

Laba hubin oo kale ayaa wareegga xidha. Marka hore xalli magac maxalli ah, ka dib ku socodsii adb shell ip route get cinwaanka la xalliyay oo dalbo interface aan tunnellka ahayn, sababtoo ah adb shell ping -c 1 host.lan guuleysta wuxuu caddeeyaa gaadhid, ma aha waddada. Ku celi imtixaanka qoyska cinwaanka IPv6 haddii tunnellku mid sheegto. Ku tijaabi heerka API ee aad rarto, sababtoo ah sida shabakadaha VPN loo bandhigo shaxda waddo-marinta ayaa is beddelay intii u dhaxaysay sii-deymaha. Liis waddooyin warqad ku muuqda mid sax ah iyo raadin doorta interface khaldan waa cillado kala duwan, oo kaliya tan labaad ayaa gaadha isticmaalayaasha.

Haddii liiska ka-reebidda uu sii kordho, jooji soo-saarista waddooyinka oo dib u lambar shabakadda fog ama cidhi tunnellka. Soo-saaruhu waa hareer-mar loogu talagalay API-ga maqan, ma aha qalab naqshadeed.

Maqaallo la xiriira