విలువ VpnService.Builder.addDnsServer కు స్ట్రింగ్‌గా చేరింది మరియు ఏదీ స్థాపించబడకముందే builder అక్కడే తిరస్కరించింది. ఈ తిరస్కరణ స్థానికం: ఏ resolver తో సంబంధం లేదు, tunnel లేదు, మరియు విఫలమైనది ఆకృతి తనిఖీ, DNS కాదు.

సాధారణ VPN యాప్‌లో మూడు సమాన DNS ఇన్‌పుట్‌లు ఉంటాయి కాబట్టి ఇది ముఖ్యం: ప్రొఫైల్‌లోని విలువ, సర్వర్ పంపే విలువ, మరియు సిస్టమ్ స్థాయిలో Private DNS. మొదటి రెండు మాత్రమే ఈ పిలుపుకు చేరుతాయి.

సన్నద్ధత వస్తువు వాదనను వెంటనే తనిఖీ చేస్తుంది

VpnService.Builder tunnel కాదు. ఇది చిరునామాలు, మార్గాలు మరియు సర్వర్‌లను సేకరించే సన్నద్ధత వస్తువు, మరియు establish() మాత్రమే ఆ జాబితాలను సజీవ ParcelFileDescriptor మరియు ఇంటర్‌ఫేస్‌గా మారుస్తుంది. DNS ఎంట్రీ addDnsServer పిలిచినప్పుడు తనిఖీ చేయబడుతుంది.

రెండు పరిణామాలు: స్టాక్ ట్రేస్ చిన్నది మరియు ఉద్దేశపూర్వకంగా సమాచారరహితం, మరియు నిర్లక్ష్య catch resolver లేని tunnel ను విడిచిపెడుతుంది.

builder ఇచ్చిన ఏ జాబితానైనా ఉంచుతుంది; తనిఖీ దాటిన సర్వర్‌ను జోడించడం స్ట్రింగ్ నిర్మాణ సమయంలో చిరునామా లిటరల్‌గా విశ్లేషించబడిందని మాత్రమే నిరూపిస్తుంది.

వాదన ఏమి కావచ్చు

పరామితి చిరునామా, endpoint కాదు. Builder సూచన IPv4 లేదా IPv6 లిటరల్‌ను తీసుకుంటుంది, విశ్లేషణ సంఖ్యాత్మకం మాత్రమే: android.net.InetAddresses.parseNumericAddress API 29 నుండి ఆ parser యొక్క ప్రజా ముఖం.

ఆచరణాత్మక మ్యాపింగ్ ఇలా ఉంటుంది:

InputResultReason
10.8.0.1acceptedIPv4 literal
2606:4700:4700::1111acceptedIPv6 literal
dns.example.comrejectedhostname; numeric parsing does not resolve it
10.8.0.1:53rejectedport belongs to your own config model
https://dns.example.com/dns-queryrejectedDoH URL, a different configuration path
127.0.0.1rejectedloopback is not a remote resolver
0.0.0.0 or ::accepted by the builderparses fine, but names no destination; only your own validator rejects it

వెర్షన్ మీరు ఎలా ధృవీకరిస్తారనేదానిపై ప్రభావం చూపుతుంది, builder ఏమి అంగీకరిస్తుందనేదానిపై కాదు. InetAddresses API 29 నుండి అందుబాటులో ఉంది, కాబట్టి Android 10 లో విశ్లేషణ ఒక పిలుపు; addDnsServer(InetAddress) మూల రూపం, String కొత్త చేరిక. API 29 కంటే దిగువ InetAddress.getByName నిరోధించే నెట్‌వర్క్ శోధనతో హోస్ట్‌నామాన్ని పరిష్కరిస్తుంది.

loopback ఇక్కడ తిరస్కరించబడుతుంది, wildcard కాదు

డెస్క్‌టాప్ VPN క్లయింట్లు తమ stub resolver ను 127.0.0.1:53 కు పంపుతాయి; దాన్ని Android ప్రొఫైల్‌లోకి కాపీ చేస్తే స్థానిక యంత్రాన్ని వివరించే విలువ వస్తుంది, ఇక్కడ స్థానిక యంత్రం లేదు. builder ఈ సందర్భాన్ని మాత్రమే తిరస్కరిస్తుంది: null లేదా loopback చిరునామా IllegalArgumentException విసురుతుంది.

wildcard వ్యతిరేక సందర్భం మరియు ఇక్కడే చాలా పఠనాలు తప్పు అవుతాయి. 0.0.0.0 మరియు :: loopback కాదు, కాబట్టి builder వాటిని అంగీకరిస్తుంది; నిర్మాణంలో ఏదీ విసరబడదు. తర్వాత ఇంటర్‌ఫేస్ గమ్యాన్ని పేర్కొనని ఎంట్రీతో పైకి వస్తుంది. దాన్ని పట్టుకోవడం మీ validator పని: isAnyLocalAddress ను చెల్లని ఇన్‌పుట్‌గా పరిగణించండి.

సంరచన సరిహద్దులో ఒకసారి విశ్లేషించండి

చవకైన పరిష్కారం స్ట్రింగ్ మీ మోడల్‌లోకి ప్రవేశించే చోటే ధృవీకరించడం:

import android.net.InetAddresses
import java.net.InetAddress

private fun dnsLiteralOrNull(raw: String?): InetAddress? {
    val text = raw?.trim().orEmpty()
    if (text.isEmpty()) return null
    val address = try {
        InetAddresses.parseNumericAddress(text)
    } catch (e: IllegalArgumentException) {
        return null
    }
    return address.takeUnless { it.isAnyLocalAddress || it.isLoopbackAddress }
}

null ఫలితం తప్పు టెక్స్ట్‌ను మోసే ఫీల్డ్ స్థాయి లోపం అవుతుంది మరియు మద్దతు చర్య తీసుకోగల ఏకైక రూపం అదే. విజయ మార్గంలో వస్తువు నేరుగా builder.addDnsServer(address) లోకి వెళ్తుంది, మరియు IllegalArgumentException ను ప్రత్యేకంగా పట్టుకోండి, Exception కాదు.

లక్ష్య విలువ తిరస్కరించబడినప్పుడు ప్రజా resolver తో భర్తీ చేయవద్దు; నిశ్శబ్దంగా ప్రజా DNS పెట్టే ప్రొఫైల్ కనెక్ట్ అవుతుంది, కానీ అంతర్గత పేర్లు పరిష్కరించబడటం ఆగిపోతుంది.

ఇంటర్‌ఫేస్ ఏర్పడిన తర్వాత చేరుకోగలిగేతను నిర్ధారించండి

builder అంగీకారం మొదటి తనిఖీ బిందువు, చివరిది కాదు. ఇంటర్‌ఫేస్ పైకి వచ్చిన తర్వాత LinkProperties.getDnsServers() నెట్‌వర్క్ నిజంగా ఏమి పొందిందో చూపిస్తుంది, adb shell dumpsys connectivity అదే లక్షణాలను బయటి నుండి ముద్రిస్తుంది.

Private DNS వేరే నియంత్రణ మరియు ఈ వాదన ద్వారా వెళ్లదు; DoT ప్రదాత హోస్ట్‌నామ్ సిస్టమ్ సెట్టింగ్‌కు చెందుతుంది, IP ఫీల్డ్‌కు కాదు.

ప్రొఫైల్ parser ను మళ్లీ మార్చే ముందు ముడి స్ట్రింగ్ మరియు దాని మూలాన్ని నమోదు చేయండి, అది హోస్ట్‌నామ్ కాదు లిటరల్ అని, loopback లేదా wildcard కాదని నిర్ధారించి, విశ్లేషించిన వస్తువును పంపండి.

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