addDnsServer Bad Address: Android සැබවින්ම පරීක්ෂා කරන්නේ
addDnsServer හි Bad address දෝෂය දේශීය ආකෘති පරීක්ෂාවකි, DNS බිඳවැටීමක් නොවේ. විස්තරය විශ්ලේෂණය කර, loopback සහ wildcard ඉවත් කර, පසුව ළඟාවීම පරීක්ෂා කරන්න.
අගය VpnService.Builder.addDnsServer වෙත තන්තුවක් ලෙස ළඟා වූ අතර builder එය කිසිවක් ස්ථාපිත කිරීමට පෙර එහිදීම ප්රතික්ෂේප කළේය. මෙම ප්රතික්ෂේපය දේශීයයි: කිසිදු resolver සම්බන්ධ නොවීය, tunnel නොමැත, සහ අසාර්ථක වූයේ ආකෘති පරීක්ෂාවක් මිස DNS නොවේ.
සාමාන්ය VPN යෙදුමක සමාන DNS ආදාන තුනක් ඇති බැවින් මෙය වැදගත් වේ: පැතිකඩෙහි අගය, සේවාදායකය යවන අගය සහ පද්ධති මට්ටමේ Private DNS. මෙම ඇමතුමට පළමු දෙක පමණක් ළඟා වේ.
සූදානම් කිරීමේ වස්තුව තර්කය වහාම පරීක්ෂා කරයි
VpnService.Builder tunnel නොවේ. එය ලිපින, මාර්ග සහ සේවාදායක එකතු කරන සූදානම් කිරීමේ වස්තුවකි, සහ establish() පමණක් එම ලැයිස්තු ජීවමාන ParcelFileDescriptor සහ අතුරුමුහුණත බවට පත් කරයි. DNS සටහන addDnsServer ඇමතීමේදී පරීක්ෂා වේ.
ප්රතිඵල දෙකක්: stack trace කෙටි සහ චේතනාන්විතව තොරතුරු රහිත ය, සහ නොසැලකිලිමත් catch resolver රහිත tunnel ඉතිරි කරයි.
builder දෙන ඕනෑම ලැයිස්තුවක් තබා ගනී; පරීක්ෂාව සමත් සේවාදායකයක් එකතු කිරීම තන්තුව ගොඩනැගීමේදී ලිපින විස්තරයක් ලෙස විශ්ලේෂණය වූ බව පමණක් සනාථ කරයි.
තර්කය කුමක් විය හැකිද
පරාමිතිය ලිපිනයකි, endpoint නොවේ. Builder යොමුව IPv4 හෝ IPv6 විස්තරයක් ගනී, විශ්ලේෂණය සංඛ්යාත්මක පමණි: android.net.InetAddresses.parseNumericAddress API 29 සිට එම parser හි පොදු මුහුණුවරයි.
ප්රායෝගික සිතියම්කරණය මෙසේ ය:
| Input | Result | Reason |
|---|---|---|
10.8.0.1 | accepted | IPv4 literal |
2606:4700:4700::1111 | accepted | IPv6 literal |
dns.example.com | rejected | hostname; numeric parsing does not resolve it |
10.8.0.1:53 | rejected | port belongs to your own config model |
https://dns.example.com/dns-query | rejected | DoH URL, a different configuration path |
127.0.0.1 | rejected | loopback is not a remote resolver |
0.0.0.0 or :: | accepted by the builder | parses 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 ඒවා පිළිගනී; ගොඩනැගීමේදී කිසිවක් විසි නොකෙරේ. පසුව අතුරුමුහුණත ගමනාන්තයක් නම් නොකරන සටහනක් සමඟ ඉහළ යයි. එය අල්ලා ගැනීම ඔබේ වලංගුකරණයේ කාර්යයයි: 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 නොවන බව තහවුරු කර, විශ්ලේෂිත වස්තුව ඉදිරියට යවන්න.