fix dns转发

This commit is contained in:
anlicheng 2026-04-13 16:25:15 +08:00
parent 5d192332b9
commit af140f7da6

View File

@ -693,7 +693,7 @@ actor SDLContextActor {
} }
} }
// // , Tun
private func dealTunPacket(packet: IPPacket) async { private func dealTunPacket(packet: IPPacket) async {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
let dstIp = packet.header.destination let dstIp = packet.header.destination
@ -704,27 +704,39 @@ actor SDLContextActor {
self.provider.packetFlow.writePacketObjects([nePacket]) self.provider.packetFlow.writePacketObjects([nePacket])
} }
// dns // dns
else if DNSHelper.isDnsRequestPacket(ipPacket: packet), case .udp(let udpPacket) = packet.transportPacket { else if DNSHelper.isDnsRequestPacket(ipPacket: packet) {
// offset, dnsudp if case .udp(let udpPacket) = packet.transportPacket {
let payloadOffset = udpPacket.payloadOffset // offset, dnsudp
let dnsParser = DNSParser(data: packet.data, offset: payloadOffset) let payloadOffset = udpPacket.payloadOffset
if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name { let dnsParser = DNSParser(data: packet.data, offset: payloadOffset)
// ip if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
if name.contains(self.config.networkAddress.networkDomain) { // ip
SDLLogger.log("[SDLContext] get cloud dns request: \(name)") if name.contains(self.config.networkAddress.networkDomain) {
self.dnsClient?.forward(ipPacketData: packet.data) SDLLogger.log("[SDLContext] get cloud dns request: \(name)")
} self.dnsClient?.forward(ipPacketData: packet.data)
// dnsudppayload }
else { //
// else if let exitNode = config.exitNode {
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count]) let exitNodeIp = exitNode.exitNodeIp
SDLLogger.log("[SDLContext] get local dns request: \(name)") SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
// arpmac
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID, if let dstMac = await self.arpServer.query(ip: exitNodeIp) {
clientIP: packet.header.source, await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
clientPort: udpPacket.srcPort, }
createdAt: Date()) else {
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload) try? await self.arpServer.arpRequest(targetIp: exitNodeIp, use: self.quicClient)
}
}
// dnsudppayload
else {
SDLLogger.log("[SDLContext] get local dns request: \(name)")
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID,
clientIP: packet.header.source,
clientPort: udpPacket.srcPort,
createdAt: Date())
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload)
}
} }
} }
} }
@ -739,7 +751,6 @@ actor SDLContextActor {
// //
// ip // ip
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) { if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) {
SDLLogger.log("[SDLContext] read Tun packet step 3, data: \(Array(packet.data))", for: .trace)
// arpmac // arpmac
if let dstMac = await self.arpServer.query(ip: dstIp) { if let dstMac = await self.arpServer.query(ip: dstIp) {
SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace) SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace)
@ -754,8 +765,7 @@ actor SDLContextActor {
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient) try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
} }
} }
// // ,
//
else if let exitNode = config.exitNode { else if let exitNode = config.exitNode {
let exitNodeIp: UInt32 = exitNode.exitNodeIp let exitNodeIp: UInt32 = exitNode.exitNodeIp
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())") SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")