diff --git a/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift b/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift index 47d5405..8f83a63 100644 --- a/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift +++ b/TunnelKit/Sources/AppExtension/TunnelKitProvider.swift @@ -535,8 +535,14 @@ extension TunnelKitProvider: SessionProxyDelegate { ipv6Settings?.excludedRoutes = [] } - let dnsSettings = NEDNSSettings(servers: cfg.sessionConfiguration.dnsServers ?? reply.options.dnsServers) - + let dnsServers = cfg.sessionConfiguration.dnsServers ?? reply.options.dnsServers + let searchDomain = cfg.sessionConfiguration.searchDomain ?? reply.options.searchDomain + let dnsSettings = NEDNSSettings(servers: dnsServers) + dnsSettings.domainName = searchDomain + if let searchDomain = searchDomain { + dnsSettings.searchDomains = [searchDomain] + } + let newSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: remoteAddress) newSettings.ipv4Settings = ipv4Settings newSettings.ipv6Settings = ipv6Settings diff --git a/TunnelKit/Sources/Core/OptionsBundle.swift b/TunnelKit/Sources/Core/OptionsBundle.swift index 7e28626..c0bb447 100644 --- a/TunnelKit/Sources/Core/OptionsBundle.swift +++ b/TunnelKit/Sources/Core/OptionsBundle.swift @@ -87,6 +87,8 @@ public struct OptionsBundle { static let dns = NSRegularExpression("^dhcp-option +DNS6? +[\\d\\.a-fA-F:]+") + static let domain = NSRegularExpression("^dhcp-option +DOMAIN +[^ ]+") + // MARK: Unsupported // static let fragment = NSRegularExpression("^fragment +\\d+") @@ -181,6 +183,9 @@ public struct OptionsBundle { /// The DNS servers. public let dnsServers: [String] + /// The search domain. + public let searchDomain: String? + /** Parses options from an array of lines. @@ -225,6 +230,7 @@ public struct OptionsBundle { var optRoutes4: [(String, String, String?)] = [] // address, netmask, gateway var optRoutes6: [(String, UInt8, String?)] = [] // destination, prefix, gateway var optDNSServers: [String] = [] + var optSearchDomain: String? log.verbose("Configuration file:") for line in lines { @@ -495,6 +501,12 @@ public struct OptionsBundle { } optDNSServers.append($0[1]) } + Regex.domain.enumerateArguments(in: line) { + guard $0.count == 2 else { + return + } + optSearchDomain = $0[1] + } // @@ -654,6 +666,7 @@ public struct OptionsBundle { } dnsServers = optDNSServers + searchDomain = optSearchDomain } private static func normalizeEncryptedPEMBlock(block: inout [String]) { diff --git a/TunnelKitTests/OptionsBundleTests.swift b/TunnelKitTests/OptionsBundleTests.swift index c9852af..66af67d 100644 --- a/TunnelKitTests/OptionsBundleTests.swift +++ b/TunnelKitTests/OptionsBundleTests.swift @@ -51,11 +51,12 @@ class OptionsBundleTests: XCTestCase { } func testDHCPOption() throws { - let lines = base + ["dhcp-option DNS 8.8.8.8", "dhcp-option DNS6 ffff::1"] + let lines = base + ["dhcp-option DNS 8.8.8.8", "dhcp-option DNS6 ffff::1", "dhcp-option DOMAIN example.com"] XCTAssertNoThrow(try OptionsBundle(from: lines)) let parsed = try! OptionsBundle(from: lines) XCTAssertEqual(parsed.dnsServers, ["8.8.8.8", "ffff::1"]) + XCTAssertEqual(parsed.searchDomain, "example.com") } func testConnectionBlock() throws {