addDnsServer Bad Address: cad a fhíoraíonn Android i ndáiríre
Is seiceáil fhormáide áitiúil é earráid Bad address ó addDnsServer, ní cliseadh DNS. Déan an litriú a anailísiú, fág loopback agus wildcard ar leataobh, ansin tástáil inrochtaineacht.
Shroich an luach VpnService.Builder.addDnsServer mar theaghrán agus dhiúltaigh an builder dó ansin sula raibh aon rud bunaithe. Tá an diúltú sin áitiúil: níor teagmhaíodh le haon resolver, níl aon tollán ann agus is seiceáil fhormáide a theip, ní cliseadh DNS.
Tá tábhacht leis mar tá trí ionchur DNS cosúla ag gnáth-aip VPN: luach clóscríofa nó iompórtáilte sa phróifíl, luach a sheolann an freastalaí le linn cumraíochta, agus Private DNS ag leibhéal an chórais. Ní shroicheann ach an chéad dá cheann an glao seo.
Seiceálann réad ullmhúcháin an argóint ar an toirt
Ní hé VpnService.Builder an tollán. Is réad ullmhúcháin é a bhailíonn seoltaí, bealaí agus freastalaithe, agus ní dhéanann ach establish() na liostaí sin a iompú ina ParcelFileDescriptor beo agus ina chomhéadan. Seiceáiltear an iontráil DNS nuair a ghlaonn tú ar addDnsServer.
Leanann dhá iarmhairt. Tá an lorg gearr agus neamhúsáideach d’aon ghnó: tháinig an luach mar theaghrán simplí. Agus fágann catch míchúramach timpeall na tógála tollán le seoltaí agus bealaí ach gan aon resolver.
Coinníonn an builder aon liosta a thugann tú dó. Ní chruthaíonn sé sin ach go ndearnadh an teaghrán a anailísiú mar litriú seola ag am na tógála.
Cad is féidir leis an argóint a bheith
Is seoladh é an paraiméadar, ní endpoint. Glacann tagairt Builder le litriú IPv4 nó IPv6, agus tá an anailís uimhriúil amháin: is é android.net.InetAddresses.parseNumericAddress aghaidh phoiblí an pharsálaí sin ó API 29. Ní seoladh mall é ainm óstaigh anseo ach teaghrán nach féidir a anailísiú.
Breathnaíonn an mapáil phraiticiúil mar seo:
| 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 |
Tá tionchar ag an leagan ar conas a dhéanann tú bailíochtú, ní ar cad a ghlacann an builder. Tá InetAddresses ar fáil ó API 29, mar sin ar Android 10 agus níos nuaí is glao amháin é. Is é addDnsServer(InetAddress) an fhoirm bhunaidh agus String an breis is nuaí. Faoi API 29 réiteoidh InetAddress.getByName ainm óstaigh le cuardach líonra blocála agus déanfaidh sé clóscríobhán de chliseadh mall.
Diúltaítear do loopback anseo, ní do wildcard
Treoraíonn cliaint VPN deisce a stub resolver go 127.0.0.1:53 go minic. Má chóipeáiltear é sin isteach i bpróifíl Android ionghabháiltear luach a chuireann síos ar an meaisín áitiúil, agus níl aon mheaisín áitiúil anseo. Ní dhiúltaíonn an builder ach don chás seo: caitheann seoladh null nó loopback IllegalArgumentException.
Is é an wildcard an cás eile, agus anseo a théann an chuid is mó de léamha an earráide seo amú. Ní loopback iad 0.0.0.0 agus ::, mar sin glacann an builder leo; ní chaitear aon rud ag am na tógála. Tagann an comhéadan aníos le hiontráil nach n-ainmníonn aon cheann scríbe. Is obair do do bhailíochtaithe é sin a ghabháil: caith le isAnyLocalAddress mar ionchur neamhbhailí.
Anailísigh uair amháin ag teorainn na cumraíochta
Is é an leigheas saor an teaghrán a bhailíochtú san áit a dtéann sé isteach i do mhúnla:
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 }
}
Éiríonn toradh null ina earráid leibhéal allamuigh leis an téacs ciontach, agus is é sin an t-aon fhoirm ar féidir le tacaíocht gníomhú uirthi. Ar an gcosán rathúil téann an réad go díreach isteach i builder.addDnsServer(address). Gabh IllegalArgumentException go sonrach, ní Exception: slogann gabháil leathan na hearráidí pointeoir nialais freisin.
Ná cuir resolver poiblí ina áit nuair a dhiúltaítear don luach atá beartaithe. Ceanglaíonn próifíl a mhalartaíonn go ciúin go DNS poiblí, ach stopann ainmneacha inmheánacha ag réiteach.
Deimhnigh inrochtaineacht nuair a bhíonn an comhéadan ann
Is é glacadh ag an builder an chéad phointe rialaithe, ní an ceann deireanach. Nuair a bhíonn an comhéadan suas, taispeánann LinkProperties.getDnsServers() an méid a fuair an líonra i ndáiríre. Priontálann adb shell dumpsys connectivity na hairíonna céanna ón taobh amuigh.
Is rialú ar leithligh é Private DNS agus ní théann sé tríd an argóint seo. Baineann ainm óstaigh soláthraí DoT le socrú an chórais, ní le réimse IP.
Sula n-athraíonn tú parsálaí na próifíle arís, oibrigh san ord seo: logáil an teaghrán amh agus a fhoinse, deimhnigh gur litriú é agus nach ainm óstaigh é, nach loopback ná wildcard é, agus cuir an réad anailísithe ar aghaidh.