标签: networkextension

在iOS应用程序中使用L2TP协议实现VPN

在iOS系统中设置有选择使用,以创建VPN配置IPSec,IKEv2L2TP.使用NetworkExtensionApple的框架,可以选择仅使用IPSecIKEv2协议创建VPN .他们确实工作但问题是我需要创建连接,L2TP因为这只有公司的防火墙支持.

有问题的iOS应用程序从2014年开始使用自定义VPN连接,它的回答是:

如果要在ios 8中以编程方式连接,则只能使用IPSec或IKEv2协议.L2TP和PPTP协议对于apple来说是私有的.在您的应用程序中无法使用L2TP和PPTP API.目前只有Apple使用这些API.

有没有办法从iOS应用程序(Swift)创建L2TP VPN连接?

vpn ios l2tp swift networkextension

19
推荐指数
1
解决办法
2100
查看次数

iPadOS:通过NEHotspotConfiguration连接的网络在一段时间后断开连接

我的应用用来NEHotspotConfigurationManager通过Wi-Fi将自身连接到特定设备。该设备充当WPA2接入点。在较旧的iOS版本(iOS 12及更低版本)中,一切正常,但在iPadOS / iOS 13中,每隔一段时间就会断开设备的连接。如何保持连接而不NEHotspotConfiguration永久存储?

我怀疑它与新功能-多个Windows(我的应用程序不支持)有关。原因是在我的NEHotspotConfiguration我将joinOnce标志设置为true(因为永远不要在应用程序外部使用设备的网络)。苹果的文档指出:

如果joinOnce设置为true,则仅在配置了热点的应用程序在前台运行时,热点才会保持配置和连接。发生以下任何事件时,都会断开热点并删除其配置:

  • 该应用程序在后台停留超过15秒。
  • 设备进入睡眠状态。
  • 该应用程序崩溃,退出或被卸载。
  • 该应用程序将设备连接到其他Wi-Fi网络。

也许我的应用被错误地识别为前景。

设置joinOncefalse可使应用程序保持连接状态,但这不是可接受的解决方案,因为我的设备不提供Internet连接,因此不能在应用程序外部使用。

这是我应用热点配置的方法:

let hotspotConfiguration = NEHotspotConfiguration(ssid: self.ssid, passphrase: self.passphrase, isWEP: false)
hotspotConfiguration.joinOnce = true

NEHotspotConfigurationManager.shared.apply(hotspotConfiguration) { error in
    // connection is successfully applied
    // and about 15 seconds later it is lost.
}
Run Code Online (Sandbox Code Playgroud)

我希望将joinOnce标志设置为时保持连接true

ios swift networkextension ios13 ipados

17
推荐指数
1
解决办法
498
查看次数

NEHotspotConfigurationErrorDomain代码= 8"内部错误."

我使用NEHotspotConfigurationManageriOS 11 iPhone连接到特定Wi-Fi点,然后从中断开连接.

这是代码:

if (@available(iOS 11.0, *)) {
            NEHotspotConfiguration *configuration = [[NEHotspotConfiguration
                                                      alloc] initWithSSID:self.specififcWiFiSSID passphrase:self.specififcWiFiPassword isWEP:NO];
            configuration.joinOnce = YES;
          [[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:^(NSError * _Nullable error) {
            NSLog(@"Error : %@",error.description);
          }];
        } else {
            [Router showOfflineMessage:message];
        }
Run Code Online (Sandbox Code Playgroud)

我使用了applyConfiguration,一切都很好,每次我想应用WiFi配置时,都会出现提示用户连接特定网络的警报,但现在没有任何内容出现,我在completionHanlder中收到此错误:

NEHotspotConfigurationErrorDomain Code=8 "internal error."
Run Code Online (Sandbox Code Playgroud)

我稍后在代码中使用删除配置,但似乎不能正常工作:

[[NEHotspotConfigurationManager sharedManager] removeConfigurationForSSID:self.specififcWiFiSSID];
Run Code Online (Sandbox Code Playgroud)

问题是:发生了什么?为什么它停止提示我加入WiFi网络,这也意味着什么?

更新:似乎这是iOS本身的一个错误,重启设备可以帮助.目前更新后的所有工作.

objective-c ios networkextension

14
推荐指数
2
解决办法
3376
查看次数

如何在iOS 11中使用NEDNSProxyProvider

在网络方面,DNS代理是iOS 11的最大功能之一.但是它们没有提供太多关于它的文档或示例.还有一个关于它的讨论,他们刚刚给出了DNS代理可能的描述.

我想创建一个工作样本,但直到现在才取得成功.因此,我创建了具有DNS代理权利的网络扩展,并添加了DNS代理提供程序.这是代码:

class DNSProxyProvider: NEDNSProxyProvider {
    let defaults = UserDefaults(suiteName: "group.com.securly.dnsProxy")

    override init() {
        NSLog("QNEDNSProxy.Provider: init")
        super.init()
        // +++ might want to set up KVO on `systemDNSSettings`
    }

    override func startProxy(options:[String: Any]? = nil, completionHandler: @escaping (Error?) -> Void) {
        NSLog("QNEDNSProxy.Provider: start")
        // self.defaults?.set("DidStart", forKey: "DidStart")
        completionHandler(nil)
    }

    override func stopProxy(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
        NSLog("QNEDNSProxy.Provider: stop")
        completionHandler()
    }

    override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
        NSLog("QNEDNSProxy.Provider: new flow (denied)")
        // self.defaults?.set("DidHandleNewFlow", …
Run Code Online (Sandbox Code Playgroud)

dns proxy ios networkextension ios11

13
推荐指数
1
解决办法
2536
查看次数

如何使用设备内部VPN设置Packet Tunnel Provider

我正在尝试构建一个iOS应用程序,列出从设备发出的所有请求,就像Charles Proxy这样.很像查尔斯,我的想法是创建一个Packet Tunnel Provider并让它在没有外部VPN服务器的情况下设置本地VPN连接.然后,流量将在内部路由到数据包隧道,而无需外部VPN服务器.

既然如此Charles Proxy,我知道它在技术上是可行的,但我找不到任何有关如何使用内部VPN连接设置隧道的信息,而不是使用"真正的"外部VPN服务器.人们提到的唯一资源是SimpleTunnelApple示例项目,该项目已有几年历史,用Swift 3编写.

我已经下载了SimpleTunnel示例代码项目,创建了正确的权利,现在可以运行项目并创建一个VPN配置,该配置列在Settings下,但我无法连接VPN隧道.我已经尝试将服务器地址更改为127.1.0.0和使用IKEv2,但没有成功.我还在https://github.com/lxdcn/NEPacketTunnelVPNDemo下载了源代码,但也没有让它工作.

有谁知道如何设置内部VPN服务器NetworkExtensions并让隧道使用该连接?

vpn ios networkextension

9
推荐指数
0
解决办法
1421
查看次数

支持网络扩展的应用程序的开发部署

我有一个包含网络扩展的应用程序,当我从XCode中运行它时,它使用我创建的配置文件和正确的权利,并且工作正常,没有问题.

但是,当我归档项目并选择相同的团队时,当我安装并运行该IPA文件时,网络扩展无法启动:

Dec 31 19:00:00 My-iPad Worx Home(NetworkExtension)[38454] <Error>: Failed to save configuration: Error Domain=NEVPNErrorDomain Code=5 "permission denied" UserInfo={NSLocalizedDescription=permission denied}
Run Code Online (Sandbox Code Playgroud)

我很确定这是因为有些东西搞砸了权利.

我回过头来看"导出"过程,它显示的配置文件不是我想要使用的,它是一个说"iOS Team Provio ..."而我无法将其更改为我想要使用的配置文件.

我知道还有其他关于此的帖子(像这样),但是这些解决方案似乎都没有用.特别是,涉及命令行命令的解决方案只接受一个永远不会工作的配置文件,因为我需要选择两个不同的配置文件:一个用于主应用程序,一个用于扩展.

更新:我检查了IPA文件中的embedded.mobileprovision文件,它实际上似乎是用正确的配置文件签名的.所以它可能不是个人档案问题.但如果是这样,为什么我会收到"Permission Denied"错误?

我再次完全清理并确认我看到"com.apple.developer.networking.vpn.api"(allow-vpn)用于生成IPA文件之前显示的列表中的主应用程序和扩展名.

在我收到"权限被拒绝"错误之前,我看到以下隐藏错误:

[My App Name] is not allowed to save provider-based configurations
Run Code Online (Sandbox Code Playgroud)

更新2:我创建了两个企业分发配置文件(之前我曾使用过开发配置文件),当我现在特意进行扩展工作时.

我暂时没有受阻,但是想确定为什么这不起作用,因为它将是有价值的信息,所以留下这个问题.

xcode ios provisioning-profile networkextension ios10

8
推荐指数
0
解决办法
849
查看次数

NEPacketTunnelProvider Sniffer iOS

正如我最近发现这篇论文描述了iOS使用Apple的NEPacketTunnelProvider Extension 的嗅探机制,我很好奇,这让我想从技术角度理解它.由于我通常不在这样的深层网络层工作,所以我无法理解我想要的细节.由于iOS的Charles Proxy必须做一些非常类似的事情而不需要监督设备,我认为2016年提交的论文作者现在可能仍在使用.

作者声称"必须自己实现"IP数据包解析,构建IP数据包或解析DNS响应等所有内容." 因为我想完全理解这一点,我试着自己构建它.我建一个NetworkExtension和该消息循环packetFlowNEPacketTunnelProvider.我能够获取ip数据报并尝试解析它们.我使用相应大小的无符号整数来表示源和目标ip,传输协议和ip版本,但我不确定如何处理有效负载.我的解析器使用ptr.load(fromByteOffset: <offset>, as:<DataType>.self)where ptr是a UnsafeRawPointer来访问数据包流信息.由于data可能超过了存储空间UInt64,我不知道如何以适当的方式访问和存储有效负载.

此外,我认为源IP总是192.168.20.1(设置为我的接口的NEIPv4Settings地址),我的目标IP总是192.168.2.1(我的虚拟NEDNSSettings服务器).这引出了我的第一个问题:这些是DNS查询吗?数据报包是否会声明有关实际目标的任何进一步信息?这是否意味着我必须以某种方式执行对DNS服务器的请求并将数据包重新路由到我将从该DNS查询获得的目标?

下一步是实现TCP/UDP处理,对吧?我目前的解析方法能够区分UDP,TCP并且ICMP(尽管我还没有在最后一个中进行过调查).因此,我会遍历数据报和查找是否需要一个UPDTCP会话/连接并传送数据包.我目前从概念的角度看问题:我如何知道哪个源/目标端口用于TCP/UPD连接/会话?据我所知,这些信息不是IP数据包本身的一部分(因为它是我们在传输层级而不是网络层级上需要的一些信息).

另外,我在github上找到了一个名为Specht的项目.它使用一个名为NEKit的自编写库,它也以某种方式使用该NEPacketTunnelProvider方法.当我正确地理解他们的方法时,他们设法通过编写一些观察者机制以某种方式构建本地代理服务器以处理请求,但由于我对网络和swift相对较新,我不确定我是否完全理解正确或我是否还没有找到所有那些TCP/UDP和/或DNS逻辑.该项目是否与纸张和查尔斯代理的方法相当?

最后一个问题:Charles代理在大多数情况下能够显示目标的主机名.我目前只能看到目标IP地址(这不是真正的目标IP地址,而是我的DNS服务器的地址).我如何才能将主机名视为人类可读文本?查尔斯会做nslookup某种事吗?Charles是否从数据报中获取了这些信息?

我知道这是有很多缺失的知识相当雄心勃勃的我的这个主题,搭建测试的原因类似的东西,但我仍然动机更深入了解的话题,也有一个,我已经明白了一些关键点的感觉,但遗憾的是还不足以解决难题...也许你能够给我一些更多的提示来更好地理解.如果可能有更简单的方法来存档类似的行为(在主机名级别上查看传出连接),我也会对这些感兴趣:-)

datagram sniffing ios swift networkextension

7
推荐指数
1
解决办法
634
查看次数

调试网络扩展

我在我的应用程序中添加了 NEPacketTunnelProvider 扩展来连接 openvpn,但连接状态已断开,没有任何错误。现在我想使用断点调试扩展,但我的断点没有在扩展中调用,我已经在谷歌上做了很多研发但没有成功。

    self.providerManager.loadFromPreferences(completionHandler: { (error) in
        guard error == nil else {
            // Handle an occured error
            print(error)
            return
        }

        do {
            try self.providerManager.connection.startVPNTunnel()
        } catch {
            // Handle an occured error
            print(error)
        }
    })
Run Code Online (Sandbox Code Playgroud)

debugging ios swift networkextension

6
推荐指数
0
解决办法
800
查看次数

如何让 iOS/macOS 在其 NetworkExtension 运行时更新我们的应用程序?

我们有一个应用程序可以在 iOS 和 macOS 上注册并运行 NetworkExtension(特别是 NEPacketTunnelProvider)。这工作正常(虽然不是在 iOS 模拟器中,当然,已知限制)。但是,当网络扩展运行时,macOS/iOS 上的 App Store 和 iOS 上的 TestFlight 无法更新应用程序。看起来他们正在等待 NetworkExtension 终止,但实际上并未要求 VPN 断开连接。

我们不希望我们的用户不得不考虑关闭我们的 VPN(它应该尽可能保持连接),但我们也不希望他们必须考虑更新 - 它们应该自动发生。

我们错过了什么吗?是否有我们应该监听的事件以检测商店是否正在尝试安装应用程序更新?我们应该安排VPN终止的条件,知道它会在更新后再次重新启动是安全的吗?

macos ios networkextension

6
推荐指数
1
解决办法
407
查看次数

具有本地设备上服务器的 iOS 数据包隧道提供商

我正在使用 Apple 提供的网络扩展框架来构建类似于 iOS 版 Charles Proxy 和 Surge 4 的数据包嗅探/监控应用程序。

到目前为止,我已经启动并运行了项目的基本结构,主应用程序触发了 PacketTunnelProvider 扩展,我可以在其中看到通过 packetFlow.readPackets(completionHandler:) 方法转发的数据包。我的背景不是网络,所以我对此类应用程序的基本结构感到困惑。他们是否在设备上托管服务器来充当拦截网络请求的代理?谁能提供网络请求的一般流程的图表?即数据包隧道提供商、代理服务器、虚拟接口和隧道之间的关系是什么?

如果这些应用程序确实使用本地设备上服务器,您如何配置 NEPacketTunnelNetworkSettings 以允许连接?我尝试合并本地设备上服务器(例如GCDWebServer),但未能在两者之间建立链接。

例如,如果可以通过192.168.1.231:8080访问 GCDWebServer ,我将如何更改下面的代码以使客户端与服务器通信?

主要应用程序:

    let proxyServer = NEProxyServer(address: "192.168.1.231", port: 8080)
    
    let proxySettings = NEProxySettings()
    proxySettings.exceptionList = []
    proxySettings.httpEnabled = true
    proxySettings.httpServer = proxyServer
    
    let providerProtocol = NETunnelProviderProtocol()
    providerProtocol.providerBundleIdentifier = self.tunnelBundleId
    providerProtocol.serverAddress = "My Server"
    providerProtocol.providerConfiguration = [:]
    providerProtocol.proxySettings = proxySettings
    
    let newManager = NETunnelProviderManager()
    newManager.localizedDescription = "Custom VPN"
    newManager.protocolConfiguration = providerProtocol
    newManager.isEnabled = true
    saveLoadManager()
    self.vpnManager …
Run Code Online (Sandbox Code Playgroud)

proxy packet-sniffers ios swift networkextension

6
推荐指数
1
解决办法
5242
查看次数