fix
This commit is contained in:
parent
92a05263bb
commit
ce0f3fa29d
@ -5,42 +5,42 @@
|
|||||||
// Created by 安礼成 on 2025/8/3.
|
// Created by 安礼成 on 2025/8/3.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// PacketTunnelProvider.swift
|
|
||||||
// Tun
|
|
||||||
//
|
|
||||||
// Created by 安礼成 on 2024/1/17.
|
|
||||||
//
|
|
||||||
|
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
|
|
||||||
|
enum TunnelError: Error {
|
||||||
|
case invalidConfiguration
|
||||||
|
case invalidContext
|
||||||
|
}
|
||||||
|
|
||||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||||
var context: SDLContext?
|
var context: SDLContext?
|
||||||
private var rootTask: Task<Void, Error>?
|
private var rootTask: Task<Void, Error>?
|
||||||
|
|
||||||
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||||
|
let logger = SDLLogger(level: .debug)
|
||||||
|
|
||||||
// host: "192.168.0.101", port: 1265
|
// host: "192.168.0.101", port: 1265
|
||||||
guard let options, let config = SDLConfiguration.parse(options: options) else {
|
guard let options, let config = SDLConfiguration.parse(options: options) else {
|
||||||
NSLog("配置错误")
|
completionHandler(TunnelError.invalidConfiguration)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果当前在运行状态,不允许重复请求
|
// 如果当前在运行状态,不允许重复请求
|
||||||
guard self.context == nil else {
|
guard self.context == nil else {
|
||||||
|
completionHandler(TunnelError.invalidContext)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加密算法
|
// 加密算法
|
||||||
let rsaCipher = try! CCRSACipher(keySize: 1024)
|
let rsaCipher = try! CCRSACipher(keySize: 1024)
|
||||||
let aesChiper = CCAESChiper()
|
let aesChiper = CCAESChiper()
|
||||||
|
|
||||||
self.rootTask = Task {
|
self.rootTask = Task {
|
||||||
do {
|
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()
|
try await self.context?.start()
|
||||||
} catch let err {
|
} catch let err {
|
||||||
NSLog("[PacketTunnelProvider] exit with error: \(err)")
|
logger.log("[PacketTunnelProvider] exit with error: \(err)")
|
||||||
exit(-1)
|
exit(-1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,7 @@ actor SDLDNSClientActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait()
|
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) {
|
func forward(ipPacket: IPPacket) {
|
||||||
|
|||||||
@ -96,7 +96,6 @@ extension SDLConfiguration {
|
|||||||
let superPort = options["super_port"] as? Int,
|
let superPort = options["super_port"] as? Int,
|
||||||
let stunServersStr = options["stun_servers"] as? String,
|
let stunServersStr = options["stun_servers"] as? String,
|
||||||
let noticePort = options["notice_port"] as? Int,
|
let noticePort = options["notice_port"] as? Int,
|
||||||
let token = options["token"] as? String,
|
|
||||||
let accessToken = options["access_token"] as? String,
|
let accessToken = options["access_token"] as? String,
|
||||||
let clientId = options["client_id"] as? String,
|
let clientId = options["client_id"] as? String,
|
||||||
let remoteDnsServer = options["remote_dns_server"] as? String,
|
let remoteDnsServer = options["remote_dns_server"] as? String,
|
||||||
@ -113,8 +112,6 @@ extension SDLConfiguration {
|
|||||||
guard let networkAddress = parseNetworkAddress(networkAddressDict) else {
|
guard let networkAddress = parseNetworkAddress(networkAddressDict) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
NSLog("[PacketTunnelProvider] client_id: \(clientId), token: \(token)")
|
|
||||||
|
|
||||||
return SDLConfiguration(version: 1,
|
return SDLConfiguration(version: 1,
|
||||||
installedChannel: installed_channel,
|
installedChannel: installed_channel,
|
||||||
|
|||||||
@ -112,20 +112,21 @@ public class SDLContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
group.addTask {
|
// group.addTask {
|
||||||
await self.startMonitor()
|
// await self.startMonitor()
|
||||||
}
|
// }
|
||||||
|
|
||||||
group.addTask {
|
|
||||||
while !Task.isCancelled {
|
// group.addTask {
|
||||||
do {
|
// while !Task.isCancelled {
|
||||||
try await self.startNoticeClient()
|
// do {
|
||||||
} catch let err {
|
// try await self.startNoticeClient()
|
||||||
self.logger.log("[SDLContext] noticeClient get err: \(err)", level: .warning)
|
// } catch let err {
|
||||||
try await Task.sleep(for: .seconds(2))
|
// self.logger.log("[SDLContext] noticeClient get err: \(err)", level: .warning)
|
||||||
}
|
// try await Task.sleep(for: .seconds(2))
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
try await group.waitForAll()
|
try await group.waitForAll()
|
||||||
}
|
}
|
||||||
@ -151,10 +152,10 @@ public class SDLContext {
|
|||||||
private func startUDPHole() async throws {
|
private func startUDPHole() async throws {
|
||||||
self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger)
|
self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger)
|
||||||
try await self.udpHoleActor?.start()
|
try await self.udpHoleActor?.start()
|
||||||
|
|
||||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||||
group.addTask {
|
group.addTask {
|
||||||
while !Task.isCancelled {
|
while true {
|
||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
try await Task.sleep(nanoseconds: 5 * 1_000_000_000)
|
try await Task.sleep(nanoseconds: 5 * 1_000_000_000)
|
||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
@ -197,28 +198,12 @@ public class SDLContext {
|
|||||||
let remoteDnsServer = config.remoteDnsServer
|
let remoteDnsServer = config.remoteDnsServer
|
||||||
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353)
|
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353)
|
||||||
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
||||||
|
try await self.dnsClientActor?.start()
|
||||||
|
|
||||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
if let packetFlow = self.dnsClientActor?.packetFlow {
|
||||||
defer {
|
for await packet in packetFlow {
|
||||||
self.logger.log("[SDLContext] dns client task cancel", level: .warning)
|
let nePacket = NEPacket(data: packet, protocolFamily: 2)
|
||||||
}
|
await self.providerActor.writePackets(packets: [nePacket])
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -242,6 +227,8 @@ public class SDLContext {
|
|||||||
registerSuper.hostname = self.config.hostname
|
registerSuper.hostname = self.config.hostname
|
||||||
registerSuper.pubKey = self.rsaCipher.pubKey
|
registerSuper.pubKey = self.rsaCipher.pubKey
|
||||||
registerSuper.accessToken = self.config.accessToken
|
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)
|
await self.udpHoleActor?.send(type: .registerSuper, data: try registerSuper.serializedData(), remoteAddress: self.config.stunSocketAddress)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
// Created by 安礼成 on 2024/3/13.
|
// Created by 安礼成 on 2024/3/13.
|
||||||
//
|
//
|
||||||
import Foundation
|
import Foundation
|
||||||
import os.log
|
import os
|
||||||
|
|
||||||
public class SDLLogger: @unchecked Sendable {
|
public class SDLLogger: @unchecked Sendable {
|
||||||
public enum Level: Int8, CustomStringConvertible {
|
public enum Level: Int8, CustomStringConvertible {
|
||||||
@ -29,18 +29,15 @@ public class SDLLogger: @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private let level: Level
|
private let level: Level
|
||||||
private let log: OSLog
|
private let log: Logger
|
||||||
|
|
||||||
public init(level: Level) {
|
public init(level: Level) {
|
||||||
self.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) {
|
public func log(_ message: String, level: Level = .debug) {
|
||||||
if self.level.rawValue <= level.rawValue {
|
self.log.info("\(message, privacy: .public)")
|
||||||
//os_log("%{public}@: %{public}@", log: self.log, type: .debug, level.description, message)
|
|
||||||
NSLog("\(level.description): \(message)")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@ struct SystemConfig {
|
|||||||
static let superPort = 18083
|
static let superPort = 18083
|
||||||
|
|
||||||
// stun探测服务
|
// 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 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]? {
|
static func getOptions(networkId: UInt32, networkDomain: String, ip: String, maskLen: UInt8, accessToken: String, hostname: String, noticePort: Int) -> [String: NSObject]? {
|
||||||
|
|||||||
@ -14,21 +14,40 @@ struct NetworkDisconnctedView: View {
|
|||||||
ZStack {
|
ZStack {
|
||||||
Color.clear
|
Color.clear
|
||||||
|
|
||||||
Button {
|
VStack {
|
||||||
Task {
|
|
||||||
try await startVpn()
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
Text("连接")
|
|
||||||
.font(.system(size: 14, weight: .regular))
|
|
||||||
.padding([.top, .bottom], 8)
|
|
||||||
.padding([.leading, .trailing], 30)
|
|
||||||
.foregroundColor(.white)
|
|
||||||
|
|
||||||
|
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user