Darajar ta isa VpnService.Builder.addDnsServer a matsayin zare, kuma builder ya ki ta kafin a kafa wani abu. Wannan kin na gida ne: ba a tuntubi resolver, babu tunnel, kuma abin da ya kasa duban tsari ne ba rashin DNS ba.

App din VPN yawanci yana da shigar DNS guda uku masu kama: darajar profile, darajar da uwar garke ke aikawa, da Private DNS a matakin tsarin. Na farko biyu ne kawai ke isa wannan kira.

Abun shiri yana duba hujja nan take

VpnService.Builder ba tunnel ba ne. Abu ne na shiri da ke tattara adireshi, hanyoyi da uwar garke, kuma establish() ne kawai ke mai da su ParcelFileDescriptor mai rai da interface. Ana duba shigar DNS lokacin kira addDnsServer.

Akwai sakamako biyu: wurin bin diddigin gajere ne, kuma catch mara hankali yana barin tunnel mai adireshi amma babu resolver.

Builder yana rike duk jerin da ka bayar; kara uwar garke da ta wuce duban yana tabbatar da an bincika zaren a matsayin adireshi ne kawai.

Abin da hujja zata iya kasancewa

Hujjar adireshi ce, ba endpoint ba. Bayanan Builder yana karbar literal IPv4 ko IPv6, kuma binciken na lambobi ne kawai: android.net.InetAddresses.parseNumericAddress fuskar jama a ce daga API 29.

Taswirar aiki tana kama da haka:

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

Sigar tana shafar yadda kake tantancewa, ba abin da builder ke karba ba. InetAddresses akwai daga API 29, don haka a Android 10 binciken kira daya ne; addDnsServer(InetAddress) asali ne, String sabon kari. Karkashin API 29 InetAddress.getByName zai warware sunan host da bincike mai toshewa.

Ana kin loopback anan, wildcard ba

Abokan cinikin VPN na tebur sukan tura stub resolver zuwa 127.0.0.1:53; kwafin hakan cikin profile na Android yana shigo da darajar na’urar gida, kuma babu na’urar gida anan. Builder yana kin haka ne kawai: null ko loopback yana jefa IllegalArgumentException.

Wildcard shine akasin hali, kuma anan ne yawancin karatu ke kuskure. 0.0.0.0 da :: ba loopback ba ne, don haka builder yana karbarsu; babu abin jefawa lokacin ginawa. Interface yana tashi da shigar da ba ta ambaci manufa ba. Kama hakan aikin validator naka ne: dauki isAnyLocalAddress a matsayin shigar mara inganci.

Bincika sau daya a iyakar saitin

Magani mai sauki shine a tantance inda zaren ke shiga model dinka:

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 }
}

Sakamakon null yana zama kuskuren fili mai dauke da rubutun laifin, kuma shine kadai siffar da tallafi zai iya aiki da ita. A hanyar nasara abun yana shiga builder.addDnsServer(address) kai tsaye. Kama IllegalArgumentException musamman, ba Exception ba.

Kada ka maye gurbin da resolver na jama a lokacin da aka ki darajar da ake so; profile da ke canzawa a shiru yana haduwa amma sunayen ciki sun daina warwarewa.

Tabbatar da isa bayan interface ya kasance

Karbar builder shine farkon wurin dubawa, ba na karshe ba. Bayan interface ya tashi LinkProperties.getDnsServers() yana nuna abin da cibiyar sadarwa ta samu, kuma adb shell dumpsys connectivity yana buga wadannan halaye daga waje.

Private DNS wani iko ne daban kuma baya wucewa ta wannan hujja; sunan host na mai bayar da DoT na saitin tsarin ne, ba filin IP ba.

Kafin ka sake canza parser din profile, rubuta danyen zaren da tushensa, tabbatar literal ne ba sunan host ba, ba loopback ko wildcard ba, sannan ka mika abun da aka bincika.

Labarai masu alaƙa