ios - 如何在受监督的 iOS 设备上使用 NEDNSProxyProvider 将 DNS 数据包发送到自定义 DNS 服务器
问题描述
我正在尝试使用NEDNSProxyProvider
in Network Extension 为受监督设备上的所有网络调用设置自定义 DNS 服务器。我已经能够监控网络调用并能够在该handleNewFlow(_ flow: NEAppProxyFlow)
方法中接收数据包,但我不确定如何将数据包发送到我的自定义 DNS 服务器以解决它们
目前我的 NEDNSProxyProvider 类是这样设置的:
import NetworkExtension
class DNSProxyProvider: NEDNSProxyProvider {
private var proxyFlow: NEAppProxyUDPFlow?
override func startProxy(options:[String: Any]? = nil, completionHandler: @escaping (Error?) -> Void) {
NSLog("DNSProxyProvider: startProxy")
completionHandler(nil)
}
override func stopProxy(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
NSLog("DNSProxyProvider: stopProxy")
completionHandler()
}
override func sleep(completionHandler: @escaping () -> Void) {
NSLog("DNSProxyProvider: sleep")
completionHandler()
}
override func wake() {
NSLog("DNSProxyProvider: wake")
}
override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
NSLog("DNSProxyProvider: handleFlow")
if let udpFlow = flow as? NEAppProxyUDPFlow {
let localHost = (udpFlow.localEndpoint as! NWHostEndpoint).hostname
let localPort = (udpFlow.localEndpoint as! NWHostEndpoint).port
NSLog("DNSProxyProvider UDP HOST : \(localHost)")
NSLog("DNSProxyProvider UDP PORT : \(localPort)")
proxyFlow = udpFlow
open()
}
return true
}
private func open() {
guard let flow = proxyFlow else { return }
guard let endPoint = flow.localEndpoint as? NWHostEndpoint else { return }
flow.open(withLocalEndpoint: endPoint) { (error) in
if (error != nil) {
NSLog("DNSProxyProvider UDP Open flow Error : \(error.debugDescription)")
} else {
NSLog("DNSProxyProvider UDP Open flow Success")
self.handleData()
}
}
}
private func handleData() {
proxyFlow?.readDatagrams(completionHandler: { (data, endpoint, error) in
if let error = error {
NSLog("DNSProxyProvider UDP read data Error : \(error.localizedDescription)")
return
}
// modify EDNS
// Send data to custom DNS server to resolve
// Write the response back to flow
})
}
}
我应该NWConnection
为此使用课程吗?或者有没有其他方法可以使用?
解决方案
推荐阅读
- javascript - 纯 js 代码在 Firefox 中有效,但在 Chrome 中无效
- jquery - 等到用户点击一个 span 然后触发 AJAX 请求
- r - 如何避免 flexdashboard 容器中的表格(数据表)被附加文本截断?
- html - Chrome 审核:表单元素没有关联的标签
- javascript - Puppeteer 数组仅返回 null
- regex - 逐行读取特定数据
- web-scraping - 在 Airflow 中使用已经设置好的网络抓取工具?
- reactjs - 从另一个 React 脚本导入的类中访问变量
- flask - 如何使用 Flask 从数据库数据中填充 HTML 字段
- r - ggplot 时间刻度中断:scale_*_time