fix dns转发
This commit is contained in:
parent
5d192332b9
commit
af140f7da6
@ -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解析的, dns查询必然是udp包
|
||||
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)
|
||||
}
|
||||
// 通过本地的dns解析,发送的是udp的payload部分
|
||||
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解析的, dns查询必然是udp包
|
||||
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())")
|
||||
// 查找arp缓存中是否有目标mac地址
|
||||
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)
|
||||
}
|
||||
}
|
||||
// 通过本地的dns解析,发送的是udp的payload部分
|
||||
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)
|
||||
// 查找arp缓存中是否有目标mac地址
|
||||
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())")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user