在没有代理的情况下使用 NEPacketTunnelProvider 读取数据包

2024-01-29

我想检查数据包NEPacketTunnelProvider https://developer.apple.com/documentation/networkextension/nepackettunnelprovider没有指定的代理。不幸的是我的读取数据包对象 https://developer.apple.com/documentation/networkextension/nepackettunnelflow/2118343-readpacketobjects完成处理程序从未被调用,我不明白为什么。我的常规互联网连接停止了,Wireshark 在新界面上显然没有显示任何内容,而且我在 en0 上也没有看到任何 HTTP 连接。

这可能吗?苹果开发者论坛 https://forums.developer.apple.com/thread/76707表明它可能不是......但 iOS 版的 Charles Proxy 似乎能够检查一切。

我的代码如下:

class TunnelProvider: NEPacketTunnelProvider {
override func startTunnel(options: [String : NSObject]? = nil, completionHandler: @escaping (Error?) -> Void) {
    os_log("starting tunnel")

    let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "127.0.0.1")

    settings.tunnelOverheadBytes = 80
    settings.mtu = 1200

    settings.ipv4Settings = NEIPv4Settings(addresses: ["127.0.0.1", "0.0.0.0"], subnetMasks: ["0.0.0.0", "0.0.0.0"]) // all addresses
    settings.ipv4Settings?.includedRoutes = [NEIPv4Route.default()] // all routes
    settings.ipv4Settings?.excludedRoutes = [NEIPv4Route(destinationAddress: "127.0.0.1", subnetMask: "255.255.255.255")] // avoid local routes

    settings.dnsSettings = NEDNSSettings(servers: ["1.1.1.1", "8.8.8.8", "8.8.4.4"])
    settings.dnsSettings?.matchDomains = [""] // if blank don't use this DNS, use system; if "" then use this

    NSLog("default/included route %@:%@", NEIPv4Route.default().destinationAddress, NEIPv4Route.default().destinationSubnetMask)

    self.setTunnelNetworkSettings(settings) { error in
        if let e = error {
            NSLog("Settings error %@", e.localizedDescription)
            completionHandler(e)
        } else {
            os_log("Settings set without error")

            completionHandler(nil)
        }
    }

    self.readPacketObjects()
}

private func readPacketObjects() {
    NSLog("Inside readPacketObjects %@", self.packetFlow)
    self.packetFlow.readPacketObjects() { packets in
        NSLog("Inside readPacketObjects completionHandler %@", packets)

        self.packetFlow.writePacketObjects(packets)

        self.readPacketObjects()
    }
}

控制台输出

default 10:31:03.177424 -0400   tunnel  starting tunnel
default 10:31:03.177796 -0400   tunnel  default/included route 0.0.0.0:0.0.0.0
default 10:31:03.178602 -0400   tunnel  Inside readPacketObjects <NEPacketTunnelFlow: 0x7f9a69d135e0>
default 10:31:03.356006 -0400   tunnel  Settings set without error

Edit 1
修改后可以读取数据包settings.ipv4Settings到具有更具体子网掩码的本地地址。然而互联网连接仍然中断route get输出错误地址。

Edit 2
我能够通过将 DNS 服务器添加到排除的路由来使 DNS 工作,如图所示here https://forums.developer.apple.com/thread/78622。不加修改地写入 packetFlow 仍然无法启用完整路由。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有代理的情况下使用 NEPacketTunnelProvider 读取数据包 的相关文章

随机推荐