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 {
let networkAddr = self.config.networkAddress
let dstIp = packet.header.destination
@ -704,27 +704,39 @@ actor SDLContextActor {
self.provider.packetFlow.writePacketObjects([nePacket])
}
// dns
else if DNSHelper.isDnsRequestPacket(ipPacket: packet), case .udp(let udpPacket) = packet.transportPacket {
// offset, dnsudp
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.log("[SDLContext] get cloud dns request: \(name)")
self.dnsClient?.forward(ipPacketData: packet.data)
}
// dnsudppayload
else {
//
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
SDLLogger.log("[SDLContext] 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)
else if DNSHelper.isDnsRequestPacket(ipPacket: packet) {
if case .udp(let udpPacket) = packet.transportPacket {
// offset, dnsudp
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.log("[SDLContext] get cloud dns request: \(name)")
self.dnsClient?.forward(ipPacketData: packet.data)
}
//
else if let exitNode = config.exitNode {
let exitNodeIp = exitNode.exitNodeIp
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
// 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)
}
}
// 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
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
if let dstMac = await self.arpServer.query(ip: dstIp) {
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)
}
}
//
//
// ,
else if let exitNode = config.exitNode {
let exitNodeIp: UInt32 = exitNode.exitNodeIp
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")