De Wäert ass als String bei VpnService.Builder.addDnsServer ukomm an de Builder huet en do verworf, ier eppes opgebaut war. Dës Verwerfung ass lokal: kee Resolver gouf kontaktéiert, et gëtt keen Tunnel, an dat wat gescheitert ass ass eng Formatprüfung, keen DNS-Ausfall.

Dat ass wichteg well eng typesch VPN-App dräi ähnlech DNS-Init huet: e Wäert am Profil, e Wäert deen de Server schéckt, an Private DNS op Systemniveau. Nëmmen déi éischt zwee erreechen dëse Call.

En Objet de Preparatioun prüft d’Argument direkt

VpnService.Builder ass net den Tunnel. Et ass en Objet de Preparatioun deen Adressen, Route a Serveren sammelt, an nëmmen establish() mécht aus deene Lëschten en liewegen ParcelFileDescriptor an eng Interface. Den DNS-Antrëtt gëtt beim Ruff vun addDnsServer geprüft.

Zwee Folgen: de Stacktrace ass kuerz a mat Absicht net informativ, an en onsuewege catch hannerléisst en Tunnel mat Adressen awer ouni Resolver.

De Builder behält all Lëscht, déi een him gëtt; e Server dobäizemaachen deen d’Prüfung passéiert beweist just datt de String beim Bau als Adressliteralf analyséiert gouf.

Wat d’Argument ka sinn

De Parameter ass eng Adress, keen Endpoint. D’Builder-Referenz hëlt en IPv4- oder IPv6-Literal, an d’Analys ass nëmmen numeresch: android.net.InetAddresses.parseNumericAddress ass d’ëffentlech Gesiicht vun deem Parser zënter API 29.

Déi praktesch Zouuerdnung gesäit sou aus:

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

D’Versioun beaflosst wéi Dir validéiert, net wat de Builder unhëlt. InetAddresses ass zënter API 29 disponibel, dofir ass d’Analys op Android 10 een eenzegen Uruff; addDnsServer(InetAddress) ass d’Originalform, String déi méi nei Ergänzung. Ënner API 29 léist InetAddress.getByName en Hostnumm mat enger blockéierender Netzwierksich.

Loopback gëtt hei verworf, wildcard net

Desktop-VPN-Clienten schécken hire Stub-Resolver dacks op 127.0.0.1:53; dat an en Android-Profil kopéieren bréngt e Wäert eran deen déi lokal Maschinn beschreift, an hei gëtt et keng lokal Maschinn. De Builder verwërft nëmmen dëse Fall: eng null- oder loopback-Adress schéisst IllegalArgumentException.

Wildcard ass de Géigefall an hei ginn déi meescht Liesarten dëse Feeler falsch. 0.0.0.0 an :: sinn net loopback, dofir hëlt de Builder se un; beim Bau gëtt näischt geworf. D’Interface kënnt dunn mat engem Antrëtt erop deen keen Zil nennt. Dat ze fangen ass d’Aarbecht vun Ärem Validator: behandelt isAnyLocalAddress als ongültegen Input.

Analyséiert eemol op der Konfiguratiounsgrenz

Déi bëlleg Léisung ass do ze validéieren wou de String an Äre Modell kënnt:

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

En null-Resultat gëtt e Fehler op Feldniveau mat dem schlëmmen Text, an dat ass déi eenzeg Form op déi de Support ka reagéieren. Um Erfollegswee geet den Objet direkt an builder.addDnsServer(address), a fänkt IllegalArgumentException spezifesch, net Exception.

Ersetzt net duerch en ëffentlechen Resolver wann de gewollte Wäert verworf gëtt; e Profil deen heemlech en ëffentlechen DNS setzt verbënnt sech, awer intern Nimm ginn net méi opgeléist.

Bestätegt d’Erreechbarkeet wann d’Interface existéiert

D’Unhuele vum Builder ass den éischte Kontrollpunkt, net den leschten. Nodeems d’Interface steet weist LinkProperties.getDnsServers() wat d’Netzwierk wierklech kritt huet, an adb shell dumpsys connectivity dréckt déiselwecht Eegenschaften vun dobaussen.

Private DNS ass eng separat Kontroll an geet net duerch dëst Argument; den Hostnumm vun engem DoT-Anbieder gehéiert zu der Systemastellung, net an en IP-Feld.

Ier Dir de Profilparser nach eng Kéier ännert, loggt de rohe String an seng Quell, bestätegt datt et e Literal an keen Hostnumm ass, datt et weder loopback nach wildcard ass, a gitt den analyséierten Objet weider.

Ähnlech Artikelen