fix logger
This commit is contained in:
parent
57e360bee2
commit
c63b20b568
@ -32,10 +32,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||||||
// 加密算法
|
// 加密算法
|
||||||
let rsaCipher = try! CCRSACipher(keySize: 1024)
|
let rsaCipher = try! CCRSACipher(keySize: 1024)
|
||||||
let aesChiper = CCAESChiper()
|
let aesChiper = CCAESChiper()
|
||||||
let logger = SDLLogger(level: .debug)
|
|
||||||
|
|
||||||
self.rootTask = Task {
|
self.rootTask = Task {
|
||||||
self.contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: logger)
|
self.contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper)
|
||||||
await self.contextActor?.start()
|
await self.contextActor?.start()
|
||||||
completionHandler(nil)
|
completionHandler(nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,7 +54,6 @@ actor SDLNATProberActor {
|
|||||||
|
|
||||||
private let udpHole: SDLUDPHole
|
private let udpHole: SDLUDPHole
|
||||||
private let addressArray: [[SocketAddress]]
|
private let addressArray: [[SocketAddress]]
|
||||||
private let logger: SDLLogger
|
|
||||||
|
|
||||||
// MARK: - Completion
|
// MARK: - Completion
|
||||||
private var cookieId: UInt32 = 1
|
private var cookieId: UInt32 = 1
|
||||||
@ -63,10 +62,9 @@ actor SDLNATProberActor {
|
|||||||
|
|
||||||
// MARK: - Init
|
// MARK: - Init
|
||||||
|
|
||||||
init(udpHole: SDLUDPHole, addressArray: [[SocketAddress]], logger: SDLLogger) {
|
init(udpHole: SDLUDPHole, addressArray: [[SocketAddress]]) {
|
||||||
self.udpHole = udpHole
|
self.udpHole = udpHole
|
||||||
self.addressArray = addressArray
|
self.addressArray = addressArray
|
||||||
self.logger = logger
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Public API
|
// MARK: - Public API
|
||||||
@ -104,7 +102,7 @@ actor SDLNATProberActor {
|
|||||||
// 提前退出的情况,没有nat映射
|
// 提前退出的情况,没有nat映射
|
||||||
if session.replies[1] != nil {
|
if session.replies[1] != nil {
|
||||||
let localAddress = self.udpHole.getLocalAddress()
|
let localAddress = self.udpHole.getLocalAddress()
|
||||||
if reply.socketAddress() == localAddress {
|
if await reply.socketAddress() == localAddress {
|
||||||
finish(cookie: session.cookieId, .noNat)
|
finish(cookie: session.cookieId, .noNat)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -113,7 +111,7 @@ actor SDLNATProberActor {
|
|||||||
if let step1 = session.replies[1], let step2 = session.replies[2] {
|
if let step1 = session.replies[1], let step2 = session.replies[2] {
|
||||||
// 如果natAddress2 的IP地址与上次回来的IP是不一样的,它就是对称型NAT; 这次的包也一定能发成功并收到
|
// 如果natAddress2 的IP地址与上次回来的IP是不一样的,它就是对称型NAT; 这次的包也一定能发成功并收到
|
||||||
// 如果ip地址变了,这说明{dstIp, dstPort, srcIp, srcPort}, 其中有一个变了;则用新的ip地址
|
// 如果ip地址变了,这说明{dstIp, dstPort, srcIp, srcPort}, 其中有一个变了;则用新的ip地址
|
||||||
if let addr1 = step1.socketAddress(), let addr2 = step2.socketAddress(), addr1 != addr2 {
|
if let addr1 = await step1.socketAddress(), let addr2 = await step2.socketAddress(), addr1 != addr2 {
|
||||||
finish(cookie: session.cookieId, .symmetric)
|
finish(cookie: session.cookieId, .symmetric)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,6 @@ actor SDLPuncherActor {
|
|||||||
private var pendingRequests: [UInt32:RegisterRequest] = [:]
|
private var pendingRequests: [UInt32:RegisterRequest] = [:]
|
||||||
|
|
||||||
// 处理holer
|
// 处理holer
|
||||||
private var logger: SDLLogger
|
|
||||||
private var querySocketAddress: SocketAddress
|
private var querySocketAddress: SocketAddress
|
||||||
|
|
||||||
nonisolated private let(requestStream, requestContinuation) = AsyncStream.makeStream(of: RegisterRequest.self, bufferingPolicy: .unbounded)
|
nonisolated private let(requestStream, requestContinuation) = AsyncStream.makeStream(of: RegisterRequest.self, bufferingPolicy: .unbounded)
|
||||||
@ -31,10 +30,9 @@ actor SDLPuncherActor {
|
|||||||
let networkId: UInt32
|
let networkId: UInt32
|
||||||
}
|
}
|
||||||
|
|
||||||
init(udpHole: SDLUDPHole, querySocketAddress: SocketAddress, logger: SDLLogger) {
|
init(udpHole: SDLUDPHole, querySocketAddress: SocketAddress) {
|
||||||
self.udpHole = udpHole
|
self.udpHole = udpHole
|
||||||
self.querySocketAddress = querySocketAddress
|
self.querySocketAddress = querySocketAddress
|
||||||
self.logger = logger
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nonisolated func submitRegisterRequest(request: RegisterRequest) {
|
nonisolated func submitRegisterRequest(request: RegisterRequest) {
|
||||||
@ -74,8 +72,8 @@ actor SDLPuncherActor {
|
|||||||
|
|
||||||
func handlePeerInfo(peerInfo: SDLPeerInfo) async {
|
func handlePeerInfo(peerInfo: SDLPeerInfo) async {
|
||||||
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
|
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
|
||||||
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
if let remoteAddress = try? await peerInfo.v4Info.socketAddress() {
|
||||||
self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
|
SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
|
||||||
// 发送register包
|
// 发送register包
|
||||||
var register = SDLRegister()
|
var register = SDLRegister()
|
||||||
register.networkID = request.networkId
|
register.networkID = request.networkId
|
||||||
@ -84,7 +82,7 @@ actor SDLPuncherActor {
|
|||||||
|
|
||||||
self.udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
|
self.udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
|
||||||
} else {
|
} else {
|
||||||
self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,6 @@ actor SDLAddressResolver {
|
|||||||
|
|
||||||
func resolve(host: String, port: Int) async throws -> SocketAddress {
|
func resolve(host: String, port: Int) async throws -> SocketAddress {
|
||||||
let key = "\(host):\(port)"
|
let key = "\(host):\(port)"
|
||||||
|
|
||||||
if let cached = cache[key] {
|
if let cached = cache[key] {
|
||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
@ -30,8 +29,8 @@ actor SDLAddressResolver {
|
|||||||
let address = try await pool.runIfActive {
|
let address = try await pool.runIfActive {
|
||||||
try SocketAddress.makeAddressResolvingHost(host, port: port)
|
try SocketAddress.makeAddressResolvingHost(host, port: port)
|
||||||
}
|
}
|
||||||
|
|
||||||
cache[key] = address
|
cache[key] = address
|
||||||
|
|
||||||
return address
|
return address
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -57,20 +57,17 @@ actor SDLContextActor {
|
|||||||
// 流量统计
|
// 流量统计
|
||||||
nonisolated private let flowTracer = SDLFlowTracer()
|
nonisolated private let flowTracer = SDLFlowTracer()
|
||||||
|
|
||||||
nonisolated private let logger: SDLLogger
|
|
||||||
|
|
||||||
// 处理内部的需要长时间运行的任务
|
// 处理内部的需要长时间运行的任务
|
||||||
private var loopChildWorkers: [Task<Void, Never>] = []
|
private var loopChildWorkers: [Task<Void, Never>] = []
|
||||||
|
|
||||||
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) {
|
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher) {
|
||||||
self.logger = logger
|
|
||||||
self.config = config
|
self.config = config
|
||||||
self.rsaCipher = rsaCipher
|
self.rsaCipher = rsaCipher
|
||||||
self.aesCipher = aesCipher
|
self.aesCipher = aesCipher
|
||||||
|
|
||||||
self.sessionManager = SessionManager()
|
self.sessionManager = SessionManager()
|
||||||
self.arpServer = ArpServer(known_macs: [:])
|
self.arpServer = ArpServer(known_macs: [:])
|
||||||
self.providerAdapter = SDLTunnelProviderAdapter(provider: provider, logger: logger)
|
self.providerAdapter = SDLTunnelProviderAdapter(provider: provider)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func start() {
|
public func start() {
|
||||||
@ -78,32 +75,32 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
self.loopChildWorkers.append(spawnLoop {
|
||||||
let noticeClient = try self.startNoticeClient()
|
let noticeClient = try self.startNoticeClient()
|
||||||
self.logger.log("[SDLContext] noticeClient running!!!!")
|
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
|
||||||
try await noticeClient.waitClose()
|
try await noticeClient.waitClose()
|
||||||
self.logger.log("[SDLContext] noticeClient closed!!!!")
|
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
|
||||||
})
|
})
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
self.loopChildWorkers.append(spawnLoop {
|
||||||
let dnsClient = try await self.startDnsClient()
|
let dnsClient = try await self.startDnsClient()
|
||||||
self.logger.log("[SDLContext] dns running!!!!")
|
SDLLogger.shared.log("[SDLContext] dns running!!!!")
|
||||||
try await dnsClient.waitClose()
|
try await dnsClient.waitClose()
|
||||||
self.logger.log("[SDLContext] dns closed!!!!")
|
SDLLogger.shared.log("[SDLContext] dns closed!!!!")
|
||||||
})
|
})
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
self.loopChildWorkers.append(spawnLoop {
|
||||||
let udpHole = try await self.startUDPHole()
|
let udpHole = try await self.startUDPHole()
|
||||||
self.logger.log("[SDLContext] udp running!!!!")
|
SDLLogger.shared.log("[SDLContext] udp running!!!!")
|
||||||
try await udpHole.waitClose()
|
try await udpHole.waitClose()
|
||||||
self.logger.log("[SDLContext] udp closed!!!!")
|
SDLLogger.shared.log("[SDLContext] udp closed!!!!")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startNoticeClient() throws -> SDLNoticeClient {
|
private func startNoticeClient() throws -> SDLNoticeClient {
|
||||||
// 启动noticeClient
|
// 启动noticeClient
|
||||||
let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort, logger: self.logger)
|
let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort, logger: SDLLogger.shared)
|
||||||
noticeClient.start()
|
noticeClient.start()
|
||||||
|
|
||||||
self.logger.log("[SDLContext] noticeClient started")
|
SDLLogger.shared.log("[SDLContext] noticeClient started")
|
||||||
self.noticeClient = noticeClient
|
self.noticeClient = noticeClient
|
||||||
|
|
||||||
return noticeClient
|
return noticeClient
|
||||||
@ -116,7 +113,7 @@ actor SDLContextActor {
|
|||||||
// 启动monitor
|
// 启动monitor
|
||||||
let monitor = SDLNetworkMonitor()
|
let monitor = SDLNetworkMonitor()
|
||||||
monitor.start()
|
monitor.start()
|
||||||
self.logger.log("[SDLContext] monitor started")
|
SDLLogger.shared.log("[SDLContext] monitor started")
|
||||||
self.monitor = monitor
|
self.monitor = monitor
|
||||||
|
|
||||||
self.monitorWorker = Task.detached {
|
self.monitorWorker = Task.detached {
|
||||||
@ -125,9 +122,9 @@ actor SDLContextActor {
|
|||||||
case .changed:
|
case .changed:
|
||||||
// 需要重新探测网络的nat类型
|
// 需要重新探测网络的nat类型
|
||||||
//self.natType = await self.getNatType()
|
//self.natType = await self.getNatType()
|
||||||
self.logger.log("didNetworkPathChanged, nat type is:", level: .info)
|
SDLLogger.shared.log("didNetworkPathChanged, nat type is:", level: .info)
|
||||||
case .unreachable:
|
case .unreachable:
|
||||||
self.logger.log("didNetworkPathUnreachable", level: .warning)
|
SDLLogger.shared.log("didNetworkPathUnreachable", level: .warning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,9 +136,9 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
// 启动dns服务
|
// 启动dns服务
|
||||||
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353)
|
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353)
|
||||||
let dnsClient = try await SDLDNSClient(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
let dnsClient = try await SDLDNSClient(dnsServerAddress: dnsSocketAddress, logger: SDLLogger.shared)
|
||||||
try dnsClient.start()
|
try dnsClient.start()
|
||||||
self.logger.log("[SDLContext] dnsClient started")
|
SDLLogger.shared.log("[SDLContext] dnsClient started")
|
||||||
self.dnsClient = dnsClient
|
self.dnsClient = dnsClient
|
||||||
self.dnsWorker = Task.detached {
|
self.dnsWorker = Task.detached {
|
||||||
// 处理事件流
|
// 处理事件流
|
||||||
@ -162,9 +159,9 @@ actor SDLContextActor {
|
|||||||
self.udpHoleWorkers = nil
|
self.udpHoleWorkers = nil
|
||||||
|
|
||||||
// 启动udp服务器
|
// 启动udp服务器
|
||||||
let udpHole = try SDLUDPHole(logger: self.logger)
|
let udpHole = try SDLUDPHole(logger: SDLLogger.shared)
|
||||||
try udpHole.start()
|
try udpHole.start()
|
||||||
self.logger.log("[SDLContext] udpHole started")
|
SDLLogger.shared.log("[SDLContext] udpHole started")
|
||||||
self.udpHole = udpHole
|
self.udpHole = udpHole
|
||||||
|
|
||||||
await udpHole.channelIsActived()
|
await udpHole.channelIsActived()
|
||||||
@ -180,12 +177,12 @@ actor SDLContextActor {
|
|||||||
if Task.isCancelled {
|
if Task.isCancelled {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
self.logger.log("[SDLContext] will do stunRequest22")
|
SDLLogger.shared.log("[SDLContext] will do stunRequest22")
|
||||||
await self.sendStunRequest()
|
await self.sendStunRequest()
|
||||||
self.logger.log("[SDLContext] will do stunRequest44")
|
SDLLogger.shared.log("[SDLContext] will do stunRequest44")
|
||||||
}
|
}
|
||||||
|
|
||||||
self.logger.log("[SDLContext] will do stunRequest55")
|
SDLLogger.shared.log("[SDLContext] will do stunRequest55")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理数据流
|
// 处理数据流
|
||||||
@ -257,14 +254,14 @@ actor SDLContextActor {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
self.puncherActor = SDLPuncherActor(udpHole: udpHole, querySocketAddress: config.stunSocketAddress, logger: logger)
|
self.puncherActor = SDLPuncherActor(udpHole: udpHole, querySocketAddress: config.stunSocketAddress)
|
||||||
self.proberActor = SDLNATProberActor(udpHole: udpHole, addressArray: self.config.stunProbeSocketAddressArray, logger: self.logger)
|
self.proberActor = SDLNATProberActor(udpHole: udpHole, addressArray: self.config.stunProbeSocketAddressArray)
|
||||||
|
|
||||||
// 开始探测nat的类型
|
// 开始探测nat的类型
|
||||||
Task.detached {
|
Task.detached {
|
||||||
if let natType = await self.proberActor?.probeNatType() {
|
if let natType = await self.proberActor?.probeNatType() {
|
||||||
await self.setNatType(natType: natType)
|
await self.setNatType(natType: natType)
|
||||||
self.logger.log("[SDLContext] nat_type is: \(natType)")
|
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +278,7 @@ actor SDLContextActor {
|
|||||||
registerSuper.accessToken = self.config.accessToken
|
registerSuper.accessToken = self.config.accessToken
|
||||||
|
|
||||||
if let registerSuperData = try? registerSuper.serializedData() {
|
if let registerSuperData = try? registerSuper.serializedData() {
|
||||||
self.logger.log("[SDLContext] will send register super")
|
SDLLogger.shared.log("[SDLContext] will send register super")
|
||||||
self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress)
|
self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -294,7 +291,7 @@ actor SDLContextActor {
|
|||||||
stunRequest.mac = self.config.networkAddress.mac
|
stunRequest.mac = self.config.networkAddress.mac
|
||||||
stunRequest.natType = UInt32(self.natType.rawValue)
|
stunRequest.natType = UInt32(self.natType.rawValue)
|
||||||
|
|
||||||
self.logger.log("[SDLContext] will send stun request")
|
SDLLogger.shared.log("[SDLContext] will send stun request")
|
||||||
|
|
||||||
if let stunData = try? stunRequest.serializedData() {
|
if let stunData = try? stunRequest.serializedData() {
|
||||||
let remoteAddress = self.config.stunSocketAddress
|
let remoteAddress = self.config.stunSocketAddress
|
||||||
@ -306,17 +303,17 @@ actor SDLContextActor {
|
|||||||
// 需要对数据通过rsa的私钥解码
|
// 需要对数据通过rsa的私钥解码
|
||||||
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
|
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
|
||||||
|
|
||||||
self.logger.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info)
|
SDLLogger.shared.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info)
|
||||||
// 服务器分配的tun网卡信息
|
// 服务器分配的tun网卡信息
|
||||||
do {
|
do {
|
||||||
let ipAddress = try await self.providerAdapter.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer)
|
let ipAddress = try await self.providerAdapter.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer)
|
||||||
self.logger.log("[SDLContext] setNetworkSettings successed")
|
SDLLogger.shared.log("[SDLContext] setNetworkSettings successed")
|
||||||
self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress))
|
self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress))
|
||||||
self.logger.log("[SDLContext] send ip successed")
|
SDLLogger.shared.log("[SDLContext] send ip successed")
|
||||||
self.startReader()
|
self.startReader()
|
||||||
self.logger.log("[SDLContext] reader started")
|
SDLLogger.shared.log("[SDLContext] reader started")
|
||||||
} catch let err {
|
} catch let err {
|
||||||
self.logger.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error)
|
SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error)
|
||||||
exit(-1)
|
exit(-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,7 +335,7 @@ actor SDLContextActor {
|
|||||||
let alertNotice = NoticeMessage.alert(alert: errorMessage)
|
let alertNotice = NoticeMessage.alert(alert: errorMessage)
|
||||||
self.noticeClient?.send(data: alertNotice)
|
self.noticeClient?.send(data: alertNotice)
|
||||||
}
|
}
|
||||||
self.logger.log("[SDLContext] Get a SuperNak message exit", level: .warning)
|
SDLLogger.shared.log("[SDLContext] Get a SuperNak message exit", level: .warning)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,10 +343,10 @@ actor SDLContextActor {
|
|||||||
switch event {
|
switch event {
|
||||||
case .natChanged(let natChangedEvent):
|
case .natChanged(let natChangedEvent):
|
||||||
let dstMac = natChangedEvent.mac
|
let dstMac = natChangedEvent.mac
|
||||||
self.logger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
|
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
|
||||||
sessionManager.removeSession(dstMac: dstMac)
|
sessionManager.removeSession(dstMac: dstMac)
|
||||||
case .sendRegister(let sendRegisterEvent):
|
case .sendRegister(let sendRegisterEvent):
|
||||||
self.logger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
|
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
|
||||||
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
|
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
|
||||||
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
|
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
|
||||||
// 发送register包
|
// 发送register包
|
||||||
@ -369,7 +366,7 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
|
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
|
||||||
let networkAddr = config.networkAddress
|
let networkAddr = config.networkAddress
|
||||||
self.logger.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
|
SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
|
||||||
|
|
||||||
// 判断目标地址是否是tun的网卡地址, 并且是在同一个网络下
|
// 判断目标地址是否是tun的网卡地址, 并且是在同一个网络下
|
||||||
if register.dstMac == networkAddr.mac && register.networkID == networkAddr.networkId {
|
if register.dstMac == networkAddr.mac && register.networkID == networkAddr.networkId {
|
||||||
@ -384,7 +381,7 @@ actor SDLContextActor {
|
|||||||
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
|
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
|
||||||
self.sessionManager.addSession(session: session)
|
self.sessionManager.addSession(session: session)
|
||||||
} else {
|
} else {
|
||||||
self.logger.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
|
SDLLogger.shared.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +392,7 @@ actor SDLContextActor {
|
|||||||
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
|
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
|
||||||
self.sessionManager.addSession(session: session)
|
self.sessionManager.addSession(session: session)
|
||||||
} else {
|
} else {
|
||||||
self.logger.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
|
SDLLogger.shared.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,18 +423,18 @@ actor SDLContextActor {
|
|||||||
if arpPacket.targetIP == networkAddr.ip {
|
if arpPacket.targetIP == networkAddr.ip {
|
||||||
switch arpPacket.opcode {
|
switch arpPacket.opcode {
|
||||||
case .request:
|
case .request:
|
||||||
self.logger.log("[SDLContext] get arp request packet", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get arp request packet", level: .debug)
|
||||||
let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip)
|
let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip)
|
||||||
self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
|
self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
|
||||||
case .response:
|
case .response:
|
||||||
self.logger.log("[SDLContext] get arp response packet", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug)
|
||||||
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
|
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.logger.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.logger.log("[SDLContext] get invalid arp packet", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get invalid arp packet", level: .debug)
|
||||||
}
|
}
|
||||||
case .ipv4:
|
case .ipv4:
|
||||||
guard let ipPacket = IPPacket(layerPacket.data), ipPacket.header.destination == networkAddr.ip else {
|
guard let ipPacket = IPPacket(layerPacket.data), ipPacket.header.destination == networkAddr.ip else {
|
||||||
@ -446,7 +443,7 @@ actor SDLContextActor {
|
|||||||
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
|
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
|
||||||
self.providerAdapter.writePackets(packets: [packet])
|
self.providerAdapter.writePackets(packets: [packet])
|
||||||
default:
|
default:
|
||||||
self.logger.log("[SDLContext] get invalid packet", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get invalid packet", level: .debug)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,7 +488,7 @@ actor SDLContextActor {
|
|||||||
let networkAddr = self.config.networkAddress
|
let networkAddr = self.config.networkAddress
|
||||||
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
|
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
|
||||||
let destIp = packet.header.destination_ip
|
let destIp = packet.header.destination_ip
|
||||||
self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
|
SDLLogger.shared.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
|
||||||
self.dnsClient?.forward(ipPacket: packet)
|
self.dnsClient?.forward(ipPacket: packet)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -509,7 +506,7 @@ actor SDLContextActor {
|
|||||||
self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
|
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
|
||||||
// 构造arp广播
|
// 构造arp广播
|
||||||
let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
|
let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
|
||||||
self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
|
self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
|
||||||
@ -541,7 +538,7 @@ actor SDLContextActor {
|
|||||||
else {
|
else {
|
||||||
// 通过session发送到对端
|
// 通过session发送到对端
|
||||||
if let session = self.sessionManager.getSession(toAddress: dstMac) {
|
if let session = self.sessionManager.getSession(toAddress: dstMac) {
|
||||||
self.logger.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
||||||
self.udpHole?.send(type: .data, data: data, remoteAddress: session.natAddress)
|
self.udpHole?.send(type: .data, data: data, remoteAddress: session.natAddress)
|
||||||
self.flowTracer.inc(num: data.count, type: .p2p)
|
self.flowTracer.inc(num: data.count, type: .p2p)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,10 +28,12 @@ public class SDLLogger: @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static let shared = SDLLogger(level: .debug)
|
||||||
|
|
||||||
private let level: Level
|
private let level: Level
|
||||||
private let log: Logger
|
private let log: Logger
|
||||||
|
|
||||||
public init(level: Level) {
|
private init(level: Level) {
|
||||||
self.level = level
|
self.level = level
|
||||||
self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet")
|
self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,18 +77,18 @@ enum SDLNAKErrorCode: UInt8 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension SDLV4Info {
|
extension SDLV4Info {
|
||||||
func socketAddress() -> SocketAddress? {
|
func socketAddress() async throws -> SocketAddress {
|
||||||
let address = "\(v4[0]).\(v4[1]).\(v4[2]).\(v4[3])"
|
let address = "\(v4[0]).\(v4[1]).\(v4[2]).\(v4[3])"
|
||||||
|
|
||||||
return try? SocketAddress.makeAddressResolvingHost(address, port: Int(port))
|
return try await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SDLStunProbeReply {
|
extension SDLStunProbeReply {
|
||||||
func socketAddress() -> SocketAddress? {
|
func socketAddress() async -> SocketAddress? {
|
||||||
let address = SDLUtil.int32ToIp(self.ip)
|
let address = SDLUtil.int32ToIp(self.ip)
|
||||||
|
|
||||||
return try? SocketAddress.makeAddressResolvingHost(address, port: Int(port))
|
return try? await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -46,20 +46,14 @@ final class SDLNoticeClient {
|
|||||||
func start() {
|
func start() {
|
||||||
let channel = self.channel
|
let channel = self.channel
|
||||||
self.task = Task.detached {
|
self.task = Task.detached {
|
||||||
self.logger.log("[SDLNoticeClient] task 11", level: .debug)
|
|
||||||
guard let remoteAddress = try? await SDLAddressResolver.shared.resolve(host: "127.0.0.1", port: self.noticePort) else {
|
guard let remoteAddress = try? await SDLAddressResolver.shared.resolve(host: "127.0.0.1", port: self.noticePort) else {
|
||||||
self.logger.log("[SDLNoticeClient] task 22", level: .debug)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for await data in self.writeStream {
|
for await data in self.writeStream {
|
||||||
if Task.isCancelled {
|
if Task.isCancelled {
|
||||||
self.logger.log("[SDLNoticeClient] task 33", level: .debug)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
self.logger.log("[SDLNoticeClient] task 44", level: .debug)
|
|
||||||
|
|
||||||
self.logger.log("[SDLNoticeClient] send packet", level: .debug)
|
|
||||||
|
|
||||||
let buf = channel.allocator.buffer(bytes: data)
|
let buf = channel.allocator.buffer(bytes: data)
|
||||||
let envelope = AddressedEnvelope<ByteBuffer>(remoteAddress: remoteAddress, data: buf)
|
let envelope = AddressedEnvelope<ByteBuffer>(remoteAddress: remoteAddress, data: buf)
|
||||||
|
|||||||
@ -28,10 +28,8 @@ final class SDLTunnelProviderAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let provider: NEPacketTunnelProvider
|
let provider: NEPacketTunnelProvider
|
||||||
let logger: SDLLogger
|
|
||||||
|
|
||||||
public init(provider: NEPacketTunnelProvider, logger: SDLLogger) {
|
public init(provider: NEPacketTunnelProvider) {
|
||||||
self.logger = logger
|
|
||||||
self.provider = provider
|
self.provider = provider
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +58,7 @@ final class SDLTunnelProviderAdapter {
|
|||||||
dnsSettings.matchDomains = [networkDomain]
|
dnsSettings.matchDomains = [networkDomain]
|
||||||
dnsSettings.matchDomainsNoSearch = false
|
dnsSettings.matchDomainsNoSearch = false
|
||||||
networkSettings.dnsSettings = dnsSettings
|
networkSettings.dnsSettings = dnsSettings
|
||||||
self.logger.log("[SDLTunnelProviderAdapter] Tun started at network ip: \(netAddress.ipAddress), mask: \(netAddress.maskAddress)", level: .info)
|
SDLLogger.shared.log("[SDLTunnelProviderAdapter] Tun started at network ip: \(netAddress.ipAddress), mask: \(netAddress.maskAddress)", level: .info)
|
||||||
|
|
||||||
let ipv4Settings = NEIPv4Settings(addresses: [netAddress.ipAddress], subnetMasks: [netAddress.maskAddress])
|
let ipv4Settings = NEIPv4Settings(addresses: [netAddress.ipAddress], subnetMasks: [netAddress.maskAddress])
|
||||||
// 设置路由表
|
// 设置路由表
|
||||||
|
|||||||
@ -62,7 +62,7 @@ struct NetworkDisconnctedView: View {
|
|||||||
maskLen: 24,
|
maskLen: 24,
|
||||||
accessToken: "accessToken1234",
|
accessToken: "accessToken1234",
|
||||||
hostname: "mysql",
|
hostname: "mysql",
|
||||||
noticePort: 123456)
|
noticePort: 1234)
|
||||||
// token存在则优先使用token
|
// token存在则优先使用token
|
||||||
try await VPNManager.shared.enableVpn(options: options!)
|
try await VPNManager.shared.enableVpn(options: options!)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user