Iye naa de VpnService.Builder.addDnsServer gẹgẹbi okun ati builder kọ o nibẹ ṣaaju ki a to fi ohunkohun mulẹ. Ikọ yii jẹ ti ibilẹ: ko si resolver ti a kan, ko si tunnel, ati ohun ti o kuna ni ayẹwo fọmati, kii ṣe DNS.

Eyi ṣe pataki nitori app VPN deede ni awọn igbewọle DNS mẹta ti o jọra: iye ninu profaili, iye ti server fi ranṣẹ, ati Private DNS ni ipele eto. Awọn meji akọkọ nikan ni o de ipe yii.

Ohun elo igbaradi ṣayẹwo ariyanjiyan lẹsẹkẹsẹ

VpnService.Builder kii ṣe tunnel. O jẹ ohun elo igbaradi ti o kojọ awọn adirẹsi, awọn ipa-ọna ati awọn server, ati establish() nikan ni o yi awọn atokọ pada si ParcelFileDescriptor alaaye ati interface. A ṣayẹwo titẹsi DNS nigbati o pe addDnsServer.

Awọn abajade meji: ipa-ọna kukuru ati laini alaye mọọmọ, ati catch alaibikita fi tunnel laisi resolver silẹ.

Builder tọju eyikeyi atokọ ti o fun; fifi server kan kun ti o kọja ayẹwo jẹri nikan pe a ṣayẹwo okun naa gẹgẹbi literal adirẹsi nigba ikole.

Kini ariyanjiyan le jẹ

Paramita jẹ adirẹsi, kii ṣe endpoint. Itọkasi Builder gba literal IPv4 tabi IPv6, ati ayẹwo jẹ ti nọmba nikan: android.net.InetAddresses.parseNumericAddress ni oju gbangba ti parser yẹn lati API 29.

Iṣiro ti o wu ni o dabi eyi:

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

Ẹya naa ni ipa lori bii o ṣe ṣayẹwo, kii ṣe ohun ti builder gba. InetAddresses wa lati API 29, nitorinaa lori Android 10 ayẹwo jẹ ipe kan; addDnsServer(InetAddress) ni irisi atilẹba, String ni afikun tuntun. Labẹ API 29 InetAddress.getByName yoo yanju orukọ host pẹlu wiwa nẹtiwọki ti o dina.

A kọ loopback nibi, wildcard kii ṣe bẹẹ

Awọn alabara VPN ori tabili maa nfi stub resolver wọn ranṣẹ si 127.0.0.1:53; didakọ eyi sinu profaili Android mu iye kan wa ti o ṣalaye ẹrọ ibilẹ, ati nibẹ ko si ẹrọ ibilẹ. Builder kọ iru ọran yii nikan: adirẹsi null tabi loopback ju IllegalArgumentException.

Wildcard ni ọran idakeji ati nibẹ ni ọpọlọpọ awọn kika ti ṣe aṣiṣe. 0.0.0.0 ati :: kii ṣe loopback, nitorinaa builder gba wọn; a ko ju ohunkohun nigba ikole. Lẹhinna interface dide pẹlu titẹsi ti ko darukọ ibi-afẹde. Mimua eyi jẹ iṣẹ validator rẹ: ka isAnyLocalAddress si igbewọle aitọ.

Ṣayẹwo lẹẹkan ni opin iṣeto

Atunṣe poku ni lati ṣayẹwo nibiti okun naa ti wọ inu awoṣe rẹ:

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

Abajade null di aṣiṣe ipele aaye ti o gbe ọrọ ti o jẹbi, ati pe o jẹ irisi nikan ti atilẹyin le ṣiṣẹ lori. Ni ọna aṣeyọri ohun elo naa wọ taara sinu builder.addDnsServer(address), ki o mu IllegalArgumentException pataki, kii ṣe Exception.

Maṣe rọpo pẹlu resolver gbangba nigbati a kọ iye ti a pinnu; profaili ti o fi DNS gbangba han ni idakẹjẹ yoo sopọ, ṣugbọn awọn orukọ inu yoo dawọ yanju.

Jẹrisi iwọle nigbati interface ba wa

Gbigba builder jẹ aaye ayẹwo akọkọ, kii ṣe eyi ti o kẹhin. Nigbati interface ba dide LinkProperties.getDnsServers() royin ohun ti nẹtiwọki gba gan, ati adb shell dumpsys connectivity tẹ awọn ohun-ini kanna jade lati ita.

Private DNS jẹ iṣakoso lọtọ ati ko kọja ninu ariyanjiyan yii; orukọ host ti olupese DoT jẹ ti eto eto, kii ṣe aaye IP.

Ṣaaju ki o to yi parser profaili pada lẹẹkansi, ṣe igbasilẹ okun aise ati orisun rẹ, jẹrisi pe o jẹ literal kii ṣe orukọ host, pe kii ṣe loopback tabi wildcard, ki o si fi ohun elo ti a ṣayẹwo ranṣẹ.

Àwọn àpilẹ̀kọ tó jọra