From abfc35aa7d5934e29e4a8714f5cd73b123d979df Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 7 Jan 2026 17:58:19 +0800 Subject: [PATCH] fix dns client --- .../SDLDNSClientActor.swift} | 4 +-- .../Actors/SDLTunnelProviderActor.swift | 4 ++- Tun/Punchnet/SDLContext.swift | 25 +++++++++++-------- 3 files changed, 19 insertions(+), 14 deletions(-) rename Tun/Punchnet/{DNSClient.swift => Actors/SDLDNSClientActor.swift} (98%) diff --git a/Tun/Punchnet/DNSClient.swift b/Tun/Punchnet/Actors/SDLDNSClientActor.swift similarity index 98% rename from Tun/Punchnet/DNSClient.swift rename to Tun/Punchnet/Actors/SDLDNSClientActor.swift index 13ff076..aec9151 100644 --- a/Tun/Punchnet/DNSClient.swift +++ b/Tun/Punchnet/Actors/SDLDNSClientActor.swift @@ -11,7 +11,7 @@ import NIOPosix // 处理和sn-server服务器之间的通讯 @available(macOS 14, *) -actor DNSClient { +actor SDLDNSClientActor { private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private let asyncChannel: NIOAsyncChannel, AddressedEnvelope> private let (writeStream, writeContinuation) = AsyncStream.makeStream(of: Data.self, bufferingPolicy: .unbounded) @@ -101,7 +101,7 @@ actor DNSClient { } -extension DNSClient { +extension SDLDNSClientActor { struct Helper { static let dnsServer: String = "100.100.100.100" diff --git a/Tun/Punchnet/Actors/SDLTunnelProviderActor.swift b/Tun/Punchnet/Actors/SDLTunnelProviderActor.swift index fa03a88..b5ffbad 100644 --- a/Tun/Punchnet/Actors/SDLTunnelProviderActor.swift +++ b/Tun/Punchnet/Actors/SDLTunnelProviderActor.swift @@ -44,7 +44,7 @@ actor SDLTunnelProviderActor { } // 网络改变时需要重新配置网络信息 - func setNetworkSettings(devAddr: SDLDevAddr, dnsServer: String) async throws { + func setNetworkSettings(devAddr: SDLDevAddr, dnsServer: String) async throws -> String { let netAddress = SDLNetAddress(ip: devAddr.netAddr, maskLen: UInt8(devAddr.netBitLen)) let routes = [ Route(dstAddress: netAddress.networkAddress, subnetMask: netAddress.maskAddress), @@ -74,6 +74,8 @@ actor SDLTunnelProviderActor { networkSettings.ipv4Settings = ipv4Settings // 网卡配置设置必须成功 try await self.provider.setTunnelNetworkSettings(networkSettings) + + return netAddress.ipAddress } // 开始读取数据, 用单独的线程处理packetFlow diff --git a/Tun/Punchnet/SDLContext.swift b/Tun/Punchnet/SDLContext.swift index 13c314a..87f1e9e 100644 --- a/Tun/Punchnet/SDLContext.swift +++ b/Tun/Punchnet/SDLContext.swift @@ -52,9 +52,8 @@ public class SDLContext { var superClientActor: SDLSuperClientActor? var providerActor: SDLTunnelProviderActor var puncherActor: SDLPuncherActor - // dns的client对象 - var dnsClient: DNSClient? + var dnsClientActor: SDLDNSClientActor? // 数据包读取任务 private var readTask: Task<(), Never>? @@ -258,7 +257,7 @@ public class SDLContext { private func startDnsClient() async throws { let remoteDnsServer = config.remoteDnsServer let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353) - self.dnsClient = try await DNSClient(dnsServerAddress: dnsSocketAddress, logger: self.logger) + self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger) try await withThrowingTaskGroup(of: Void.self) { group in defer { @@ -266,11 +265,11 @@ public class SDLContext { } group.addTask { - try await self.dnsClient?.start() + try await self.dnsClientActor?.start() } group.addTask { - if let packetFlow = self.dnsClient?.packetFlow { + if let packetFlow = self.dnsClientActor?.packetFlow { for await packet in packetFlow { let nePacket = NEPacket(data: packet, protocolFamily: 2) await self.providerActor.writePackets(packets: [nePacket]) @@ -320,7 +319,9 @@ public class SDLContext { // 服务器分配的tun网卡信息 do { - try await self.providerActor.setNetworkSettings(devAddr: self.devAddr, dnsServer: DNSClient.Helper.dnsServer) + let ipAddress = try await self.providerActor.setNetworkSettings(devAddr: self.devAddr, dnsServer: SDLDNSClientActor.Helper.dnsServer) + await self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress)) + self.startReader() } catch let err { self.logger.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error) @@ -386,7 +387,9 @@ public class SDLContext { // 服务器分配的tun网卡信息 do { - try await self.providerActor.setNetworkSettings(devAddr: self.devAddr, dnsServer: DNSClient.Helper.dnsServer) + let ipAddress = try await self.providerActor.setNetworkSettings(devAddr: self.devAddr, dnsServer: SDLDNSClientActor.Helper.dnsServer) + await self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress)) + self.startReader() } catch let err { self.logger.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error) @@ -536,10 +539,10 @@ public class SDLContext { return } - if DNSClient.Helper.isDnsRequestPacket(ipPacket: packet) { + if SDLDNSClientActor.Helper.isDnsRequestPacket(ipPacket: packet) { let destIp = packet.header.destination_ip - NSLog("destIp: \(destIp), int: \(packet.header.destination)") - await self.dnsClient?.forward(ipPacket: packet) + self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination)", level: .debug) + await self.dnsClientActor?.forward(ipPacket: packet) } else { Task.detached { @@ -604,7 +607,7 @@ public class SDLContext { self.rootTask?.cancel() self.udpHoleActor = nil self.superClientActor = nil - self.dnsClient = nil + self.dnsClientActor = nil } // 获取mac地址