add debug

This commit is contained in:
anlicheng 2026-04-10 16:51:29 +08:00
parent 20a339f6ff
commit 68e163f0f6
4 changed files with 96 additions and 98 deletions

View File

@ -108,12 +108,8 @@ actor SDLContextActor {
// arp // arp
await self.arpServer.start() await self.arpServer.start()
await self.startDnsClient() await self.startDnsClient()
SDLLogger.shared.log("[SDLContext] dns started!!!!")
await self.startDnsLocalClient() await self.startDnsLocalClient()
SDLLogger.shared.log("[SDLContext] dns Local running!!!!")
await self.supervisor.addWorker(name: "quicClient") { await self.supervisor.addWorker(name: "quicClient") {
SDLLogger.shared.log("[SDLContext] try start quicClient") SDLLogger.shared.log("[SDLContext] try start quicClient")
@ -170,13 +166,14 @@ actor SDLContextActor {
// //
await self.startRegisterLoop() await self.startRegisterLoop()
case .pong: case .pong:
SDLLogger.shared.log("[SDLContext] quic pong") //SDLLogger.shared.log("[SDLContext] quic pong")
()
case .registerSuperAck(let registerSuperAck): case .registerSuperAck(let registerSuperAck):
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck) await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
case .registerSuperNak(let registerSuperNak): case .registerSuperNak(let registerSuperNak):
await self.handleRegisterSuperNak(nakPacket: registerSuperNak) await self.handleRegisterSuperNak(nakPacket: registerSuperNak)
case .peerInfo(let peerInfo): case .peerInfo(let peerInfo):
SDLLogger.shared.log("[SDLContext] peer message: \(peerInfo)") //SDLLogger.shared.log("[SDLContext] peer message: \(peerInfo)")
await self.puncherActor.handlePeerInfo(using: self.udpHole, peerInfo: peerInfo) await self.puncherActor.handlePeerInfo(using: self.udpHole, peerInfo: peerInfo)
case .event(let event): case .event(let event):
await self.handleEvent(event: event) await self.handleEvent(event: event)
@ -184,7 +181,7 @@ actor SDLContextActor {
// //
await self.identifyStore.applyPolicyResponse(policyResponse) await self.identifyStore.applyPolicyResponse(policyResponse)
case .arpResponse(let arpResponse): case .arpResponse(let arpResponse):
SDLLogger.shared.log("[SDLContext] get arp response: \(arpResponse)") //SDLLogger.shared.log("[SDLContext] get arp response: \(arpResponse)")
await self.arpServer.handleArpResponse(arpResponse: arpResponse) await self.arpServer.handleArpResponse(arpResponse: arpResponse)
} }
} }
@ -323,11 +320,11 @@ actor SDLContextActor {
} catch let err { } catch let err {
SDLLogger.shared.log("[SDLContext] handleHoleData get err: \(err)") SDLLogger.shared.log("[SDLContext] handleHoleData get err: \(err)")
} }
case .stunReply(let stunReply): case .stunReply(_):
SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)") //SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)")
()
} }
} }
SDLLogger.shared.log("[SDLContext] udp signalTask cancel") SDLLogger.shared.log("[SDLContext] udp signalTask cancel")
} }
@ -335,7 +332,7 @@ actor SDLContextActor {
self.udpHoleWorkers = [pingTask, messageTask] self.udpHoleWorkers = [pingTask, messageTask]
// nat // nat
self.probeNatType() await self.probeNatType()
return udpHole return udpHole
} }
@ -439,7 +436,6 @@ actor SDLContextActor {
let regionId = registerSuperAck.regionID let regionId = registerSuperAck.regionID
self.sessionToken = registerSuperAck.sessionToken self.sessionToken = registerSuperAck.sessionToken
SDLLogger.shared.log("[SDLContext] registerSuperAck use algorithm \(algorithm)", level: .error)
switch algorithm { switch algorithm {
case "aes": case "aes":
self.dataCipher = CCAESChiper(key: key) self.dataCipher = CCAESChiper(key: key)
@ -451,7 +447,7 @@ actor SDLContextActor {
return return
} }
SDLLogger.shared.log("[SDLContext] get registerSuperAck, aes_key len: \(key.count)", level: .info) SDLLogger.shared.log("[SDLContext] registerSuperAck, use algorithm \(algorithm), key len: \(key.count)", level: .info)
// tun // tun
do { do {
try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer) try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer)
@ -535,7 +531,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
SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug) SDLLogger.shared.log("[SDLContext] 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 {
@ -550,7 +546,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 {
SDLLogger.shared.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)
} }
} }
@ -561,7 +557,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 {
SDLLogger.shared.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)
} }
} }
@ -612,9 +608,14 @@ actor SDLContextActor {
let ruleMap = identitySnapshot.lookup(data.identityID) let ruleMap = identitySnapshot.lookup(data.identityID)
if true || self.checkPolicy(ipPacket: ipPacket, ruleMap: ruleMap) { if true || self.checkPolicy(ipPacket: ipPacket, ruleMap: ruleMap) {
// debug
if ipPacket.header.source == 168428037 {
SDLLogger.sharedDebug.log("data: \(Array(ipPacket.data)), len: \(ipPacket.data.count)")
}
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2) let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([packet]) self.provider.packetFlow.writePacketObjects([packet])
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), allow", level: .debug) SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), allow, data count: \(ipPacket.data.count)", level: .debug)
} }
else { else {
SDLLogger.shared.log("[SDLContext] not found identity: \(data.identityID) ruleMap", level: .debug) SDLLogger.shared.log("[SDLContext] not found identity: \(data.identityID) ruleMap", level: .debug)
@ -694,81 +695,77 @@ actor SDLContextActor {
// //
private func dealTunPacket(packet: IPPacket) async { private func dealTunPacket(packet: IPPacket) async {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
if DNSHelper.isDnsRequestPacket(ipPacket: packet) {
// offset, dnsudp
if case .udp(let udpPacket) = packet.transportPacket {
let payloadOffset = udpPacket.payloadOffset
let dnsParser = DNSParser(data: packet.data, offset: payloadOffset)
if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
// ip
if name.contains(self.config.networkAddress.networkDomain) {
SDLLogger.shared.log("[Tun] get cloud dns request: \(name)")
self.dnsClient?.forward(ipPacketData: packet.data)
}
// dnsudppayload
else if packet.data.count > payloadOffset {
//
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
SDLLogger.shared.log("[Tun] get local dns request: \(name)")
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID, clientIP: packet.header.source, clientPort: udpPacket.srcPort, createdAt: Date())
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload)
}
}
}
self.dnsClient?.forward(ipPacketData: packet.data)
return
} else {
return
}
let dstIp = packet.header.destination let dstIp = packet.header.destination
// , ip // , ip
if dstIp == networkAddr.ip { if dstIp == networkAddr.ip {
let nePacket = NEPacket(data: packet.data, protocolFamily: 2) let nePacket = NEPacket(data: packet.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([nePacket]) self.provider.packetFlow.writePacketObjects([nePacket])
return
} }
// dns
// FlowSession else if DNSHelper.isDnsRequestPacket(ipPacket: packet), case .udp(let udpPacket) = packet.transportPacket {
// // offset, dnsudp
if let flowSession = packet.flowSession() { let payloadOffset = udpPacket.payloadOffset
self.flowSessionManager.updateSession(flowSession) let dnsParser = DNSParser(data: packet.data, offset: payloadOffset)
SDLLogger.shared.log("[SDLContext] flow_session: \(flowSession)", level: .debug) if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
} // ip
if name.contains(self.config.networkAddress.networkDomain) {
// SDLLogger.shared.log("[SDLContext] get cloud dns request: \(name)")
// ip self.dnsClient?.forward(ipPacketData: packet.data)
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) { }
// arpmac // dnsudppayload
if let dstMac = await self.arpServer.query(ip: dstIp) { else {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", level: .debug) //
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
} SDLLogger.shared.log("[SDLContext] get local dns request: \(name)")
else {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug) let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID,
// // arp广 clientIP: packet.header.source,
// let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp) clientPort: udpPacket.srcPort,
// await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal()) createdAt: Date())
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload)
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient) }
} }
} }
// else {
// // FlowSession
else if let exitNode = config.exitNode { //
let exitNodeIp: UInt32 = exitNode.exitNodeIp if let flowSession = packet.flowSession() {
SDLLogger.shared.log("[SDLContext] global dstIp: \(packet.header.destination.asIpAddress())", level: .debug) self.flowSessionManager.updateSession(flowSession)
// arpmac //SDLLogger.shared.log("[SDLContext] flow_session: \(flowSession)", level: .debug)
if let dstMac = await self.arpServer.query(ip: exitNodeIp) {
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
} }
else {
try? await self.arpServer.arpRequest(targetIp: exitNodeIp, use: self.quicClient) //
// ip
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) {
// arpmac
if let dstMac = await self.arpServer.query(ip: dstIp) {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", level: .debug)
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
}
else {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
// // arp广
// let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
// await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
}
}
//
//
else if let exitNode = config.exitNode {
let exitNodeIp: UInt32 = exitNode.exitNodeIp
SDLLogger.shared.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())", level: .debug)
// arpmac
if let dstMac = await self.arpServer.query(ip: exitNodeIp) {
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
}
else {
try? await self.arpServer.arpRequest(targetIp: exitNodeIp, use: self.quicClient)
}
} }
} }
} }
private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async { private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async {
@ -857,15 +854,13 @@ actor SDLContextActor {
} }
// //
private func probeNatType() { private func probeNatType() async {
Task { guard let udpHole = self.udpHole else {
guard let udpHole = self.udpHole else { return
return
}
// nat
self.natType = await self.proberActor.probeNatType(using: udpHole)
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)")
} }
// nat
self.natType = await self.proberActor.probeNatType(using: udpHole)
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)")
} }
private func spawnLoop(_ body: @escaping () async throws -> Void) -> Task<Void, Never> { private func spawnLoop(_ body: @escaping () async throws -> Void) -> Task<Void, Never> {

View File

@ -70,7 +70,6 @@ final class DNSLocalClient {
/// 广 /// 广
func query(tracker: DNSTracker, dnsPayload: Data) { func query(tracker: DNSTracker, dnsPayload: Data) {
locker.lock() locker.lock()
SDLLogger.shared.log("[DNSLocalClient] query transId: \(tracker.transactionID)")
self.trackers[tracker.transactionID, default: []].append(tracker) self.trackers[tracker.transactionID, default: []].append(tracker)
locker.unlock() locker.unlock()
@ -85,7 +84,6 @@ final class DNSLocalClient {
// AsyncStream // AsyncStream
// yield // yield
// //
SDLLogger.shared.log("[DNSLocalClient] get response data: \(data.count)")
self?.handleResponse(data: data) self?.handleResponse(data: data)
} }
@ -106,8 +104,6 @@ final class DNSLocalClient {
let items = self.trackers.removeValue(forKey: tranId) let items = self.trackers.removeValue(forKey: tranId)
locker.unlock() locker.unlock()
SDLLogger.shared.log("[DNSLocalClient] transId: \(tranId) get response items: \(items?.count)")
items?.forEach { tracker in items?.forEach { tracker in
let packet = Self.createDNSResponse( let packet = Self.createDNSResponse(
payload: data, payload: data,

View File

@ -8,6 +8,12 @@ import Foundation
import os import os
public class SDLLogger: @unchecked Sendable { public class SDLLogger: @unchecked Sendable {
public enum Subsystem: String {
case punchnet = "com.jihe.punchnet"
case debug = "com.jihe.punchnetdebug"
}
public enum Level: Int8, CustomStringConvertible { public enum Level: Int8, CustomStringConvertible {
case debug = 0 case debug = 0
case info = 1 case info = 1
@ -28,14 +34,15 @@ public class SDLLogger: @unchecked Sendable {
} }
} }
static let shared = SDLLogger(level: .debug) static let shared = SDLLogger(level: .debug, subsystem: .punchnet)
static let sharedDebug = SDLLogger(level: .debug, subsystem: .debug)
private let level: Level private let level: Level
private let log: Logger private let log: Logger
private init(level: Level) { private init(level: Level, subsystem: Subsystem) {
self.level = level self.level = level
self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet") self.log = Logger(subsystem: subsystem.rawValue, category: "punchnet")
} }
public func log(_ message: String, level: Level = .debug) { public func log(_ message: String, level: Level = .debug) {

View File

@ -81,7 +81,7 @@ final class SDLUDPHole: ChannelInboundHandler {
let remoteAddress = envelope.remoteAddress let remoteAddress = envelope.remoteAddress
if let rawBytes = buffer.getBytes(at: buffer.readerIndex, length: buffer.readableBytes) { if let rawBytes = buffer.getBytes(at: buffer.readerIndex, length: buffer.readableBytes) {
SDLLogger.shared.log("[SDLUDPHole] get raw bytes: \(rawBytes), from: \(remoteAddress)") SDLLogger.shared.log("[SDLUDPHole] get raw bytes: \(rawBytes.count), from: \(remoteAddress)")
} }
do { do {