Android VPN ટનલમાંથી સબનેટ કેવી રીતે બાકાત રાખવું
VpnService રૂટને બાકાત રાખી શકતું નથી, તેથી તમે પૂરક ઉમેરો છો: /8 માટે આઠ જનરેટ કરેલા પ્રીફિક્સ, સાથે IPv6, DNS અને લુકઅપ તપાસ જે બાકીનું પકડે છે.
Android ના VpnService પાસે કોઈ બાકાત રૂટ નથી, અને API વાંચવાની કોઈ પણ માત્રા એક પણ ઉત્પન્ન કરશે નહીં। Builder.addRoute() ટનલમાં હંમેશા માત્ર લક્ષ્યો ઉમેરે છે, તેથી LAN સેગમેન્ટને સ્થાનિક રાખવાનો અર્થ છે કે તે સેગમેન્ટ ક્યારેય રૂટ યાદીમાં પ્રવેશતું નથી। તમે તેના બદલે સેગમેન્ટનું પૂરક ઉમેરો છો, જે સામાન્ય પ્રીફિક્સ તરીકે વ્યક્ત થાય છે। કામ ગણિત છે, અને તે થોડાક અનુમાનિત સ્થળોએ નિષ્ફળ જાય છે।
નીચેની તપાસ ક્રમમાં કરો। દરેક ધારે છે કે પહેલી સફળ રહી, તેથી નીચે લક્ષણોને પેચ કરવાને બદલે પ્રથમ નિષ્ફળતા પર થોભો।
ટનલ જે દાવો કરે છે તેનાથી શરૂ કરો
0.0.0.0/0 ને addRoute() માં પસાર કરવાથી Android ને કહેવાય છે કે દરેક IPv4 લક્ષ્ય ટનલનું છે। તેથી જ ઘણા ક્લાયન્ટ સ્પ્લિટ ટનલિંગમાં અસમર્થ દેખાય છે: તે આખી સરનામું જગ્યા દાવો કરે છે અને પછી તેમાંથી બાદ કરવાનો પ્રયાસ કરે છે। બિલ્ડરમાં કંઈ પણ બાદ કરતું નથી। તમે જે નેટવર્ક સ્થાનિક રાખવા માંગતા હતા તેના માટે વધુ ચોક્કસ રૂટ લોકો જે અપેક્ષા રાખે છે તેનાથી ઊલટું કરે છે, કારણ કે સૌથી લાંબો મેળ ખાતો પ્રીફિક્સ જીતે છે અને તે નેટવર્ક ટનલની અંદર આવી જાય છે।
રૂટ યાદી જ આખી નીતિ છે। તેની પાછળ દરેક લક્ષ્ય માટે વીટો નથી, અને Builder સંદર્ભ એવી કોઈ પદ્ધતિ સૂચવતું નથી જે એક આપે।
પ્રીફિક્સ ગણિતમાંથી પૂરક બનાવો
બાકાત કરેલા પ્રીફિક્સનું પૂરક સરનામા વૃક્ષના મૂળ સુધીના માર્ગ પર તેના ભાઈઓનો સમૂહ છે। 1 થી બાકાત કરેલી લંબાઈ સુધીની દરેક લંબાઈ માટે, તમારું પ્રીફિક્સ ધરાવતો તે લંબાઈનો બ્લોક લો, પ્રીફિક્સની તરત નીચેનો બિટ ફેરવો અને પરિણામ આપો। તમે તેને ચલાવો ત્યાં સુધી તે અમૂર્ત લાગે છે।
10.0.0.0/8 બાકાત કરવાથી આઠ રૂટ મળે છે: 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। તેમાંથી કોઈ 10.0.0.0/8 ધરાવતું નથી, અને સાથે મળીને તે બાકીનું બધું આવરી લે છે।
આઠ લીટીઓ કોઈ પણ પ્રીફિક્સ માટે તે યાદી બનાવે છે:
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))
રૂટની સંખ્યા પ્રીફિક્સની લંબાઈ જેટલી હોય છે, અને તે જ ધ્યાન રાખવાનો આંકડો છે। એક /21 બાકાત 21 રૂટનો ખર્ચ કરે છે અને વાંચનીય રહે છે। દસ બાકાત થોડા સોનો ખર્ચ કરી શકે છે, જેનો અર્થ સામાન્ય રીતે એ છે કે નેટવર્ક ડિઝાઇન બદલવી પડશે, જનરેટર નહીં।
સરનામા કુટુંબ અને ટનલનો વ્યાપ તપાસો
IPv4 રૂટ IPv6 માટે કંઈ કરતા નથી। જો ટનલ IPv6 સરનામું દાવો કરે, તો IPv6 LAN પ્રીફિક્સને તેનું પોતાનું પૂરક જોઈએ, જે 128 બિટ પર એ જ ગણિતથી બનાવેલું હોય। કાગળ પર બાકાત કામ કરે પણ સ્થાનિક ઉપકરણ પહોંચની બહાર રહે તેનું સામાન્ય કારણ આ છે: હોસ્ટ સુધી IPv6 દ્વારા પહોંચાયું, અને ફક્ત IPv4 કાપવામાં આવ્યું। ગણિત ખોટું છે એમ તારણ કાઢતા પહેલા બંને કુટુંબ તપાસો।
વ્યાપ તપાસનો બીજો અડધો ભાગ છે। Android નેટવર્ક અને એપ દીઠ રૂટિંગ ટ્રેક કરે છે, તેથી એ જ પ્રીફિક્સ એક એપ માટે ટનલ થઈને અને બીજી માટે સીધું હોઈ શકે, VPN કેવી રીતે જાહેર થઈ તેના આધારે।
DNS અને દરેક એપના નિયમો યોગ્ય જગ્યાએ મૂકો
રૂટ બાકાત રિઝોલ્વર બદલતું નથી। સ્થાનિક હોસ્ટનામ હજી પણ ટનલના DNS સર્વર દ્વારા જવાબ મેળવી શકે છે જ્યારે તેનું સરનામું સ્થાનિક રૂટ થાય છે, અને અસંગતિ એવા નામ તરીકે દેખાય છે જે LAN પહોંચી શકે નહીં તેવી વસ્તુમાં ઉકેલાય છે। રિઝોલ્વર નીતિ જાણી જોઈને સેટ કરો, સર્ચ ડોમેન અથવા સ્પ્લિટ-DNS નિયમ સાથે। ધારશો નહીં કે રૂટે તમારા વતી નક્કી કર્યું છે।
addDisallowedApplication() એક એપને ટનલની બહાર રાખે છે; અંદર રહેતી એપ્સ માટે તે લક્ષ્યને બહાર રાખતું નથી। protect() તમે ખોલો છો તે સોકેટને ટનલ ટાળવા દે છે, અને એ રીતે ટનલ પોતાનું પરિવહન પકડવાનું ટાળે છે। બંમાંથી કોઈ પૂરકનું સ્થાન લેતું નથી।
તમારી પોતાની યાદીથી નહીં, લુકઅપથી ચકાસો
ટનલ શરૂ થાય પછી, તમે બનાવેલી યાદી ફરી વાંચવાને બદલે ઉપકરણને પૂછો કે સરનામું ખરેખર ક્યાં જાય છે। iproute2 સાથે આવતા બિલ્ડ પર, adb shell ip route get 10.1.2.3 કર્નલે પસંદ કરેલું ઇન્ટરફેસ નામ આપે છે। જાહેર સરનામા માટે એ જ આદેશ ચલાવો અને ખાતરી કરો કે તે ટનલનું નામ આપે છે।
બે વધુ તપાસ ચક્ર બંધ કરે છે। પહેલા સ્થાનિક નામ ઉકેલો, પછી ઉકેલાયેલા સરનામા પર adb shell ip route get ચલાવો અને એવું ઇન્ટરફેસ માંગો જે ટનલ ન હોય, કારણ કે સફળ adb shell ping -c 1 host.lan પહોંચ સાબિત કરે છે, માર્ગ નહીં। જો ટનલ એક દાવો કરે તો IPv6 પર સરનામા-કુટુંબ પરીક્ષણનું પુનરાવર્તન કરો। તમે શિપ કરો તે API સ્તર પર પરીક્ષણ કરો, કારણ કે VPN નેટવર્ક રૂટિંગ ટેબલ સમક્ષ કેવી રીતે રજૂ થાય છે તે રિલીઝ દરમિયાન બદલાયું છે। કાગળ પર સાચી દેખાતી રૂટ યાદી અને ખોટું ઇન્ટરફેસ પસંદ કરતું લુકઅપ બે અલગ બગ છે, અને ફક્ત બીજું જ વપરાશકર્તાઓ સુધી પહોંચે છે।
જો બાકાત યાદી વધતી જ રહે, તો રૂટ બનાવવાનું બંધ કરો અને દૂરના નેટવર્કને ફરી નંબર આપો અથવા તેના બદલે ટનલ સાંકડી કરો। જનરેટર ગુમ થયેલ API માટેનો ઉપાય છે, ડિઝાઇન સાધન નહીં।