NETunnelProvider 停止在 iOS 14 上接收数据包?
Posted
技术标签:
【中文标题】NETunnelProvider 停止在 iOS 14 上接收数据包?【英文标题】:NETunnelProvider stop receiving packet on iOS 14? 【发布时间】:2021-01-27 21:41:55 【问题描述】:我有一个使用“NETunnelProvider
/NetworkExtentsion
”的Local
***
应用程序,在我的解决方案中,我在设备本身上创建了一个拆分隧道来跟踪DNS请求,使用NEKit
我能够窥视数据包内部并根据目标地址(let's call ita UDP listener for DNS requests).
过滤正在进行的请求
此解决方案在 ios 13.7 及更低版本上运行良好,最近苹果发布了iOS 14
,我的解决方案停止工作,***
连接仍然建立但用户无法访问任何网站,我调试了代码并发现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 请检查我的更新 【参考方案1】:我有一个想法,也许可以为您提供解决方案。从 iOS 版本 14 开始,C 函数 connect() 在必须运行 *** 的网络扩展中开始失败,内核的日志消息如下:
Sandbox: *** Extensio(8335) deny(1) network-outbound*:<port #>
但是,它确实可以在应用程序中使用,如果您在扩展程序中需要它,它几乎没用。 GCDAsyncUdpSocket 是一个薄层,在底层调用 socket() 和 connect()。
NWConnection 确实在网络扩展中工作,如果可以移植您的代码并且您不需要实际的套接字描述符,它应该适合您。但是如果你必须支持设备
【讨论】:
我忘了包括这个只有在设备有公共 IP 地址时才会发生。也就是说,wifi被禁用或未连接到wifi网络。如果设备在 wifi 上,则没有问题。以上是关于NETunnelProvider 停止在 iOS 14 上接收数据包?的主要内容,如果未能解决你的问题,请参考以下文章