Android యొక్క VpnService కి మినహాయింపు మార్గం లేదు, మరియు ఎంత API చదివినా ఒకటి ఉత్పత్తి కాదు. Builder.addRoute() సొరంగంలో గమ్యస్థానాలను మాత్రమే జోడిస్తుంది, కాబట్టి LAN విభాగాన్ని స్థానికంగా ఉంచడం అంటే ఆ విభాగం ఎప్పుడూ మార్గాల జాబితాలోకి రాదు. దానికి బదులుగా మీరు జోడించేది విభాగం యొక్క పూరకం, సాధారణ ప్రిఫిక్స్లుగా వ్యక్తీకరించబడుతుంది. పని అంకగణితం, మరియు అది కొన్ని ఊహించగల స్థలాలలో విఫలమవుతుంది.

క్రింది తనిఖీలను క్రమంగా చేయండి. ప్రతి ఒక్కటి మునుపటిది నిలిచిందని ఊహిస్తుంది, కాబట్టి క్రింది లక్షణాలను ప్యాచ్ చేయడం బదులు మొదటి వైఫల్యం వద్ద ఆపండి.

సొరంగం ఏమి చెప్పుకుంటుందో దానితో ప్రారంభించండి

0.0.0.0/0 ను addRoute() కి పంపడం ప్రతి IPv4 గమ్యస్థానం సొరంగానికి చెందినదని Android కి చెబుతుంది. అందుకే చాలా క్లయింట్లు విభజిత సొరంగీకరణకు అసమర్థులుగా కనిపిస్తాయి: వారు మొత్తం చిరునామా స్థలాన్ని దావా చేసి తర్వాత దాని నుండి తీసివేయడానికి ప్రయత్నిస్తారు. నిర్మాణకుడిలో ఏదీ తీసివేయదు. మీరు స్థానికంగా ఉంచాలనుకున్న నెట్వర్క్ కోసం మరింత నిర్దిష్టమైన మార్గం ప్రజలు ఆశించినదానికి వ్యతిరేకంగా పనిచేస్తుంది, ఎందుకంటే పొడవైన సరిపోలే ప్రిఫిక్స్ గెలుస్తుంది మరియు ఆ నెట్వర్క్ సొరంగం లోపలికి వస్తుంది.

మార్గాల జాబితాయే మొత్తం విధానం. దాని వెనుక ప్రతి గమ్యస్థానానికి వీటో లేదు, మరియు 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 కోసం ఒక మార్గం, డిజైన్ సాధనం కాదు.

సంబంధిత వ్యాసాలు