gpt4 book ai didi

swift - NETunnelProvider 在 iOS 14 上停止接收数据包?

转载 作者:行者123 更新时间:2023-12-04 12:02:29 24 4
gpt4 key购买 nike

我有一个 Local VPN 应用程序,它使用“NETunnelProvider/NetworkExtentsion ”,在我的解决方案中,我在设备本身上创建了一个拆分隧道来跟踪 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 浏览器上不加载网站并继续加载直到显示超时。
enter image description here

最佳答案

我有一个想法,也许可以为您提供解决方案。从 iOS 版本 14 开始,C 函数 connect() 开始在网络扩展中失败,其中 VPN 必须运行,内核中出现以下日志消息:

Sandbox: VPN Extensio(8335) deny(1) network-outbound*:<port #>
但是,它确实可以在应用程序中使用,如果您在扩展程序中需要它,它几乎没用。 GCDAsyncUdpSocket 是一个很薄的层,它正在调用 socket() 和 connect()。
NWConnection 确实在网络扩展中工作,如果可以移植您的代码并且您不需要实际的套接字描述符,它应该适合您。但是,如果您必须支持设备 < ios 12,则必须有条件地进行编译。

关于swift - NETunnelProvider 在 iOS 14 上停止接收数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64337119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com