MacOS VPN 网络扩展启动失败

问题描述 投票:0回答:0

我正在尝试创建一个 MacOS VPN 网络扩展。它通过这个使用Wireguard

我的问题是我实际上似乎无法获得连接到 VPN 的扩展 - 我根本无法切换它:

这些是我得到的日志:

客户端应用程序的 Bundle ID:

网络扩展的 Bundle ID:

代码如下;我的全局变量(隐藏了一些值,但已验证它们是我尝试连接的 VPN 的正确值):

var serverAddress: String = //
var serverPublicKey: String = //
var serverPort: String = //
private let appGroup = "6QDK6789A6.group.com.meter.MeterTunnel"
private let tunnelIdentifier = "com.meter.MeterTunnel.Tunnel"

var vpn = NetworkExtensionVPN()
var vpnStatus: VPNStatus = .disconnected

用于设置和连接到 VPN 的代码(这是从 UI 事件中调用的):

 func connectToVPN() async {
        guard let cfg = WireGuard.Configuration.make(
            "Meter VPN",
            appGroup: appGroup,
            clientPrivateKey: clientPrivateKey,
            clientAddress: clientAddress,
            serverPublicKey: serverPublicKey,
            serverAddress: serverAddress,
            serverPort: serverPort
        ) else {
            print("Configuration incomplete")
            return
        }

        Task {
            do {
                try await vpn.reconnect(
                    tunnelIdentifier,
                    configuration: cfg,
                    extra: nil,
                    after: .seconds(2)
                )
                print("VPN connection started successfully")
            } catch {
                print("Failed to connect to VPN: \(error.localizedDescription)")
                if let neError = error as? NEVPNError {
                    print("NEVPNError code: \(neError.code.rawValue)")
                }
            }
        }

        print("ERROR: \(String(describing: cfg.lastError))")
    }

    func disconnectFromVPN() {
        Task {
            await vpn.disconnect()
        }
    }
    
    @objc private func VPNStatusDidChange(notification: Notification) {
        vpnStatus = notification.vpnStatus
        print("VPNStatusDidChange: \(vpnStatus)")
    }

    @objc private func VPNDidFail(notification: Notification) {
        print("VPNStatusDidFail: \(notification.vpnError.localizedDescription)")
    }
    
    @objc private func VPNDidReinstall(notification: Notification) {
        print("VPNStatusDidReinstall")
    }

状态观察者代码设置在

applicationDidFinishLaunching

 NotificationCenter.default.addObserver(
                  self,
                  selector: #selector(VPNStatusDidChange(notification:)),
                  name: VPNNotification.didChangeStatus,
                  object: nil
        )
             
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(VPNDidFail(notification:)),
            name: VPNNotification.didFail,
            object: nil
        )

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(VPNDidReinstall(notification:)),
            name: VPNNotification.didReinstall,
            object: nil
        )

配置代码:

extension WireGuard {
    struct Configuration {
        static func make(
            _ title: String,
            appGroup: String,
            clientPrivateKey: String,
            clientAddress: String,
            serverPublicKey: String,
            serverAddress: String,
            serverPort: String
        ) -> WireGuard.ProviderConfiguration? {
            do {
                var builder = try WireGuard.ConfigurationBuilder(clientPrivateKey)
                builder.addresses = [clientAddress]
                try builder.addPeer(serverPublicKey, endpoint: "\(serverAddress):\(serverPort)", allowedIPs: ["10.0.0.0/8", "224.0.0.0/4"])
                builder.setKeepAlive(30, forPeer: 0)
                let cfg = builder.build()

                return WireGuard.ProviderConfiguration(title, appGroup: appGroup, configuration: cfg)
            } catch {
                print("Error creating WireGuard configuration: \(error)")
                return nil
            }
        }
    }
}
swift macos vpn wireguard networkextension
© www.soinside.com 2019 - 2024. All rights reserved.