This commit is contained in:
anlicheng 2026-01-28 23:43:19 +08:00
parent 92a05263bb
commit ce0f3fa29d
7 changed files with 74 additions and 74 deletions

View File

@ -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<Void, Error>?
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)
}
}

View File

@ -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) {

View File

@ -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,

View File

@ -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)
}

View File

@ -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)")
}
}

View File

@ -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]? {

View File

@ -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)
}
}