From 3b2ae2050f85694fb21eea7ad4a9b2a0c8c8724f Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 14 May 2025 19:59:39 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=9F=9F=E5=90=8D=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Info.plist | 6 ++++ Tun/PacketTunnelProvider.swift | 7 ++-- punchnet/Core/DNSResolver.swift | 55 ++++++++++++++++++++++++++++++ punchnet/Core/PunchnetConfig.swift | 24 +++++++++++++ punchnet/VPNManager.swift | 8 +++-- punchnet/punchnet.entitlements | 49 +++++++++++++------------- 6 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 punchnet/Core/DNSResolver.swift create mode 100644 punchnet/Core/PunchnetConfig.swift diff --git a/Tun/Info.plist b/Tun/Info.plist index 3059459..3f03436 100644 --- a/Tun/Info.plist +++ b/Tun/Info.plist @@ -2,6 +2,12 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSExtension NSExtensionPointIdentifier diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index c000391..dd82fde 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -19,15 +19,18 @@ class PacketTunnelProvider: NEPacketTunnelProvider { let token = options["token"] as! String //let version = options["version"] as! Int let installed_channel = options["installed_channel"] as! String + + let superIp = options["super_ip"] as! String Task { SDLLogger.logLevel = .debug do { self.context = try SDLContext(provider: self, config: .init( version: 1, installedChannel: installed_channel, - superHost: "118.178.229.213", + //superHost: "118.178.229.213", + superHost: superIp, superPort: 18083, - stunServers: [.init(host: "118.178.229.213", ports: [1265, 1266]), .init(host: "118.178.229.213", ports: [1265, 1266])], + stunServers: [.init(host: superIp, ports: [1265, 1266]), .init(host: "118.178.229.213", ports: [1265, 1266])], clientId: SDLContext.getUUID(), token: "" //token: token diff --git a/punchnet/Core/DNSResolver.swift b/punchnet/Core/DNSResolver.swift new file mode 100644 index 0000000..e4ddfeb --- /dev/null +++ b/punchnet/Core/DNSResolver.swift @@ -0,0 +1,55 @@ +// +// DNSResolver.swift +// punchnet +// +// Created by 安礼成 on 2025/5/14. +// +import Foundation +import Darwin + +struct DNSResolver { + + // 解析域名获取域名对应的ip地址 + static func resolveAddrInfos(_ hostname: String) -> [String] { + var hints = addrinfo( + ai_flags: AI_ALL, + ai_family: AF_UNSPEC, + ai_socktype: SOCK_STREAM, + ai_protocol: 0, + ai_addrlen: 0, + ai_canonname: nil, + ai_addr: nil, + ai_next: nil + ) + + var result: UnsafeMutablePointer? + let error = getaddrinfo(hostname, nil, &hints, &result) + guard error == 0 else { + return [] + } + + var ips = [String]() + var current = result + while current != nil { + var host = [CChar](repeating: 0, count: Int(NI_MAXHOST)) + if let addr = current?.pointee.ai_addr { + getnameinfo( + addr, + socklen_t(addr.pointee.sa_len), + &host, + socklen_t(host.count), + nil, + 0, + NI_NUMERICHOST + ) + let ip = String(cString: host) + ips.append(ip) + } + current = current?.pointee.ai_next + } + + freeaddrinfo(result) + return ips + } + +} diff --git a/punchnet/Core/PunchnetConfig.swift b/punchnet/Core/PunchnetConfig.swift new file mode 100644 index 0000000..c8e9dbe --- /dev/null +++ b/punchnet/Core/PunchnetConfig.swift @@ -0,0 +1,24 @@ +// +// Config.swift +// punchnet +// +// Created by 安礼成 on 2025/5/14. +// +import Foundation + +struct PunchnetConfig { + static let server = "punchnet.aioe.tech" + static let port = 18083 + + static func getOptions() -> [String:NSObject] { + var options: [String: NSObject] = [:] + + if let ip = DNSResolver.resolveAddrInfos(PunchnetConfig.server).first { + options["super_ip"] = ip as NSObject + } + + return options + } + +} + diff --git a/punchnet/VPNManager.swift b/punchnet/VPNManager.swift index 9f780a3..f59bfff 100644 --- a/punchnet/VPNManager.swift +++ b/punchnet/VPNManager.swift @@ -27,12 +27,15 @@ class VPNManager: ObservableObject { } // 开启vpn - func enableVpn(options: [String : NSObject]? = nil) async throws { + func enableVpn(options: [String : NSObject]) async throws { let manager = try await loadAndCreateProviderManager() try await manager.loadFromPreferences() self.addVPNStatusObserver(manager) - try manager.connection.startVPNTunnel(options: options) + var configOptions = PunchnetConfig.getOptions() + configOptions.merge(options, uniquingKeysWith: {$1}) + + try manager.connection.startVPNTunnel(options: configOptions) } // 关闭vpn @@ -91,6 +94,7 @@ class VPNManager: ObservableObject { return manager } + deinit { NotificationCenter.default.removeObserver(self) } diff --git a/punchnet/punchnet.entitlements b/punchnet/punchnet.entitlements index afae4c9..5c3964e 100644 --- a/punchnet/punchnet.entitlements +++ b/punchnet/punchnet.entitlements @@ -1,28 +1,29 @@ - - com.apple.developer.networking.networkextension - - packet-tunnel-provider - - com.apple.developer.networking.vpn.api - - allow-vpn - - com.apple.developer.system-extension.install - - com.apple.security.app-sandbox - - com.apple.security.application-groups - - $(TeamIdentifierPrefix) - - com.apple.security.files.user-selected.read-only - - com.apple.security.network.client - - com.apple.security.network.server - - + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + dns-proxy + + com.apple.developer.networking.vpn.api + + allow-vpn + + com.apple.developer.system-extension.install + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(TeamIdentifierPrefix) + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.network.server + +