Dokumen ini menjelaskan cara mengintegrasikan dan mengembangkan solusi DNS terenkripsi native di iOS 14.
Ikhtisar
Resolusi DNS merupakan langkah pertama dalam mengakses sumber daya jaringan. Mulai dari iOS 14, sistem secara asli mendukung dua protokol DNS terenkripsi standar: DNS over TLS (DoT) dan DNS over HTTPS (DoH). Protokol ini menangani dua masalah utama:
Pertama, kueri dan tanggapan Local DNS tradisional berbasis UDP tidak terenkripsi, sehingga rentan terhadap pembajakan DNS.
Kedua, server DNS lokal mungkin tidak dapat dipercaya atau layanan DNS lokal tidak tersedia.
Untuk mengatasi masalah tersebut, HTTPDNS menyediakan solusi yang menggunakan kit pengembangan perangkat lunak (SDK) HTTPDNS. Namun, penggunaan SDK ini menimbulkan tantangan teknis, seperti menangani koneksi IP langsung dalam skenario pengalihan 302 dan masalah Indikasi Nama Server (SNI) pada iOS. Fitur DNS Terenkripsi di iOS 14 secara efektif mengatasi masalah yang terkait dengan solusi integrasi SDK. Contoh berikut menunjukkan cara mengatur HTTPDNS sebagai resolver DNS terenkripsi default.
Solusi DNS terenkripsi asli iOS 14 hanya didukung pada perangkat fisik yang menjalankan iOS 14 atau lebih baru.
Untuk memastikan aplikasi Anda berfungsi sesuai harapan, implementasikan mekanisme fallback ke Local DNS guna mencegah kegagalan resolusi nama domain akibat pengecualian layanan DoH atau DoT.
Berbeda dengan solusi integrasi SDK, solusi asli tidak mendukung failover otomatis atau Service-Level Agreement (SLA). Jika menggunakan solusi asli untuk bisnis Anda, implementasikan kode untuk pemantauan pengecualian layanan dan failover otomatis ke DNS lokal perangkat untuk resolusi nama domain.
Cara mengintegrasikan HTTPDNS dengan solusi DNS terenkripsi native iOS 14
iOS 14 menyediakan dua metode untuk menyiapkan DNS terenkripsi.
Aktifkan DNS terenkripsi untuk semua koneksi dari satu aplikasi.
Untuk menggunakan DNS terenkripsi hanya pada aplikasi Anda tanpa memengaruhi seluruh perangkat, sesuaikan nw_privacy_context_t dari NetworkExtension untuk mengaktifkan DNS terenkripsi pada aplikasi tersebut. Setiap resolusi DNS yang dimulai dalam aplikasi akan menggunakan konfigurasi ini. Sebagai referensi, kami menyediakan demo yang mengaktifkan DoH untuk semua koneksi dari satu aplikasi.
Contoh kode untuk menggunakan DNS terenkripsi di tingkat aplikasi dengan protokol DoH:
#import <NetworkExtension/NetworkExtension.h>
if (@available(iOS 14.0, *)){
nw_privacy_context_t defaultPrivacyContext = NW_DEFAULT_PRIVACY_CONTEXT;
nw_endpoint_t dohResolverEndpoint = nw_endpoint_create_url("https://*****-************.alidns.com/dns-query");//Alamat terenkripsi DoH
nw_endpoint_t v4ResolverEndpoint1 = nw_endpoint_create_host("223.5.5.5", "443");
nw_endpoint_t v4ResolverEndpoint2 = nw_endpoint_create_host("223.6.6.6", "443");
nw_endpoint_t v6ResolverEndpoint1 = nw_endpoint_create_host("2400:3200::1", "443");
nw_endpoint_t v6ResolverEndpoint2 = nw_endpoint_create_host("2400:3200:baba::1", "443");
nw_resolver_config_t fallbackResolvers = nw_resolver_config_create_https(dohResolverEndpoint);
nw_resolver_config_add_server_address(fallbackResolvers, v4ResolverEndpoint1);
nw_resolver_config_add_server_address(fallbackResolvers, v4ResolverEndpoint2);
nw_resolver_config_add_server_address(fallbackResolvers, v6ResolverEndpoint1);
nw_resolver_config_add_server_address(fallbackResolvers, v6ResolverEndpoint2);
nw_privacy_context_require_encrypted_name_resolution(defaultPrivacyContext, true, fallbackResolvers);
}Contoh kode untuk menggunakan DNS terenkripsi di tingkat aplikasi dengan protokol DoT:
#import <NetworkExtension/NetworkExtension.h>
if (@available(iOS 14.0, *)){
nw_privacy_context_t defaultPrivacyContext = NW_DEFAULT_PRIVACY_CONTEXT;
nw_endpoint_t dotResolverEndpoint = nw_endpoint_create_host("******-************.alidns.com", "853");//Alamat terenkripsi DoT
nw_endpoint_t v4ResolverEndpoint1 = nw_endpoint_create_host("223.5.5.5", "853");
nw_endpoint_t v4ResolverEndpoint2 = nw_endpoint_create_host("223.6.6.6", "853");
nw_endpoint_t v6ResolverEndpoint1 = nw_endpoint_create_host("2400:3200::1", "853");
nw_endpoint_t v6ResolverEndpoint2 = nw_endpoint_create_host("2400:3200:baba::1", "853");
nw_resolver_config_t fallbackResolvers = nw_resolver_config_create_tls(dotResolverEndpoint);
nw_resolver_config_add_server_address(fallbackResolvers, v4ResolverEndpoint1);
nw_resolver_config_add_server_address(fallbackResolvers, v4ResolverEndpoint2);
nw_resolver_config_add_server_address(fallbackResolvers, v6ResolverEndpoint1);
nw_resolver_config_add_server_address(fallbackResolvers, v6ResolverEndpoint2);
nw_privacy_context_require_encrypted_name_resolution(defaultPrivacyContext, true, fallbackResolvers);
}Kode berikut menunjukkan cara mengimplementasikan mekanisme fallback ke Local DNS. Anda dapat memperoleh NSURLSessionTaskTransactionMetrics melalui URLSessionDelegate dan menonaktifkan DoH atau DoT setelah permintaan gagal.
#pragma mark URLSession Delegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics {
if ([metrics.transactionMetrics count] <= 0) return;
[metrics.transactionMetrics enumerateObjectsUsingBlock:^(NSURLSessionTaskTransactionMetrics *_Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
if (obj.resourceFetchType == NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad) {
if (@available(iOS 14.0, *)) {
NSURLSessionTaskMetricsDomainResolutionProtocol dnsProtocol = obj.domainResolutionProtocol;
NSLog(@"%@",[NSString stringWithFormat:@"Jenis DNS adalah %ld", (long)dnsProtocol]);
NSLog(@"%@",[NSString stringWithFormat:@"0:Tidak Dikenal,1:UDP,2:TCP,3:TLS,4:HTTPS"]);
if (dnsProtocol == NSURLSessionTaskMetricsDomainResolutionProtocolUnknown) {
NSLog(@"%@",[NSString stringWithFormat:@"Sumber DNS tidak dikenal, menonaktifkan DoH"]);
nw_privacy_context_require_encrypted_name_resolution(NW_DEFAULT_PRIVACY_CONTEXT, false, nil);
}
}
}
}];
}Aktifkan DNS terenkripsi untuk semua aplikasi di perangkat.
Jika ingin menggunakan DNS terenkripsi di seluruh sistem, buat aplikasi NetworkExtension yang menggunakan API NEDNSSettingsManager untuk mengonfigurasi pengaturan DNS terenkripsi di tingkat sistem.
Contoh kode untuk menyetel server DNS di seluruh sistem melalui NetworkExtension menggunakan protokol DoH:
import NetworkExtension
NEDNSSettingsManager.shared().loadFromPreferences { loadError in
if let loadError = loadError {
// ...tangani kesalahan...
return
}
let dohSettings = NEDNSOverHTTPSSettings(servers: ["223.5.5.5","223.6.6.6","2400:3200:baba::1","2400:3200::1"])
dohSettings.serverURL = URL(string: "https://*****-************.alidns.com/dns-query")//Alamat terenkripsi DoH
NEDNSSettingsManager.shared().dnsSettings = dohSettings
NEDNSSettingsManager.shared().saveToPreferences { saveError in
if let saveError = saveError {
// ...tangani kesalahan...
return
}
}
}
Contoh kode untuk menyetel server DNS di seluruh sistem melalui NetworkExtension menggunakan protokol DoT:
import NetworkExtension
NEDNSSettingsManager.shared().loadFromPreferences { loadError in
if let loadError = loadError {
// ...tangani kesalahan...
return
}
let dotSettings = NEDNSOverTLSSettings(servers: ["223.5.5.5","223.6.6.6","2400:3200:baba::1","2400:3200::1"])
dotSettings.serverName = "******-************.alidns.com"//Alamat terenkripsi DoT
NEDNSSettingsManager.shared().dnsSettings = dotSettings
NEDNSSettingsManager.shared().saveToPreferences { saveError in
if let saveError = saveError {
// ...tangani kesalahan...
return
}
}
}Konfigurasi DNS mencakup alamat server HTTPDNS, protokol DoT atau DoH, serta seperangkat aturan jaringan. Aturan jaringan ini memastikan bahwa pengaturan DNS kompatibel dengan berbagai jenis jaringan.
Contoh kode untuk konfigurasi aturan jaringan:
let workWiFi = NEOnDemandRuleEvaluateConnection()
workWiFi.interfaceTypeMatch = .wiFi
workWiFi.ssidMatch = ["MyWorkWiFi"]
workWiFi.connectionRules = [NEEvaluateConnectionRule(matchDomains: ["enterprise.example"], andAction: .neverConnect)]
let disableOnCell = NEOnDemandRuleDisconnect()
disableOnCell.interfaceTypeMatch = .cellular
let enableByDefault = NEOnDemandRuleConnect()
NEDNSSettingsManager.shared().onDemandRules = [
workWiFi,
disableOnCell,
enableByDefault
]Kode di atas menetapkan tiga aturan jaringan. Aturan pertama menentukan bahwa konfigurasi DNS berlaku pada jaringan Wi-Fi dengan SSID "MyWorkWiFi", tetapi dinonaktifkan untuk nama domain perusahaan pribadi enterprise.example.net. Aturan kedua menonaktifkan konfigurasi pada jaringan seluler. Aturan ketiga, NEOnDemandRuleConnect, mengaktifkan konfigurasi DNS secara default. Karena konfigurasi DNS didukung oleh sistem, Anda tidak perlu mengimplementasikan program ekstensi saat membuat aplikasi NetworkExtension. Cukup pilih opsi Pengaturan DNS di Ekstensi Jaringan.

Setelah menjalankan aplikasi NetworkExtension, konfigurasi DNS akan diinstal pada sistem. Untuk mengaktifkannya, navigasikan ke Pengaturan -> Umum -> VPN & Jaringan -> DNS dan aktifkan secara manual.
