【问题标题】:Reverse DNS lookup inside a network extension在网络扩展内反向 DNS 查找
【发布时间】:2020-05-11 07:21:43
【问题描述】:
我正在 macOS 上使用 NetworkExtension 框架编写内容过滤器。 (NEFilterDataProvider)。
在这段代码中,我可以看到使用的 IP 地址。如何有效地从这些 IP 获取域名?
理想情况下,有一种方法可以使用 swift(或 Objective-c 框架)来完成,这样我就可以轻松完成。如果没有,如何访问 macOS 上的 dns 缓存?
【问题讨论】:
标签:
objective-c
swift
network-programming
macos-catalina
【解决方案1】:
Apple 对此available here 和some sample code 有非常详细的文档。
基本步骤是:
使用 CFHost 解析主机:
- 通过调用 CFHostCreateWithAddress 创建一个 CFHostRef 对象。
- 调用 CFHostSetClient 并提供您选择的上下文对象以及解析完成时将调用的回调函数。
- 调用 CFHostScheduleWithRunLoop 以在运行循环中安排解析器。
- 调用 CFHostStartInfoResolution 告诉解析器开始解析,传递 kCFHostNames 作为第二个参数来表明您希望它返回主机名。
- 等待解析器调用您的回调。在您的回调中,通过调用 CFHostGetNames 获取结果。此函数返回一个 CFDataRef 对象数组,每个对象都包含一个 POSIX sockaddr 结构。
开始这个过程的主要部分是这样的,来自 Apple 的示例代码。 self.host 是您从地址创建的 CFHost:
func start() {
precondition(self.targetRunLoop == nil)
self.targetRunLoop = RunLoop.current
var context = CFHostClientContext()
context.info = Unmanaged.passRetained(self).toOpaque()
var success = CFHostSetClient(self.host, { (_ host: CFHost, _: CFHostInfoType, _ streamErrorPtr: UnsafePointer<CFStreamError>?, _ info: UnsafeMutableRawPointer?) in
let obj = Unmanaged<HostNameQuery>.fromOpaque(info!).takeUnretainedValue()
if let streamError = streamErrorPtr?.pointee, (streamError.domain != 0 || streamError.error != 0) {
obj.stop(streamError: streamError, notify: true)
} else {
obj.stop(streamError: nil, notify: true)
}
}, &context)
assert(success)
CFHostScheduleWithRunLoop(self.host, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)
var streamError = CFStreamError()
success = CFHostStartInfoResolution(self.host, .names, &streamError)
if !success {
self.stop(streamError: streamError, notify: true)
}
}