diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 8d6246f..bc341c3 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -5,42 +5,42 @@ // Created by 安礼成 on 2025/8/3. // - -// -// PacketTunnelProvider.swift -// Tun -// -// Created by 安礼成 on 2024/1/17. -// - import NetworkExtension +enum TunnelError: Error { + case invalidConfiguration + case invalidContext +} + class PacketTunnelProvider: NEPacketTunnelProvider { var context: SDLContext? private var rootTask: Task? override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { + let logger = SDLLogger(level: .debug) + // host: "192.168.0.101", port: 1265 guard let options, let config = SDLConfiguration.parse(options: options) else { - NSLog("配置错误") + completionHandler(TunnelError.invalidConfiguration) return } - + // 如果当前在运行状态,不允许重复请求 guard self.context == nil else { + completionHandler(TunnelError.invalidContext) return } - + // 加密算法 let rsaCipher = try! CCRSACipher(keySize: 1024) let aesChiper = CCAESChiper() self.rootTask = Task { do { - self.context = SDLContext(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: SDLLogger(level: .debug)) + self.context = SDLContext(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: logger) try await self.context?.start() } catch let err { - NSLog("[PacketTunnelProvider] exit with error: \(err)") + logger.log("[PacketTunnelProvider] exit with error: \(err)") exit(-1) } } diff --git a/Tun/Punchnet/Actors/SDLDNSClientActor.swift b/Tun/Punchnet/Actors/SDLDNSClientActor.swift index 3fd4702..3227b8b 100644 --- a/Tun/Punchnet/Actors/SDLDNSClientActor.swift +++ b/Tun/Punchnet/Actors/SDLDNSClientActor.swift @@ -36,7 +36,7 @@ actor SDLDNSClientActor { } self.channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait() - self.logger.log("[UDPHole] started", level: .debug) + self.logger.log("[DNSClient] started", level: .debug) } func forward(ipPacket: IPPacket) { diff --git a/Tun/Punchnet/SDLConfiguration.swift b/Tun/Punchnet/SDLConfiguration.swift index 3f32520..4b10a66 100644 --- a/Tun/Punchnet/SDLConfiguration.swift +++ b/Tun/Punchnet/SDLConfiguration.swift @@ -96,7 +96,6 @@ extension SDLConfiguration { let superPort = options["super_port"] as? Int, let stunServersStr = options["stun_servers"] as? String, let noticePort = options["notice_port"] as? Int, - let token = options["token"] as? String, let accessToken = options["access_token"] as? String, let clientId = options["client_id"] as? String, let remoteDnsServer = options["remote_dns_server"] as? String, @@ -113,8 +112,6 @@ extension SDLConfiguration { guard let networkAddress = parseNetworkAddress(networkAddressDict) else { return nil } - - NSLog("[PacketTunnelProvider] client_id: \(clientId), token: \(token)") return SDLConfiguration(version: 1, installedChannel: installed_channel, diff --git a/Tun/Punchnet/SDLContext.swift b/Tun/Punchnet/SDLContext.swift index 59e0667..d24b85b 100644 --- a/Tun/Punchnet/SDLContext.swift +++ b/Tun/Punchnet/SDLContext.swift @@ -112,20 +112,21 @@ public class SDLContext { } } - group.addTask { - await self.startMonitor() - } +// group.addTask { +// await self.startMonitor() +// } - group.addTask { - while !Task.isCancelled { - do { - try await self.startNoticeClient() - } catch let err { - self.logger.log("[SDLContext] noticeClient get err: \(err)", level: .warning) - try await Task.sleep(for: .seconds(2)) - } - } - } + +// group.addTask { +// while !Task.isCancelled { +// do { +// try await self.startNoticeClient() +// } catch let err { +// self.logger.log("[SDLContext] noticeClient get err: \(err)", level: .warning) +// try await Task.sleep(for: .seconds(2)) +// } +// } +// } try await group.waitForAll() } @@ -151,10 +152,10 @@ public class SDLContext { private func startUDPHole() async throws { self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger) try await self.udpHoleActor?.start() - + try await withThrowingTaskGroup(of: Void.self) { group in group.addTask { - while !Task.isCancelled { + while true { try Task.checkCancellation() try await Task.sleep(nanoseconds: 5 * 1_000_000_000) try Task.checkCancellation() @@ -197,28 +198,12 @@ public class SDLContext { let remoteDnsServer = config.remoteDnsServer let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353) self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger) + try await self.dnsClientActor?.start() - try await withThrowingTaskGroup(of: Void.self) { group in - defer { - self.logger.log("[SDLContext] dns client task cancel", level: .warning) - } - - group.addTask { - try await self.dnsClientActor?.start() - } - - group.addTask { - if let packetFlow = self.dnsClientActor?.packetFlow { - for await packet in packetFlow { - let nePacket = NEPacket(data: packet, protocolFamily: 2) - await self.providerActor.writePackets(packets: [nePacket]) - } - } - - } - - if let _ = try await group.next() { - group.cancelAll() + if let packetFlow = self.dnsClientActor?.packetFlow { + for await packet in packetFlow { + let nePacket = NEPacket(data: packet, protocolFamily: 2) + await self.providerActor.writePackets(packets: [nePacket]) } } } @@ -242,6 +227,8 @@ public class SDLContext { registerSuper.hostname = self.config.hostname registerSuper.pubKey = self.rsaCipher.pubKey registerSuper.accessToken = self.config.accessToken + + self.logger.log("will send register super") await self.udpHoleActor?.send(type: .registerSuper, data: try registerSuper.serializedData(), remoteAddress: self.config.stunSocketAddress) } diff --git a/Tun/Punchnet/SDLLogger.swift b/Tun/Punchnet/SDLLogger.swift index 7e21bf3..a3c932d 100644 --- a/Tun/Punchnet/SDLLogger.swift +++ b/Tun/Punchnet/SDLLogger.swift @@ -5,7 +5,7 @@ // Created by 安礼成 on 2024/3/13. // import Foundation -import os.log +import os public class SDLLogger: @unchecked Sendable { public enum Level: Int8, CustomStringConvertible { @@ -29,18 +29,15 @@ public class SDLLogger: @unchecked Sendable { } private let level: Level - private let log: OSLog + private let log: Logger public init(level: Level) { self.level = level - self.log = OSLog(subsystem: "com.jihe.punchnet", category: "punchnet") + self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet") } public func log(_ message: String, level: Level = .debug) { - if self.level.rawValue <= level.rawValue { - //os_log("%{public}@: %{public}@", log: self.log, type: .debug, level.description, message) - NSLog("\(level.description): \(message)") - } + self.log.info("\(message, privacy: .public)") } } diff --git a/punchnet/Core/SystemConfig.swift b/punchnet/Core/SystemConfig.swift index 7377520..e36dc18 100644 --- a/punchnet/Core/SystemConfig.swift +++ b/punchnet/Core/SystemConfig.swift @@ -23,7 +23,7 @@ struct SystemConfig { static let superPort = 18083 // stun探测服务 - static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266" + static let stunServers = "118.178.229.213:1365,1366;118.178.229.213:1365,1366" //static let stunServers = "127.0.0.1:1265,1266;127.0.0.1:1265,1266" static func getOptions(networkId: UInt32, networkDomain: String, ip: String, maskLen: UInt8, accessToken: String, hostname: String, noticePort: Int) -> [String: NSObject]? { diff --git a/punchnet/Views/Network/NetworkDisconnctedView.swift b/punchnet/Views/Network/NetworkDisconnctedView.swift index c16deae..93ca057 100644 --- a/punchnet/Views/Network/NetworkDisconnctedView.swift +++ b/punchnet/Views/Network/NetworkDisconnctedView.swift @@ -14,21 +14,40 @@ struct NetworkDisconnctedView: View { ZStack { Color.clear - Button { - Task { - try await startVpn() - } - } label: { - Text("连接") - .font(.system(size: 14, weight: .regular)) - .padding([.top, .bottom], 8) - .padding([.leading, .trailing], 30) - .foregroundColor(.white) + VStack { + Button { + Task { + try await startVpn() + } + } label: { + Text("连接") + .font(.system(size: 14, weight: .regular)) + .padding([.top, .bottom], 8) + .padding([.leading, .trailing], 30) + .foregroundColor(.white) + + } + .background(Color(red: 74/255, green: 207/255, blue: 154/255)) + .cornerRadius(5) + .frame(width: 120, height: 35) + + Button { + Task { + try await VPNManager.shared.disableVpn() + } + } label: { + Text("关闭") + .font(.system(size: 14, weight: .regular)) + .padding([.top, .bottom], 8) + .padding([.leading, .trailing], 30) + .foregroundColor(.white) + + } + .background(Color(red: 74/255, green: 207/255, blue: 154/255)) + .cornerRadius(5) + .frame(width: 120, height: 35) } - .background(Color(red: 74/255, green: 207/255, blue: 154/255)) - .cornerRadius(5) - .frame(width: 120, height: 35) } }