【发布时间】:2021-01-27 21:41:55
【问题描述】:
我有一个使用“NETunnelProvider/NetworkExtentsion”的LocalVPN应用程序,在我的解决方案中,我在设备本身上创建了一个拆分隧道来跟踪DNS请求,使用NEKit我能够窥视数据包内部并根据目标地址(let's call ita UDP listener for DNS requests).过滤正在进行的请求
此解决方案在 iOS 13.7 及更低版本上运行良好,最近苹果发布了iOS 14,我的解决方案停止工作,VPN 连接仍然建立但用户无法访问任何网站,我调试了代码并发现networkExtision 仅从用户活动中接收不到任何 packets。
我正在使用CocoaAsyncSocket 库。
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
let host = GCDAsyncUdpSocket.host(fromAddress: address)
guard let message = DNSMessage(payload: data) else {
return
}
guard let session = pendingSession.removeValue(forKey: message.transactionID) else {
return
}
session.realResponseMessage = message
session.realIP = message.resolvedIPv4Address
let domain = session.requestMessage.queries[0].name
let udpParser = UDPProtocolParser()
udpParser.sourcePort = Port(port: dnsServerPort)
udpParser.destinationPort = (session.requestIPPacket!.protocolParser as! UDPProtocolParser).sourcePort
udpParser.payload = session.realResponseMessage!.payload
let ipPacket = IPPacket()
ipPacket.sourceAddress = IPAddress(fromString: dnsServerAddress)
ipPacket.destinationAddress = session.requestIPPacket!.sourceAddress
ipPacket.protocolParser = udpParser
ipPacket.transportProtocol = .udp
ipPacket.buildPacket()
packetFlow.writePackets([ipPacket.packetData], withProtocols: [NSNumber(value: AF_INET as Int32)])
}
let dummyTunnelAddress = "127.0.0.1"
let dnsServerAddress = "8.8.4.4"
let dnsServerPort: UInt16 = 53
// Tunnel confg.
let tunnelAddress = "192.168.0.1"
let tunnelSubnetMask = "255.255.255.0"
关于触发“本地网络权限”这不是这里的问题(我认为我的解决方案不需要这个权限),基于苹果文档一些应用程序需要请求本地网络权限,我添加了权限info.plist 但未触发本地网络权限。
=========================== 更新#1 =============================
我发现我能够捕获数据包并做自己的事情,然后将数据包写回 packetFlow packetFlow.writePackets,但在 iOS 14 浏览器上不加载网站并继续加载直到显示超时。
【问题讨论】:
-
您激活了哪些权利?您是否包括了 com.apple.developer.networking.multicast?
-
@Asperi 不,但真正的问题在这里,我需要吗?我的解决方案是否考虑了我需要触发本地网络权限的情况之一?
-
@Asperi 据我所知,当我发送/接收 UDP 多播/广播时,我需要启用/包含networking.multicast,但我的解决方案是否考虑其中之一?我不这么认为
-
@Asperi 请检查我的更新
标签: swift networking udp ios14 networkextension